算法比較簡單,每個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次