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將是一個複雜的操作。