什么是分布式ID
分布式ID是指在分布式系統中生成的特定范圍內唯一的標識符,如訂單號、商品ID、鏈路追蹤TraceID。
隨著業務發展,對分布式ID的要求越來越高,其中最基本的要求如下
- 全局唯一:在任何節點、任何時間生成的ID都必須是唯一的;
- 高性能:分布式ID的生成速度要快,對本地資源消耗小;
- 高可用:生成分布式ID的服務要保證可用性接近于100%;
- 方便易用:拿來即用,方便業務快速接入。
有哪些技術實現
1、數據庫自增ID
原理:基于數據庫的auto_increment
實現ID自增;
優點
- 實現簡單;
- ID單調自增。
缺點
- 性能較差,不適合高并發場景。
適用場景
- 小型分布式系統;
- 要求ID連續自增。
2、Redis自增
原理:利用Redis的INCR
命令生成自增ID。
優點:
- 簡單高效,適合小規模分布式系統。
缺點:
- 依賴Redis,存在單點風險(可通過Redis集群緩解)。
- 擴展性有限。
適用場景:對性能要求高且規模較小的場景(如分布式鎖的唯一標識)
3、UUID
原理:UUID,即通用識別碼,是基于時間戳、MAC地址、隨機數等生成128位的字符串(如550e8400-e29b-41d4-a716-446655440000
)。
優點:
- 簡單易用,無需協調;
- 唯一性極高。
缺點:
- 無序,導致數據庫索引效率低;
- 長度較長(16字節),存儲和傳輸開銷大。
適用場景:對唯一性要求高,但對有序性和性能要求不高的場景(如臨時文件命名)。
4、號段模式
**原理:**預先分配一組連續的號段(如10000~20000)給某個節點,節點預先拉取,在分配ID時 優先判斷本地號段是否消耗完,如果消耗完的話,再從數據庫中獲取下一個號段。
優點
- 網絡開銷大幅減少;
- 無需處理時鐘回撥、機器ID沖突等問題;
- 生成的ID是連續的,適合數據庫索引優化。
缺點
- ID可能不連續;
- 步長設置過短的話,可能會導致頻繁請求數據庫獲取新號段,造成服務器壓力。
適用場景
- 高并發場景,如秒殺系統。
5、雪花算法
原理:由Twitter提出,將64位ID分為以下部分:
- 1位符號位(始終為0)。
- 41位時間戳(毫秒級,可用約69年)。
- 10位工作機器ID(5位數據中心ID + 5位機器ID)。
- 12位序列號(每毫秒可生成4096個ID)。
需要注意的是,這里的工作中心ID需要預先分配,作用是區分不同的服務節點。
優點
- 高性能(本地生成,無需網絡請求)。
- 趨勢遞增,適合數據庫索引。
- 可擴展性強(通過調整機器ID位數)。
缺點
- 依賴系統時鐘,時鐘回撥可能導致ID重復。
- 機器ID需要預先分配(可通過配置或ZooKeeper動態分配)。
適用場景:大多數分布式系統(如訂單ID、日志ID等)。
6、TinyID
**原理:**基于號段模式實現,不過支持多數據庫模式,實現方式是一個主節點只生成偶數、另一個生成奇數;
優點
- 適用于大多數分布式系統;
- 多數據庫支持:提高系統的可用性。
缺點
- ID可能不連續;
根據業務場景選型
https://mp.weixin.qq.com/s/bFDLb6U6EgI-DvCdLTq_QA