加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • Labs 導(dǎo)讀
    • Part 01●??什么是UUID?●
    • Part 02●??UUID的構(gòu)成方式?●
    • Part 03●??UUID的現(xiàn)行版本?●
    • Part 04●??現(xiàn)有UID的生成策略?●
    • Part 05●??UUID的應(yīng)用案例分析?●
    • Part 06●??省級(jí)寬帶電視會(huì)員管理平臺(tái)的應(yīng)用實(shí)踐?●
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

五分鐘技術(shù)趣談 | 分布式UUID的生成策略及應(yīng)用場(chǎng)景淺析

2023/07/12
2986
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

作者:錢江奇 李鳴揚(yáng)

單位:中國(guó)移動(dòng)智慧家庭運(yùn)營(yíng)中心?智慧互聯(lián)產(chǎn)品部

Labs 導(dǎo)讀

UUID是國(guó)際標(biāo)準(zhǔn)化組織(ISO)提出的一個(gè)概念。UUID用來識(shí)別屬性類型,在所有空間和時(shí)間上被視為唯一的標(biāo)識(shí)。本文將從UUID的構(gòu)成方式、現(xiàn)行版本、生成策略、應(yīng)用案例等方面作介紹。

Part 01●??什么是UUID?

UUID全稱Universal Unique Identifier是一串128位數(shù)字碼,用于唯一識(shí)別網(wǎng)絡(luò)對(duì)象或者事件。由于其獨(dú)特的生成機(jī)制和使用場(chǎng)景,UUID可以確保全局唯一性,避免重復(fù)。UUID廣泛應(yīng)用于各種需要唯一識(shí)別的場(chǎng)景,例如數(shù)據(jù)庫(kù)主鍵、系統(tǒng)實(shí)例ID, 識(shí)別生命周期短暫的藍(lán)牙配置文件和對(duì)象等。

UUID是類似于GUID的術(shù)語(yǔ),最初由微軟引入的GUID實(shí)際上是UUID的一種變體,在RFC 4122規(guī)范中將這兩個(gè)術(shù)語(yǔ)定義為同義詞。隨后,開放軟件基金會(huì)(OSF)對(duì)UUID進(jìn)行了標(biāo)準(zhǔn)化,使其成為分布式計(jì)算網(wǎng)絡(luò)中的重要組成部分,衍生出的各個(gè)UUID版本都遵循RFC 4122規(guī)范。

Part 02●??UUID的構(gòu)成方式?

但如果計(jì)UUID通常通過特定算法生成,例如基于時(shí)間戳或網(wǎng)絡(luò)地址等。UUID通過特定的組合排列方式確保其唯一性,由32個(gè)16進(jìn)制數(shù)字(包括數(shù)字0到9和字母A到F)和4個(gè)連字符構(gòu)成。每個(gè)連字符的字符數(shù)是8-4-4-4-12,其中最后4位或者N位表示格式和編碼:

UUID也可以用十進(jìn)制或者二進(jìn)制格式表示:

傳統(tǒng)的UUID大致分成3種變體:

? 變體0:為了兼容80年代未過時(shí)的阿波羅網(wǎng)絡(luò)計(jì)算系統(tǒng)而保留,它的結(jié)構(gòu)與目前使用的version 1相似。

? 變體1:目前主要使用的變體,在Internet工程文檔規(guī)范中被定義為RFC 4122/DCE 1.1 UUID或Leach-Salz UUID,例如微軟的GUID就是UUID的變體1。

? 變體2:為了兼容微軟后續(xù)發(fā)展而保留,盡管現(xiàn)有的微軟GUID是UUID的變體1,但早期Windows平臺(tái)使用的是變體2。變體1和變體2在N位位置的比特?cái)?shù)字不同,例如變體1使用2位比特位,而變體2使用3位比特位。

Part 03●??UUID的現(xiàn)行版本?

現(xiàn)有的UUID主要是基于變體1衍生出來的,由5個(gè)不同版本組成,不同版本的UUID生成方式有所區(qū)別,具體包括:

? Version1:基于時(shí)間戳和節(jié)點(diǎn)生成的UUID。它使用當(dāng)前時(shí)間和計(jì)算機(jī)MAC地址來生成唯一標(biāo)識(shí)符。這個(gè)版本的UUID保證了全局唯一性和時(shí)間排序性,但在某些情況下可能存在安全性和隱私問題。

? Version2:基于DCE安全標(biāo)識(shí)符(DCE Security Identifier)生成的UUID。這個(gè)版本的UUID將標(biāo)識(shí)符的角色和權(quán)限信息編碼到UUID中,使其能夠表示用戶、組和ACL(訪問控制列表)。然而,這個(gè)版本的UUID并不常見,也沒有得到廣泛支持。

? Version3:基于名稱和命名空間生成的UUID。它使用MD5散列函數(shù)對(duì)名稱和命名空間進(jìn)行處理,生成唯一的標(biāo)識(shí)符。這個(gè)版本的UUID可用于標(biāo)識(shí)命名空間中的對(duì)象,如URL、域名等。

? Version4:基于隨機(jī)數(shù)生成的UUID。這個(gè)版本的UUID使用隨機(jī)數(shù)生成算法生成,因此具有很高的隨機(jī)性和唯一性。它是目前最常用的UUID版本,廣泛應(yīng)用于各種領(lǐng)域。

? Version5:基于名稱和命名空間生成的UUID。它與Version 3相似,但使用的是SHA-1散列函數(shù),提供更強(qiáng)的散列算法。這個(gè)版本的UUID也可用于標(biāo)識(shí)命名空間中的對(duì)象。

Part 04●??現(xiàn)有UID的生成策略?

4.1 Mysql生成ID

Mysql使用主鍵auto_increment方式生成ID,ID之間的步長(zhǎng)固定,但可以自定義步長(zhǎng)。這種方式簡(jiǎn)單易用,可以保證ID的遞增性和唯一性,但是存在單點(diǎn)故障和數(shù)據(jù)一致性問題、在擴(kuò)展性方面也存在一定的挑戰(zhàn)。

4.2 MongoDB生成ID

MongoDB生成的UUID是由12字節(jié)十六進(jìn)制數(shù)字組成,具體組成:4字節(jié)--以秒為單位的時(shí)間戳,3字節(jié)--機(jī)器標(biāo)識(shí)符,2字節(jié)--進(jìn)程ID,3字節(jié)--計(jì)數(shù)器(從一個(gè)隨機(jī)值開始)。比傳統(tǒng)的UUID短,但比MYSQL自動(dòng)增量字段(64位Bigint值)長(zhǎng)。

4.3 Redis生成ID

Redis通常使用原子操作INCR或INCRBY實(shí)現(xiàn)ID生成。如果是Redis集群可以設(shè)置ID初始值并自定義每個(gè)節(jié)點(diǎn)ID的步長(zhǎng)。由于Redis是單線程模型,可以保證生成的ID具備唯一性。

4.4 Zookeeper生成ID

Zookeeper主要通過ZNODE數(shù)據(jù)版本生成ID,此ID通常是32位或者64位字符串構(gòu)成,客戶端可以使用該ID作為UID使用。由于需要強(qiáng)依賴Zookeeper,在高并發(fā)的場(chǎng)景多的情況下很少考慮使用這種方式。

Part 05●??UUID的應(yīng)用案例分析?

5.1 Twitter生成UUID

Twitter使用雪花算法作為專業(yè)服務(wù)來統(tǒng)一生成64位唯一標(biāo)識(shí)符,用于分布式系統(tǒng)中的對(duì)象標(biāo)識(shí),例如推特、直接消息、列表等。這些ID是基于時(shí)間的的唯一無符號(hào)64位整數(shù),完整的ID定義主要組成方式如下:

41位--時(shí)間戳以毫秒為單位(相對(duì)于任何自定義紀(jì)元,通常可以使用69年)

10位--已配置的機(jī)器/節(jié)點(diǎn)/分片ID

12位--序列號(hào)(每臺(tái)機(jī)器的本地計(jì)算器,每4096個(gè)值后設(shè)置為0)

1位--額外保留位,一般被設(shè)置為0來確保總數(shù)為正值

按著這種方法構(gòu)成的UID不僅提高可用性,因?yàn)槭褂脮r(shí)間戳為首部分,還可以根據(jù)時(shí)間進(jìn)行排序。默認(rèn)情況下,雪花算法生成一個(gè)64位的無符號(hào)長(zhǎng)整型,也就是長(zhǎng)度為19的ID。有時(shí)具體項(xiàng)目中可能不需要這么長(zhǎng),也可以根據(jù)自身需要修改該算法。

5.2 百度生成UUID

百度基于雪花算法改進(jìn)生成UID,對(duì)UID的bit位進(jìn)行調(diào)整,將時(shí)間戳部分修改為28位,用于表示當(dāng)前時(shí)間與初始上線生成的時(shí)間的時(shí)間差(單位為秒),其中初始時(shí)間可以手工配置。使用22位表示工作節(jié)點(diǎn)ID,實(shí)例啟動(dòng)的時(shí)候生成分布式ID,寫入數(shù)據(jù)庫(kù)中得到的自增長(zhǎng)序列值。使用13位序列號(hào)來解決時(shí)間回?fù)艿葐栴},如果當(dāng)前時(shí)間和上一次是時(shí)間相同則序列自增,超過閾值則自旋。

5.3 美團(tuán)生成UUID

美團(tuán)基于雪花算法改進(jìn),使用“1+41+5+5+12”的方式構(gòu)成UID,在原雪花算法的基礎(chǔ)上,使用5位bit代表機(jī)器ID,5位bit代表機(jī)房ID,12位序列號(hào)代表自增值,由于集群較大,基于Zookeeper組件特性配置機(jī)器ID。對(duì)于時(shí)間回?fù)軉栴}的解決方案,設(shè)定閾值5毫秒,回?fù)軙r(shí)間小于5毫秒則等待回?fù)芎笾匦律尚碌腢ID,超過閾值則拋出異常。

其他大型互聯(lián)網(wǎng)公司生成UID的方案,大部分都是基于Twitter的雪花算法進(jìn)行改進(jìn),其中滴滴使用“時(shí)間戳+起點(diǎn)編號(hào)+車牌號(hào)”生成相應(yīng)的UID,淘寶訂單則使用“時(shí)間戳+用戶ID”生成,滴滴則在美團(tuán)的方案上將號(hào)段加載到內(nèi)存中,同時(shí)支持多個(gè)主節(jié)點(diǎn)模式。微信的UID生成則主要綁定用戶序列號(hào),采用步進(jìn)式持久化和分號(hào)段共享存儲(chǔ)的實(shí)現(xiàn)方式。

Part 06●??省級(jí)寬帶電視會(huì)員管理平臺(tái)的應(yīng)用實(shí)踐?

省級(jí)寬帶電視會(huì)員管理平臺(tái)主要管理各省寬帶電視的會(huì)員用戶,是一個(gè)大型分布式平臺(tái),服務(wù)器跨省分布,數(shù)量眾多,存在時(shí)鐘回退問題。因此,本平臺(tái)在雪花算法基礎(chǔ)上進(jìn)行改進(jìn),增加時(shí)間線的概念,可以同時(shí)支持多條時(shí)間線并行,很好地解決了時(shí)鐘回退問題。具體方案如下:

調(diào)整2位bit代表時(shí)間線,最多支持4條時(shí)間線,所有時(shí)間線設(shè)定統(tǒng)一初始時(shí)間,指定一條時(shí)間線為統(tǒng)一時(shí)間線,根據(jù)該時(shí)間線生成相應(yīng)的ID,推進(jìn)時(shí)間進(jìn)度。機(jī)器發(fā)生時(shí)鐘回?fù)軙r(shí),當(dāng)回?fù)軙r(shí)間間隔大于設(shè)定的閾值,切換到另一條時(shí)間線繼續(xù)生成ID。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
LM4766T 1 National Semiconductor Corporation IC 40 W, 2 CHANNEL, AUDIO AMPLIFIER, PZFM15, NON ISOLATED, PLASTIC, TO-220, 15 PIN, Audio/Video Amplifier
$6.39 查看
TPA3123D2PWP 1 Texas Instruments 25-W stereo, 10- to 30-V supply, analog input Class-D audio amplifier w/ SE outputs 24-HTSSOP -40 to 85

ECAD模型

下載ECAD模型
$8.69 查看
SI4707-B20-GM 1 Silicon Laboratories Inc Audio Single Chip Receiver,

ECAD模型

下載ECAD模型
$9.02 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

移動(dòng)Labs是中國(guó)移動(dòng)的社交化新媒體平臺(tái),是面向外部行業(yè)及產(chǎn)業(yè)鏈合作伙伴的信息發(fā)布、業(yè)務(wù)發(fā)展和產(chǎn)業(yè)推進(jìn)門戶。