作者:錢(qiá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用來(lái)識(shí)別屬性類(lèi)型,在所有空間和時(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是類(lèi)似于GUID的術(shù)語(yǔ),最初由微軟引入的GUID實(shí)際上是UUID的一種變體,在RFC 4122規(guī)范中將這兩個(gè)術(shù)語(yǔ)定義為同義詞。隨后,開(kāi)放軟件基金會(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通常通過(guò)特定算法生成,例如基于時(shí)間戳或網(wǎng)絡(luò)地址等。UUID通過(guò)特定的組合排列方式確保其唯一性,由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年代未過(guò)時(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衍生出來(lái)的,由5個(gè)不同版本組成,不同版本的UUID生成方式有所區(qū)別,具體包括:
? Version1:基于時(shí)間戳和節(jié)點(diǎn)生成的UUID。它使用當(dāng)前時(shí)間和計(jì)算機(jī)的MAC地址來(lái)生成唯一標(biāo)識(shí)符。這個(gè)版本的UUID保證了全局唯一性和時(shí)間排序性,但在某些情況下可能存在安全性和隱私問(wèn)題。
? Version2:基于DCE安全標(biāo)識(shí)符(DCE Security Identifier)生成的UUID。這個(gè)版本的UUID將標(biāo)識(shí)符的角色和權(quán)限信息編碼到UUID中,使其能夠表示用戶、組和ACL(訪問(wèn)控制列表)。然而,這個(gè)版本的UUID并不常見(jiàn),也沒(méi)有得到廣泛支持。
? 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ù)一致性問(wèn)題、在擴(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ī)值開(kāi)始)。比傳統(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主要通過(guò)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使用雪花算法作為專(zhuān)業(yè)服務(wù)來(lái)統(tǒng)一生成64位唯一標(biāo)識(shí)符,用于分布式系統(tǒng)中的對(duì)象標(biāo)識(shí),例如推特、直接消息、列表等。這些ID是基于時(shí)間的的唯一無(wú)符號(hào)64位整數(shù),完整的ID定義主要組成方式如下:
41位--時(shí)間戳以毫秒為單位(相對(duì)于任何自定義紀(jì)元,通??梢允褂?9年)
10位--已配置的機(jī)器/節(jié)點(diǎn)/分片ID
12位--序列號(hào)(每臺(tái)機(jī)器的本地計(jì)算器,每4096個(gè)值后設(shè)置為0)
1位--額外保留位,一般被設(shè)置為0來(lái)確保總數(shù)為正值
按著這種方法構(gòu)成的UID不僅提高可用性,因?yàn)槭褂脮r(shí)間戳為首部分,還可以根據(jù)時(shí)間進(jìn)行排序。默認(rèn)情況下,雪花算法生成一個(gè)64位的無(wú)符號(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,寫(xiě)入數(shù)據(jù)庫(kù)中得到的自增長(zhǎng)序列值。使用13位序列號(hào)來(lái)解決時(shí)間回?fù)艿葐?wèn)題,如果當(dāng)前時(shí)間和上一次是時(shí)間相同則序列自增,超過(guò)閾值則自旋。
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ù)軉?wèn)題的解決方案,設(shè)定閾值5毫秒,回?fù)軙r(shí)間小于5毫秒則等待回?fù)芎笾匦律尚碌腢ID,超過(guò)閾值則拋出異常。
其他大型互聯(lián)網(wǎng)公司生成UID的方案,大部分都是基于Twitter的雪花算法進(jìn)行改進(jìn),其中滴滴使用“時(shí)間戳+起點(diǎn)編號(hào)+車(chē)牌號(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í)鐘回退問(wèn)題。因此,本平臺(tái)在雪花算法基礎(chǔ)上進(jìn)行改進(jìn),增加時(shí)間線的概念,可以同時(shí)支持多條時(shí)間線并行,很好地解決了時(shí)鐘回退問(wèn)題。具體方案如下:
調(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。