分佈式唯一ID分配問題 PHP使用SnowFlake算法生成唯一ID

snowflake是Twitter開源的分佈式ID生成算法,結果是一個long型的ID。其核心思想是:使用41bit作爲毫秒數,10bit作爲機器的ID(5個bit是數據中心,5個bit的機器ID),12bit作爲毫秒內的流水號(意味着每個節點在每毫秒可以產生 4096 個 ID),最後還有一個符號位,永遠是0。

1.第一位,佔用1bit,其值始終是0,沒有實際作用。

2.時間戳,佔用41bit,精確到毫秒,總共可以容納約140年的時間。

3.工作機器id,佔用10bit,其中高位5bit是數據中心ID(datacenterId),低位5bit是工作節點ID(workerId),做多可以容納1024個節點。

4.序列號,佔用12bit,這個值在同一毫秒同一節點上從0開始不斷累加,最多可以累加到4095。

 

同一毫秒的ID數量 = 1024 X 4096 =  4194304

 

SnowFlake算法的優點:

1.生成ID時不依賴於DB,完全在內存生成,高性能高可用。

2.ID呈趨勢遞增,後續插入索引樹的時候性能較好。

 

SnowFlake算法的缺點:

1、由於SnowFlake強依賴時間戳,所以時間的變動會造成SnowFlake的算法產生錯誤。如果某臺機器的系統時鐘回撥,有可能造成ID衝突,或者ID亂序。在SnowFlake算法中並沒有什麼有效的解法,僅是拋出異常。時鐘回撥涉及兩種情況①實例停機→時鐘回撥→實例重啓→計算ID ②實例運行中→時鐘回撥→計算ID

2、手動配置:另一個就是workerId(機器ID)是需要部署時手動配置,而workerId又不能重複。幾臺實例還好,一旦實例達到一定量級,管理workerId將是一個複雜的操作。

 

Twitter-Snowflake,64位自增ID算法詳解

PHP使用SnowFlake算法生成唯一ID

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章