Snowflake簡介
Twitter-Snowflake算法產(chǎn)生的背景相當簡單细诸,為了滿足Twitter每秒上萬條消息的請求,每條消息都必須分配一條唯一的id莉兰,這些id還需要一些大致的順序(方便客戶端排序),并且在分布式系統(tǒng)中不同機器產(chǎn)生的id必須不同。各種主鍵ID生成策略對比恬涧,見 常見分布式主鍵ID生成策略
Snowflake算法核心
把41位的時間前綴,10位的節(jié)點標識碴巾,12位的sequence組合在一起溯捆。
除了最高位bit標記為不可用以外,其余三組bit占位均可浮動厦瓢,看具體的業(yè)務(wù)需求而定提揍。默認情況下41bit的時間戳,1970年算起可以支持該算法使用到2038年煮仇,10bit的工作機器id可以支持1024臺機器劳跃,序列號支持1毫秒產(chǎn)生4096個自增序列id。
Snowflake的JAVA實現(xiàn)
Snowflake是Twitter在2010年用Scala語言寫的一套主鍵生成策略欺抗,用Thrift對外發(fā)布主鍵生成服務(wù)售碳,其中依賴了Twitter內(nèi)部的Infrastructure,后來Twitter用Twitter-server代替了Snowflake绞呈,自2012年起就未更新贸人。見Twitter-Snowflake項目地址(Tags:snowflake-2010)
之前寫了一個Java的實現(xiàn),改自網(wǎng)上一個版本:Twitter的分布式自增ID算法Snowflake實現(xiàn)分析及其Java佃声、Php和Python版艺智。后來看到當當網(wǎng)的Sharding-JDBC分庫分表中間件已實現(xiàn)了此算法。就直接在其中添加了一些新特性圾亏,已merge十拣。(具體實現(xiàn),說明文檔)
添加3種IdGenerator實現(xiàn)封拧。
- ZkIdGenerator:通過zookeeper維護workerId。使用時需要添加zookeeper客戶端curator(curator-framework與curator-recipes)依賴夭问,并設(shè)置zkNodes與appName泽西。(將向zookeeper中/snowflake/appName下注冊并節(jié)點,并通過zookeeper動態(tài)維護workerId缰趋。)
- IPIdGenerator:獲取機器的二進制表示的后10位捧杉,設(shè)置成workerId。(列如機器的IP為192.168.1.108秘血,設(shè)置workerId為364味抖。)
- HostNameIdGenerator:根據(jù)機器名最后的數(shù)字編號獲取workerId,如果線上機器命名有統(tǒng)一規(guī)范灰粮,建議使用此種方式(列如機器的HostName為dangdang-db-sharding-dev-12仔涩,會截取最后的編號12作為workerId。)
性能
用筆記本(i7-3632QM 2.2GHz 四核八線程)測試了下粘舟,每秒生成409萬(理論上的峰值)熔脂,CPU占用率18.5%。
參考:
- Twitter-Snowflake柑肴,64位自增ID算法詳解
- Twitter-Snowflake項目地址(Tags:snowflake-2010)
- 常見分布式主鍵ID生成策略
- 當當網(wǎng)的Snowflake(Java)實現(xiàn)使用說明
轉(zhuǎn)載注明出處锤悄,我就不和你計較。
by Donney Young
http://www.reibang.com/p/80e68ae9e3a4