雪花算法時間回撥解決方案


雪花算法中的時間回撥問題

什么是時間回撥問題

雪花算法通過時間來即將作為id的區分標准之一,對於同一台id生成機器,它通過時間和序號保證id不重復
當機器出現問題,時間可能回到之前,此時,時間就不能區分
又或者因為閏秒的出現,導致時間回撥

如何解決

方法1 直接拋出異常

不管3X7==21,直接拋出異常
將問題交給人工解決
這種方法也是原始的雪花算法,百度的uid-generator采用的
太過簡單,顯然不好

方法2 延遲等待

這種時間回撥(回跳)或許只出現一次,也許只是機器出現了小問題,所以產生
對於這種場景,沒有必要拋出異常,中斷業務
此時,將當前線程阻塞3ms,之后再獲取時間,看時間是否比上一次請求的時間大
如果大了,說明恢復正常了,則不用管
如果還小,說明真出問題了,則拋出異常,呼喚程序員處理
實際應用項目: 美團的leaf, 用如果時間差在5ms內,則等待 時間差<<1, 然后再判斷

方法3 備用機

當前機器出現問題,則換一台機器
通過高可用來解決該問題

方法4 采用之前最大時間

本身得出時間回撥結論就是通過當前時間和上次最后(大)的時間進行比較
那么此時可以采用上次最大時間的最大序號之后的序號來進行繼續使用
從而保證了唯一性

方法5 追趕時間

可以采取這樣的暴力思路,因為當前的時間回撥了,比之前的時間慢
那么我們便加速追趕時間
首先,不返回id
然后將我們的seq增加比如1024個,然后判斷是否回撥,如果不是,再加1024
當seq超過了12位的maxSeq時,按照雪花算法的邏輯,時間便會進位,借用下個時間的seq
此時就實現了時間的加速
經過若干個加速,則可以實現時間正常


免責聲明!

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



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