日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

分布式ID生成器的解决方案总结

發(fā)布時(shí)間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分布式ID生成器的解决方案总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自?分布式ID生成器的解決方案總結(jié)

在互聯(lián)網(wǎng)的業(yè)務(wù)系統(tǒng)中,涉及到各種各樣的ID,如在支付系統(tǒng)中就會(huì)有支付ID、退款I(lǐng)D等。那一般生成ID都有哪些解決方案呢?特別是在復(fù)雜的分布式系統(tǒng)業(yè)務(wù)場(chǎng)景中,我們應(yīng)該采用哪種適合自己的解決方案是十分重要的。下面我們一一來列舉一下,不一定全部適合,這些解決方案僅供你參考,或許對(duì)你有用。

一個(gè)ID一般來說有下面幾種要素:

  • 唯一性:確保生成的ID是全網(wǎng)唯一的。

  • 有序遞增性:確保生成的ID是對(duì)于某個(gè)用戶或者業(yè)務(wù)是按一定的數(shù)字有序遞增的。

  • 高可用性:確保任何時(shí)候都能正確的生成ID。

  • 帶時(shí)間:ID里面包含時(shí)間,一眼掃過去就知道哪天的交易。

系統(tǒng)時(shí)間毫秒數(shù)

我們可以使用當(dāng)前系統(tǒng)時(shí)間精確到毫秒數(shù)+業(yè)務(wù)屬性+用戶屬性+隨機(jī)數(shù)+...等參數(shù)組合形式來確保ID的唯一性,缺點(diǎn)是ID的有序性難以保證,要保證有序性就要依賴數(shù)據(jù)庫(kù)或者其他中間存儲(chǔ)媒介。

UUID

Java自帶的生成UUID的方式就能生成一串唯一隨機(jī)32位長(zhǎng)度數(shù)據(jù),而且夠我們用N億年,保證唯一性肯定是不用說的了,但缺點(diǎn)是它不包含時(shí)間、業(yè)務(wù)數(shù)據(jù)可讀性太差了,而且也不能ID的有序遞增。

這是一種簡(jiǎn)單的生成方式,簡(jiǎn)單,高效,但在一般業(yè)務(wù)系統(tǒng)中我還沒見過有這種生成方式。

數(shù)據(jù)庫(kù)自增ID

我們都知道為數(shù)據(jù)庫(kù)主鍵設(shè)置自增序號(hào),以一定的趨勢(shì)自增,以保證主鍵ID的唯一性。

這個(gè)方案很簡(jiǎn)單,但最主要的問題在于依賴數(shù)據(jù)庫(kù)本身,這就無形增加了對(duì)數(shù)據(jù)庫(kù)的訪問壓力和依賴,一旦對(duì)單庫(kù)進(jìn)行分庫(kù)分表或者數(shù)據(jù)遷移就尷尬了。

所以,這也不是合適的ID生成方法。

批量生成ID

一次按需批量生成多個(gè)ID,每次生成都需要訪問數(shù)據(jù)庫(kù),將數(shù)據(jù)庫(kù)修改為最大的ID值,并在內(nèi)存中記錄當(dāng)前值及最大值。這樣就避免了每次生成ID都要訪問數(shù)據(jù)庫(kù)并帶來壓力。

這種方案服務(wù)就是單點(diǎn)了,如果服務(wù)重啟勢(shì)必會(huì)造成ID丟失不連續(xù)的情況,而且這種方式也不利于水平擴(kuò)展。

中間件

Redis的所有命令操作都是單線程的,本身提供像incr這樣的自增命令,所以能保證生成的ID肯定是唯一有序的。

這種方式不依賴關(guān)系數(shù)據(jù)庫(kù),而且速度快。但系統(tǒng)要引入Redis這一中間件,增加維護(hù)成本,而且編碼和配置工作量比較大。即使已經(jīng)有了Redis組件,但生成ID的高頻率訪問對(duì)單線程的Redis性能勢(shì)必也會(huì)造成影響。

還可以利用像Zookeeper中的znode數(shù)據(jù)版本來生成序列號(hào),及MongoDB的ObjectId等,這種利用中間件的做法不是很推薦。

snowflake算法

如上圖的所示,Twitter的snowflake算法下面幾部分組成:

  • 41位的時(shí)間序列,精確到毫秒,可以使用69年

  • 10位的機(jī)器標(biāo)識(shí),最多支持部署1024個(gè)節(jié)點(diǎn)

  • 12位的序列號(hào),支持每個(gè)節(jié)點(diǎn)每毫秒產(chǎn)生4096個(gè)ID序號(hào),最高位是符號(hào)位始終為0。

這種方案性能好,在單機(jī)上是遞增的,但是由于涉及到分布式環(huán)境,每臺(tái)機(jī)器上的時(shí)鐘不可能完全同步,也許有時(shí)候也會(huì)出現(xiàn)不是全局遞增的情況。

而且這個(gè)項(xiàng)目在2010就停止維護(hù)了,但這個(gè)設(shè)計(jì)思路還是應(yīng)用于其他各個(gè)ID生成器及變種。

UidGenerator

UidGenerator是百度開源的分布式ID生成器,基于于snowflake算法的實(shí)現(xiàn),看起來感覺還行。不過,國(guó)內(nèi)開源的項(xiàng)目維護(hù)性真是擔(dān)憂。

大家可以參考具體使用:

https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md

Leaf

Leaf是美團(tuán)開源的分布式ID生成器,能保證全局唯一性、趨勢(shì)遞增、單調(diào)遞增、信息安全,里面也提到了幾種分布式方案的對(duì)比,但也需要依賴關(guān)系數(shù)據(jù)庫(kù)、Zookeeper等中間件。

具體可以參考官網(wǎng)說明:

https://tech.meituan.com/MT_Leaf.html


總結(jié)

以上是生活随笔為你收集整理的分布式ID生成器的解决方案总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。