狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

【SQLServer】整理10種分布式id生成方案

admin
2024年7月22日 8:55 本文熱度 1001

    在復雜分布式系統中,如金融、支付、訂單等業務數據日漸增長而必須要采用對數據分庫分表操作,此時就需要有一個唯一ID來標識一條數據或消息。下面介紹幾種常見的分布式id生成方案。

1、UUID

代碼實現如下所示:

UUID uuid = UUID.randomUUID();

優點實現上簡單;本地生成無網絡消耗并且具有全球唯一性
缺點

(1)UUID生成的是字符串,儲存性能差

(2)UUID無業務含義,可讀性差

(3)UUID生成的字符串不具備自增的趨勢


2、數據自增主鍵

    當需要唯一的id的時候,向數據庫中添加一條數據并返回主鍵id,可以保證在當前的系統的中id的唯一性。

優點成本小,實現簡單;id具有自增的特性;具備一定的業務可讀性
缺點依賴數據庫,存在單點問題;無法應對高并發業務

數據自增主鍵方案適用于小規模的、無高并發場景業務場景。

3、數據庫集群模式

    基于數據自增id主鍵方案存在單點問題,那么對其做高可用的優化,即就是使用數據庫的集群模式來生成唯一id。

    通過增加多臺數據庫服務并且給每個數據庫都設置起始值,然后通過設置步長來讓數據生成的ID趨勢遞增且不重復。

優點解決數據庫自增主鍵方案中的單點問題;
缺點不利于后續的擴展;單個數據庫壓力還是很大,無法滿足高并發需求

此方案適用于數據量不大,數據庫不需要擴容的場景。

4、數據庫號段模式

    此方案實質就是批量從數據庫獲取自增的id,即就是每次從數據庫取出一個號段范圍,如(1-3000]表示從數據庫中生成3000個自增id。數據表的設計如下:

業務申請號段的流程如下:

    當一批號段用完之后,再次向數據庫申請新的號段,此方案的的優缺點如下表所示:

優點避免每次生成id都要訪問數據庫,提高了服務的性能
缺點存在單點的故障;數據庫服務重啟會存在id不連續的問題


5、Redis實現分布式id

    Redis提供的incr自增命令是單線程的操作,可以保證生成的id的唯一并有序的,我們聯合如時間戳值、機器標識組成一個具有特殊含義的唯一id,如下圖所示:

Redis生成唯一id的優缺點如下所示:

優點有序遞增,可讀性好;性能高
缺點依賴于Redis,存在單點問題;


6、Zookeeper實現分布式id

    Zookeeper客戶端創建順序節點時會根據創建的時間順序,在節點名稱后添加 10 位的順序編號,利用Zookeeper的這個特性實現id的唯一性。

    由于依賴Zookeeper并且存在多步的異步調用,如果競爭較大的的情況下還需要考慮使用分布式鎖,因為很少會使用Zookeeper來生成唯一id。

7、雪花算法

    雪花算法是使用一個64bitlong類型數字作為全局唯一id,下圖是展示了雪花算法生成唯一id時候各個bit位的作用:

    假設當前時間是2024-06-10 10:00:00,生成id的機器編號是7,序列號為1,據此雪花算法生成的id如下所示:

轉為十進制如下:

    雖然這樣就可以生成一個唯一的id,但是雪花算法有如下的問題:

(1)雪花算法嚴重的依賴時鐘,如果出現時鐘回撥就會導致重復生成id;解決時鐘回撥的一種方式就是將代表機器碼的十位拆出三位出來表示時鐘序列,如下圖:

    當發生時鐘回撥的時候,此時時間已經發生了變化,那么這時將時鐘序列新增1位,重新定義整個雪花Id;為了避免實例重啟引起時間序列丟失,時鐘序列最好通過數據庫或者緩存等方式存儲起來。

(2)41bit最大的時間跨度是69年,后面會發生41比特位不夠使用;解決方案是生成時間戳之后減去系統上線時候的時間。

8、百度uid-generator

    uid-generator是基于雪花算法實現的,uid-generator不同點在于它支持自定義時間戳、機器id和序列號等個部分的信息,其組成部分如下所示:

uid-generator的項目地址:

https://gitcode.com/baidu/uid-generator/overview?utm_source=artical_gitcode

    uid-generator具有高性能、去中心化、強一致性和易用性等特點而廣泛的應用與生成數據庫主鍵、訂單編號和消息追蹤等場合下。

9、美團的Leaf

    美團的Leaf同時兼具了數據庫號段模式和雪花算法,它可以試下可以根據不同業務場景靈活切換。

Leaf項目Github地址:

https://github.com/Meituan-Dianping/Leaf

美團的Leaf詳細兩種模式介紹文檔:

https://tech.meituan.com/2019/03/07/open-source-project-leaf.html

號段模式低位趨勢增長,較少的ID號段浪費,能夠容忍MySQL的短時間不可用
Snowflake模式全分布式,ID有語義

我們根據實際的業務特性來選擇合適的ID生成方式。


10、滴滴的Tinyid

    Tinyid是在美團的ID生成算法Leaf的基礎上擴展而來,是基于數據庫的號段模式實現的,支持數據庫多主節點模式。如下圖如下所示:

項目的地址:

https://github.com/didi/tinyid

    Tinyid提供了REST API和Java客戶端兩種獲取方式,相對來說使用更方便,目前在滴滴客服部門使用,且通過tinyid-client方式接入,每天生成的是億級別的id。性能上還是很高的。

總結:

(1)分布式id生成方式有很多種方案,我們需要依據實際的業務場景來選擇合適的方案。


該文章在 2024/7/22 9:00:26 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved