分布式唯一ID

在分布式開發(fā)過程中,常常為數(shù)據(jù)唯一標(biāo)識(shí)苦惱,雖然數(shù)據(jù)庫提供了字段自增長,使用起來也簡單,但是在數(shù)據(jù)庫改造過程中要分庫分表的時(shí)候,不能保證這些數(shù)據(jù)標(biāo)識(shí)的唯一;UUID出現(xiàn),保證了數(shù)據(jù)標(biāo)識(shí)的全球唯一,但是其生成為字符串,索引查詢和存儲(chǔ)效率低,并且生成標(biāo)識(shí)不具有順序性,導(dǎo)致后期的數(shù)據(jù)排序產(chǎn)生新的問題, 下面介紹了三種分布式環(huán)境下生成唯一ID的解決方案:UUID,Redis,SnowFlake,比較了一下它們?nèi)齻€(gè)的優(yōu)缺點(diǎn)

1. UUID

生成方式:?UUID 可以在程序中或者在數(shù)據(jù)庫中生成; 其目的是讓分布式系統(tǒng)中數(shù)據(jù)可以有唯一的存在標(biāo)識(shí); ?生成算法的核心思想是結(jié)合機(jī)器的網(wǎng)卡(若無網(wǎng)卡,找尋其它機(jī)器硬件唯一標(biāo)識(shí)碼代替)、當(dāng)?shù)貢r(shí)間、一個(gè)隨即數(shù)來生成UUID,可以實(shí)現(xiàn)全球唯一

優(yōu)點(diǎn): ?(1)生成簡單,性能好;

? ? ? ? ? ?(2)生成規(guī)則和網(wǎng)卡號(hào)等等機(jī)器硬件唯一編號(hào)有關(guān)系,所以可以實(shí)現(xiàn)全球唯一;

? ? ? ? ? ?(3)可以應(yīng)對(duì)系統(tǒng)合并和數(shù)據(jù)遷移的問題;

缺點(diǎn): ?(1) 無序的,不能保證生成ID的遞增關(guān)系,當(dāng)數(shù)據(jù)分庫存儲(chǔ)時(shí),不利于數(shù)據(jù)的排序; ?

? ? ? ? ? ?(2)字符串存儲(chǔ),當(dāng)字符串比較大的時(shí)候,查詢的性能比較低,并且在海量數(shù)據(jù)下占用的存儲(chǔ)空間比較大,系統(tǒng)之間傳輸?shù)拈_銷比較大;

? ? ? ? ? ?(3)生成的字符串不可讀,不友好;

2. Redis實(shí)現(xiàn)

? ? 生成方式: ?利用redis的lua腳本執(zhí)行功能,在每個(gè)節(jié)點(diǎn)上通過lua腳本生成唯一ID

? ? ? ? 實(shí)現(xiàn)比較靈活,生成的ID格式可以自定義, 舉例實(shí)現(xiàn)方式:

????????使用41 bit來存放時(shí)間,精確到毫秒,可以使用41年; 使用12 bit來存放邏輯分片ID, ? ? ?最大分片ID是4095; 使用10 bit來存放自增長ID,意味著每個(gè)節(jié)點(diǎn),每毫秒最多可以生成1024個(gè)ID; 因此, 生成唯一標(biāo)識(shí)為64位;

優(yōu)點(diǎn): ?(1) 生成ID靈活,可以自定義生成唯一標(biāo)識(shí)的格式;

? ? ? ? ? ? (2) 單線程,不存在線程安全的問題;

缺點(diǎn): ?(1) 開發(fā)成本高,相對(duì)于其它解決方案開發(fā)過程復(fù)雜

? ? ? ? ? ? (2)Redis的單線程雖然保證了線程的安全,但是在高負(fù)載的系統(tǒng)中成為系統(tǒng)的瓶頸

? ? ? ? ? ? (3)時(shí)間倒流的時(shí)候,不能保證系統(tǒng)生成的唯一性

3. twitter家自用的Snowflake

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

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

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

優(yōu)點(diǎn):高性能,低延遲;獨(dú)立的應(yīng)用;可以按照按時(shí)間有序,適合分布式環(huán)境數(shù)據(jù)排序

缺點(diǎn):需要獨(dú)立的開發(fā)和部署; 存在時(shí)間倒退的風(fēng)險(xiǎn)問題;



如果是在復(fù)雜分布式系統(tǒng)中,上面三個(gè)傾力推薦Snowflake, 開發(fā)使用相對(duì)UUID來說比較復(fù)雜,但是比Redis來做要簡單;

未完待續(xù)...

發(fā)現(xiàn)好的解決方案,繼續(xù)添加!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139
  • 本文主要介紹在一個(gè)分布式系統(tǒng)中, 如何去生成全局唯一的 ID。 前言 單純的生成全局ID并不是什么難題,生成全局的...
    FX_SKY閱讀 2,473評(píng)論 0 6
  • 一,題記 所有的業(yè)務(wù)系統(tǒng),都有生成ID的需求,如訂單id,商品id,文章ID等。這個(gè)ID會(huì)是數(shù)據(jù)庫中的唯一主鍵,在...
    架構(gòu)師小秘圈閱讀 4,147評(píng)論 1 18
  • 數(shù)據(jù)在分片時(shí),典型的是分庫分表,就有一個(gè)全局ID生成的問題。 單純的生成全局ID并不是什么難題,但是生成的ID通常...
    小樓聽煙雨閱讀 4,712評(píng)論 0 8
  • 使用之前的準(zhǔn)備 “速易天貿(mào)”進(jìn)銷存是基于網(wǎng)頁的系統(tǒng)。您完全可以像上網(wǎng),打開網(wǎng)頁一樣使用本系統(tǒng)。但通商軟件建議您使用...
    a85d6aa7027f閱讀 307評(píng)論 0 1

友情鏈接更多精彩內(nèi)容