京東一面:分布式 ID 生成方案怎么選?寫得太好了!
點擊關注公眾號,Java干貨及時送達
背景
在分布式系統(tǒng)中,經常需要用到全局唯一ID發(fā)生器,標識需要存儲的數(shù)據(jù)。我們需要什么樣的ID生成器?
ID生成器除了是數(shù)據(jù)的唯一標識以外,一般需要在系統(tǒng)中承擔更多的責任,概括起來有以下幾點。另外,分布式系列面試題和答案全部整理好了,微信搜索Java技術棧,在后臺發(fā)送:面試,可以在線閱讀。
唯一性:“全局唯一” vs “業(yè)務唯一”?
時間相關:“秒級” vs “毫秒”?
有序:“粗略有序” vs “精確有序”?
設計細節(jié)
看下業(yè)界如何設計ID發(fā)生器。另外,想成為架構師,這份架構師圖譜建議看看,少走彎路。
SnowFlake
41bit留給毫秒時間,10bit給機器 (MachineID) ,剩下12bit留給Sequence。
Flicker
REPLACE?INTO?Tickets64?(stub)?VALUES?('a');
SELECT?LAST_INSERT_ID();
Flicker啟用了兩臺數(shù)據(jù)庫服務器生成ID來容災,通過區(qū)分auto_increment的起始值和步長來生成奇偶數(shù)的ID。
TicketServer1:
auto-increment-increment?=?2
auto-increment-offset?=?1
TicketServer2:
auto-increment-increment?=?2
auto-increment-offset?=?2
微信
微信使用MySQL持久化未分配的最大ID,每次從DB取一段放到內存分配給調用方。微信的ID生成是嚴格遞增的,意味著同一時間只能有一臺機器提供服務,因此使用仲裁服務+租約機制+路由表,進行容災。

Shopee Feeds 如何生成ID ?
考慮到Feeds業(yè)務的特性,并不需要精確有序,因此我們使用snowflake算法進行ID生成。使用39 (毫秒)+ 5(機器) + 9(seq),來保證ID作為Redis的score不會溢出。最新面試題整理好了,大家可以在Java面試庫小程序在線刷題。
這樣的ID生成器可以使用大約17年,對于一款產品的生命周期來說已經足夠使用。
針對時間回撥產生的問題,因為發(fā)生的頻率極小,所以只需要簡單判斷,如果不滿足 currentMillis <= lastTime,則返回錯誤即可。
作者:cyningsun
來源:www.cyningsun.com/12-26-2018/id-generator.html
(完)
?關注公眾號:Java后端編程,回復下面關鍵字?
要Java學習完整路線,回復??路線?
缺Java入門視頻,回復:?視頻?
要Java面試經驗,回復??面試?
缺Java項目,回復:?項目?
進Java粉絲群:?加群?
PS:如果覺得我的分享不錯,歡迎大家隨手點贊、在看。
(完) 加我"微信"?獲取一份 最新Java面試題資料 請備注:666,不然不通過~
最近好文
1、Mybatis 開發(fā)神器:Fast MyBatis 超好用
3、突發(fā)!Spring Cloud 爆高危漏洞。。趕緊修復!!
最近面試BAT,整理一份面試資料《Java面試BAT通關手冊》,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數(shù)據(jù)庫、數(shù)據(jù)結構等等。 獲取方式:關注公眾號并回復?java?領取,更多內容陸續(xù)奉上。
點分享
點收藏
點點贊
點在看




