柚子快報邀請碼778899分享:分布式ID生成方案
柚子快報邀請碼778899分享:分布式ID生成方案
分布式ID的特性
唯一性:確保生成的ID是全網(wǎng)唯一的。有序遞增性:確保生成的ID是對于某個用戶或者業(yè)務(wù)是按一定的數(shù)字有序遞增的。高可用性:確保任何時候都能正確的生成ID。帶時間:ID里面包含時間,一眼掃過去就知道哪天的交易。
分布式ID生成方案
UUID數(shù)據(jù)庫自增ID批量生成IDRedis生成IDTwitter 的 snowflake 算法百度UidGenerator美團(tuán)Leaf
1: UUID 算法的核心思想是結(jié)合機器的網(wǎng)卡、當(dāng)?shù)貢r間、一個隨記數(shù)來生成UUID。 優(yōu)點:本地生成,生成簡單,性能好,沒有高可用風(fēng)險 缺點:長度過長,存儲冗余,且無序不可讀,查詢效率低
2: 數(shù)據(jù)庫自增ID 使用數(shù)據(jù)庫的id自增策略,如 MySQL 的 auto_increment。并且可以使用兩臺數(shù)據(jù)庫分別設(shè)置不同 步長,生成不重復(fù)ID的策略來實現(xiàn)高可用。 優(yōu)點:數(shù)據(jù)庫生成的ID絕對有序,高可用實現(xiàn)方式簡單 缺點:需要獨立部署數(shù)據(jù)庫實例,成本高,有性能瓶頸
3.:批量生成ID 一次按需批量生成多個ID,每次生成都需要訪問數(shù)據(jù)庫,將數(shù)據(jù)庫修改為最大的ID值,并在內(nèi)存中 記錄當(dāng)前值及最大值。 優(yōu)點:避免了每次生成ID都要訪問數(shù)據(jù)庫并帶來壓力,提高性能 缺點:屬于本地生成策略,存在單點故障,服務(wù)重啟造成ID不連續(xù)
4: Redis生成ID Redis的所有命令操作都是單線程的,本身提供像 incr 和 increby 這樣的自增原子命令,所以能保 證生成的 ID 肯定是唯一有序的。 優(yōu)點:不依賴于數(shù)據(jù)庫,靈活方便,且性能優(yōu)于數(shù)據(jù)庫;數(shù)字ID天然排序,對分頁或者需要排 序的結(jié)果很有幫助。 缺點:如果系統(tǒng)中沒有Redis,還需要引入新的組件,增加系統(tǒng)復(fù)雜度;需要編碼和配置的工作 量比較大。 考慮到單節(jié)點的性能瓶頸,可以使用 Redis 集群來獲取更高的吞吐量。假如一個集群中有5臺 Redis??梢猿跏蓟颗_ Redis 的值分別是1, 2, 3, 4, 5,然后步長都是 5。
5.:Twitter的snowflake算法(重點) Twitter 利用 zookeeper 實現(xiàn)了一個全局ID生成的服務(wù) Snowflake
如上圖的所示,Twitter 的 Snowflake 算法由下面幾部分組成:
位符號位: 由于 long 類型在 java 中帶符號的,最高位為符號位,正數(shù)為 0,負(fù)數(shù)為 1,且實際系統(tǒng)中所使用的ID一般都是正數(shù),所以最高位為 0。 41位時間戳(毫秒級): 需要注意的是此處的 41 位時間戳并非存儲當(dāng)前時間的時間戳,而是存儲時間戳的差值(當(dāng)前時間戳 - 起始時間戳),這里的起始時間戳一般是ID生成器開始使用的時間戳,由程序來指定,所以41位毫秒時間戳最多可以使用 (1 << 41) / (1000x60x60x24x365) = 69年 。 10位數(shù)據(jù)機器位: 包括5位數(shù)據(jù)標(biāo)識位和5位機器標(biāo)識位,這10位決定了分布式系統(tǒng)中最多可以部署 1 << 10 = 1024s個節(jié)點。超過這個數(shù)量,生成的ID就有可能會沖突。 12位毫秒內(nèi)的序列: 這 12 位計數(shù)支持每個節(jié)點每毫秒(同一臺機器,同一時刻)最多生成 1 << 12 = 4096個ID加起來剛好64位,為一個Long型。 優(yōu)點:高性能,低延遲,按時間有序,一般不會造成ID碰撞 缺點: 需要獨立的開發(fā)和部署,依賴于機器的時鐘
6:百度UidGenerator UidGenerator是百度開源的分布式ID生成器,基于于snowflake算法的實現(xiàn)。
7:美團(tuán)Leaf Leaf 是美團(tuán)開源的分布式ID生成器,能保證全局唯一性、趨勢遞增、單調(diào)遞增、信息安全,里面也 提到了幾種分布式方案的對比,但也需要依賴關(guān)系數(shù)據(jù)庫、Zookeeper等中間件。
柚子快報邀請碼778899分享:分布式ID生成方案
精彩內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。