snowflake時間回退問題思考


算法比較簡單,每個id-generator負責生成的ID由3部分組成,41位時間戳可以表示到毫秒,10bit worker-id內部可自行划分,比如3位表示IDC,7位表示機器。最后12位是在一毫秒的遞增id,也就是每毫秒算法可以產生2^12 = 4096個id,QPS 400多萬;

snowflake保證1)產生的id分布式系統內全局唯一,2)id趨勢遞增;不是嚴格遞增,因為集群的機器時間不同步問題

 

該算法存在一個最嚴重的問題,是時間回退。比如一台機器A,在t產生一個id,但時鍾被調回了t-15,則再次生成的id存在重復的可能。

思考了一個解決這個問題的方法,

在單一id-generator服務上,每ms生成id時,檢測current_ms,或<= last_ms則等待last_ms-current_ms后,再開始正常服務。這樣若id-generator重啟后依然有問題,因為沒有地方記錄last_ms。並且因為400w的高qps,也無法將其持久化。

我們引入一個第3方,如zookeeper或redis,id-generator服務啟動時atomic increase一個key,並將結果用作worker-id。。。

 

 

oops!貌似不行,只支持重啟1024次


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM