国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

雪花算法 ID 重復(fù)了?慘痛教訓(xùn):請勿輕易造輪子!

0
分享至

Java精選面試題(微信小程序):5000+道面試題和選擇題,包含Java基礎(chǔ)、并發(fā)、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構(gòu)設(shè)計(jì)、大廠真題等,在線隨時(shí)刷題!

最近我們線上系統(tǒng)發(fā)生了一起嚴(yán)重事故:訂單號/流水號出現(xiàn)了重復(fù),影響了核心業(yè)務(wù)流程。最終定位到根源:一個自研的二方包雪花算法ID生成器出現(xiàn)了問題。

下面我們來回顧一下雪花算法的標(biāo)準(zhǔn)結(jié)構(gòu),分析問題出在哪,并總結(jié)一些通用的設(shè)計(jì)建議。

一、標(biāo)準(zhǔn)雪花算法(Snowflake)

標(biāo)準(zhǔn)的Snowflake ID由一個64位long型整數(shù)構(gòu)成:

+----------------------------------------------------------------------------------------------------+

|1Bit |41Bits 時(shí)間戳 |5Bits 數(shù)據(jù)中心ID |5Bits 機(jī)器ID |12Bits 序列號 |

+----------------------------------------------------------------------------------------------------+

  • 1位符號位:始終為0,確保生成正數(shù)。

  • 41位時(shí)間戳:記錄與固定起始時(shí)間的毫秒差,可支持約69年。

  • 10位機(jī)器ID:用于標(biāo)識不同節(jié)點(diǎn)。

  • 12位序列號:在同一毫秒內(nèi)生成多個ID時(shí)使用,最多支持每毫秒生成4096個ID。

優(yōu)點(diǎn):

  • 高性能生成唯一ID,按時(shí)間有序,適用于分布式環(huán)境。

二、我們的“定制版”雪花算法:問題在哪?

我們使用的二方包雪花算法結(jié)構(gòu)如下(根據(jù)排查推測):

+----------------------------------------------------------------------------------------------------+

|31Bits 時(shí)間戳Delta |13Bits 數(shù)據(jù)中心ID |4Bits 工作ID |8Bits 業(yè)務(wù)ID |8Bits 序列號 |

+----------------------------------------------------------------------------------------------------+

看起來字段豐富,但存在嚴(yán)重問題:

1. 時(shí)間戳僅保留31位,最多支持24.85天!

  • 左移33位后只用31位時(shí)間戳,

  • 超過 2312^{31}231 毫秒后開始循環(huán),

  • 我們自定義的起始時(shí)間是2018年,2025年時(shí)早已繞了無數(shù)圈。

2. BusinessId 用的是 IP 最后一段

  • 使用的IPy用點(diǎn)分隔的最后一位,即192.168.0.1的1,極容易重復(fù)。

3. WorkId 和 DataCenterId 未配置,全為0

  • 相當(dāng)于所有實(shí)例共享同一節(jié)點(diǎn)標(biāo)識,唯一性形同虛設(shè)。

  • 最終結(jié)果:時(shí)間輪回 + IP沖突 + 序列重復(fù),ID徹底撞車。

三、教訓(xùn)總結(jié)

通用組件不建議自研

雪花算法涉及時(shí)鐘回?fù)?、位運(yùn)算、分布式協(xié)調(diào)等關(guān)鍵細(xì)節(jié),成熟組件更穩(wěn)妥。

不盲信二方包

無論誰寫的代碼,都要看清實(shí)現(xiàn)邏輯,理解其唯一性保障機(jī)制。

合理設(shè)置機(jī)器ID

靠IP后綴太脆弱,建議集中規(guī)劃,統(tǒng)一分配Worker ID和DataCenter ID。

提前覆蓋邊界場景

模擬長時(shí)間運(yùn)行、序列號溢出、時(shí)間回?fù)艿葮O端情況,確保系統(tǒng)穩(wěn)健。

四、推薦做法

使用成熟的開源實(shí)現(xiàn),如 Hutool、Baomidou 等:

// Hutool 示例

Snowflake snowflake = IdUtil.getSnowflake(1,1);

longid = snowflake.nextId();

// Baomidou 示例(支持從 IP/MAC 自動推導(dǎo),也可手動指定)

DefaultIdentifierGenerator generator =newDefaultIdentifierGenerator(1,1);// workerId=1, dataCenterId=1

longid = generator.nextId("user");

對于中大型系統(tǒng),DataCenterId 一般用來標(biāo)識不同的機(jī)房或者 AZ (Availability Zone)。

WorkerId 的配置策略可以根據(jù)系統(tǒng)規(guī)模逐步演進(jìn):

  • 簡單方式:通過配置文件手動指定。這種方式配置簡便,適用于開發(fā)環(huán)境或單機(jī)部署。

  • 標(biāo)準(zhǔn)方式:將 IP 與端口號(或進(jìn)程號)拼接后進(jìn)行哈希,再對 WorkerId 總數(shù)取模。具備一定自動化能力,不依賴外部系統(tǒng),適用于中小規(guī)模部署。

  • 中級方案:依賴注冊中心(如 Eureka、Nacos),在服務(wù)注冊時(shí)分配編號,結(jié)合服務(wù)ID保障唯一性。

  • 高級方案:使用 Redis、Zookeeper 等集中協(xié)調(diào) WorkerId 分配與釋放,支持動態(tài)擴(kuò)容、避免沖突。

隨著系統(tǒng)規(guī)模擴(kuò)大,推薦逐步引入更復(fù)雜但更穩(wěn)妥的機(jī)制,避免一開始就過度設(shè)計(jì)。

五、其它建議:不要將業(yè)務(wù)標(biāo)志拼入ID中

有時(shí)我們?yōu)榱舜_保唯一性,會試圖將業(yè)務(wù)信息(如類型前綴、模塊編號)拼接進(jìn)ID。但這種做法會帶來一系列問題:

  • 會導(dǎo)致 ID 非全數(shù)字,失去原本按時(shí)間遞增的排序特性,影響數(shù)據(jù)庫索引效率;

  • ID長度變得不規(guī)則或偏長,可能增加存儲成本,也會影響日志展示、用戶體驗(yàn);

  • 若業(yè)務(wù)字段含義變動,還可能造成數(shù)據(jù)兼容性問題。

更穩(wěn)妥的做法是將業(yè)務(wù)字段單獨(dú)存儲,ID僅用于唯一標(biāo)識和排序。

六、結(jié)語

別為造輪子而造輪子,尤其在通用組件上,不可抱僥幸心理。

如果你也有雪花算法的踩坑經(jīng)驗(yàn),歡迎交流分享!

作者:MrWho

來源:https://juejin.cn/post/7507203999102648360

公眾號“Java精選”所發(fā)表內(nèi)容注明來源的,版權(quán)歸原出處所有(無法查證版權(quán)的或者未注明出處的均來自網(wǎng)絡(luò),系轉(zhuǎn)載,轉(zhuǎn)載的目的在于傳遞更多信息,版權(quán)屬于原作者。如有侵權(quán),請聯(lián)系,筆者會第一時(shí)間刪除處理!

最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號Java精選,回復(fù)“加群”,即可入群!

文章有幫助的話,點(diǎn)在看,轉(zhuǎn)發(fā)吧!

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
被曝生下畸形兒傳聞僅1月,闞清子官宣喜訊,連發(fā)三文表明態(tài)度

被曝生下畸形兒傳聞僅1月,闞清子官宣喜訊,連發(fā)三文表明態(tài)度

一口娛樂
2026-01-29 09:31:09
已確認(rèn),浙江有大到暴雪!今晚變天

已確認(rèn),浙江有大到暴雪!今晚變天

魯中晨報(bào)
2026-01-29 13:39:09
不敢置信!女子十二樂坊成員直播養(yǎng)不活自己,一晚上打賞不到3000

不敢置信!女子十二樂坊成員直播養(yǎng)不活自己,一晚上打賞不到3000

云中浮生
2026-01-24 21:37:46
奇葩!35歲女子4年不回家,母親來探望卻被懟,女子:就當(dāng)我死了

奇葩!35歲女子4年不回家,母親來探望卻被懟,女子:就當(dāng)我死了

娛樂帝皇丸
2026-01-28 15:18:51
16歲武漢男生凌晨離家,失聯(lián)超70小時(shí), 父親:未帶手機(jī)現(xiàn)金,最后出現(xiàn)在橋上不見蹤跡

16歲武漢男生凌晨離家,失聯(lián)超70小時(shí), 父親:未帶手機(jī)現(xiàn)金,最后出現(xiàn)在橋上不見蹤跡

大風(fēng)新聞
2026-01-29 13:53:22
人民日報(bào)怒批!炫富、偷稅749萬、跑國外,現(xiàn)又來“割內(nèi)地韭菜”

人民日報(bào)怒批!炫富、偷稅749萬、跑國外,現(xiàn)又來“割內(nèi)地韭菜”

小熊侃史
2026-01-18 07:20:09
港股地產(chǎn)股大漲,融創(chuàng)中國漲超30%

港股地產(chǎn)股大漲,融創(chuàng)中國漲超30%

每日經(jīng)濟(jì)新聞
2026-01-29 11:39:06
外交部:繼續(xù)深化國際執(zhí)法合作 加大力度打擊網(wǎng)賭電詐

外交部:繼續(xù)深化國際執(zhí)法合作 加大力度打擊網(wǎng)賭電詐

財(cái)聯(lián)社
2026-01-29 15:26:24
尼帕病毒來勢洶洶,建議:每家最好備6樣?xùn)|西,關(guān)鍵時(shí)刻能救命呢

尼帕病毒來勢洶洶,建議:每家最好備6樣?xùn)|西,關(guān)鍵時(shí)刻能救命呢

現(xiàn)代小青青慕慕
2026-01-28 08:59:53
阿富汗的鍋,拜登不背!

阿富汗的鍋,拜登不背!

山河路口
2026-01-28 23:12:39
心理學(xué)上有一個詞叫:梅拉賓法則(搞好人際關(guān)系最好的辦法)

心理學(xué)上有一個詞叫:梅拉賓法則(搞好人際關(guān)系最好的辦法)

經(jīng)濟(jì)觀察報(bào)
2025-09-01 10:06:25
1971年,劉思齊蒙冤入獄后向毛主席求助,毛澤東作出:娃娃們無罪

1971年,劉思齊蒙冤入獄后向毛主席求助,毛澤東作出:娃娃們無罪

史海孤雁
2026-01-27 18:02:17
瞞不住了!美媒:美軍高官已進(jìn)臺島指揮導(dǎo)彈戰(zhàn),戰(zhàn)時(shí)先炸福建沿海

瞞不住了!美媒:美軍高官已進(jìn)臺島指揮導(dǎo)彈戰(zhàn),戰(zhàn)時(shí)先炸福建沿海

史智文道
2026-01-29 16:14:14
要打就打痛!中國手段已升級,日本:中方不批準(zhǔn)駐重慶總領(lǐng)事任命

要打就打痛!中國手段已升級,日本:中方不批準(zhǔn)駐重慶總領(lǐng)事任命

通文知史
2026-01-28 14:30:03
太頂了!明明什么都沒露,卻性感得要命!

太頂了!明明什么都沒露,卻性感得要命!

貴圈真亂
2025-12-20 12:02:06
最新傷勢情況曝光,德約科維奇直言:對辛納絕不舉白旗

最新傷勢情況曝光,德約科維奇直言:對辛納絕不舉白旗

體育妞世界
2026-01-29 12:38:11
起風(fēng)了!加拿大已改口,禁止與中國簽協(xié)定,65萬噸油菜籽白買了?

起風(fēng)了!加拿大已改口,禁止與中國簽協(xié)定,65萬噸油菜籽白買了?

墨印齋
2026-01-29 11:47:54
加快男性衰老的因素:喝酒僅第5,排在第1的,很多男性還沒發(fā)現(xiàn)!

加快男性衰老的因素:喝酒僅第5,排在第1的,很多男性還沒發(fā)現(xiàn)!

醫(yī)學(xué)科普匯
2026-01-27 10:41:31
中國人一年少買了10萬輛進(jìn)口寶馬

中國人一年少買了10萬輛進(jìn)口寶馬

第一財(cái)經(jīng)資訊
2026-01-29 10:34:13
1973年,毛主席問楊振寧:萬壽無疆科學(xué)嗎?楊振寧的回答,讓主席笑了

1973年,毛主席問楊振寧:萬壽無疆科學(xué)嗎?楊振寧的回答,讓主席笑了

寄史言志
2026-01-24 17:53:13
2026-01-29 17:15:00
Java精選
Java精選
一場永遠(yuǎn)也演不完的戲
1768文章數(shù) 3859關(guān)注度
往期回顧 全部

科技要聞

周亞輝的AI新賭局:國內(nèi)太卷 出海另起爐灶

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

體育要聞

詹姆斯哭了!騎士視頻致敬41歲超巨

娛樂要聞

張譯不再隱瞞!公開回應(yīng)退圈息影真相

財(cái)經(jīng)要聞

崔東樹:中國汽車未來年銷或達(dá)5000萬輛

汽車要聞

車長超5米還帶后輪轉(zhuǎn)向 比亞迪海豹08/海獅08將亮相

態(tài)度原創(chuàng)

房產(chǎn)
家居
教育
數(shù)碼
藝術(shù)

房產(chǎn)要聞

萬科難眠夜:前董事長郁亮失聯(lián),三筆債券靠深鐵才通過展期

家居要聞

極簡輕奢 家的無限可能

教育要聞

“國家課程落地吳江行動叢書”發(fā)布!聚焦課改前沿,共探育人新路!

數(shù)碼要聞

這種電熱水袋國家早已禁售:別再用了

藝術(shù)要聞

梵高全集(高清350張)震撼……

無障礙瀏覽 進(jìn)入關(guān)懷版