生成分布式序列ID
介紹
在很多分布式系統(tǒng)中睦授,需要生成唯一的id。如在分庫(kù)分表的情況下摔寨,給某個(gè)邏輯表生成唯一id睹逃。既要保證id的唯一性,也需要保證生成id的性能祷肯,而且需要持久化沉填,防止在id生成器重啟之后,造成id不唯一佑笋。
實(shí)現(xiàn)
https://gitee.com/majinliang123/messtin-sequence
思路
使用數(shù)據(jù)庫(kù)記錄下一個(gè)id
當(dāng)想獲取id時(shí)翼闹,需要查詢(xún)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中的值就是你想要的下一個(gè)值蒋纬。但是在這個(gè)過(guò)程中猎荠,可能有多個(gè)id生成器同時(shí)想要生成下一個(gè)id,所以都在更新數(shù)據(jù)庫(kù)蜀备。在我們更新數(shù)據(jù)庫(kù)時(shí)关摇,需要將id更新為id + 1,然后查詢(xún)這個(gè)id值碾阁,id - 1就是我們想要的输虱。這兩步操作必須在同一個(gè)事務(wù)中,使用數(shù)據(jù)庫(kù)的事務(wù)保證id更新過(guò)程中不會(huì)發(fā)生錯(cuò)亂(當(dāng)我們更新id時(shí)脂凶,數(shù)據(jù)庫(kù)會(huì)阻塞其他的更新操作宪睹,直到我們事務(wù)提交,其他的更新操作才能更新id的值蚕钦,這就保證了數(shù)據(jù)庫(kù)中id的正確性)亭病。不應(yīng)該先讀再更新,因?yàn)樵谧x的過(guò)程中嘶居,可能已經(jīng)有其他id生成器更新了這個(gè)值罪帖,導(dǎo)致我們讀的值是過(guò)時(shí)的。
每次獲取多個(gè)id,以防多次更新數(shù)據(jù)庫(kù)
在我們更新數(shù)據(jù)id時(shí)整袁,僅僅id + 1是不夠的菠齿,這會(huì)造成我們頻繁的更新數(shù)據(jù)庫(kù),性能比較低葬项。一般我們每次更新都是id + 500泞当,這樣在當(dāng)前id生成器中就有500個(gè)id可以分配(id ~ id + 500 -1)迹蛤,當(dāng)分配完再去數(shù)據(jù)庫(kù)中取下一批id民珍,必須保證id生成器的線程安全。在id生成器中保存著當(dāng)前id生成器的當(dāng)前id和最大id盗飒,當(dāng)當(dāng)前id達(dá)到最大id嚷量,就取數(shù)據(jù)庫(kù)中獲取下一批。