最常用的分布式ID生成方案

在分布式系统中,唯一ID生成是基础能力。当单库单表无法支撑业务时,传统自增ID的局限性暴露无遗——如何在高并发、跨服务的环境下生成全局唯一且高效的ID? 本文深度剖析8种主流方案,助你构建可靠的分布式ID体系。当前分布式ID生成已进入生态化阶段,但核心原理仍值得开发者深究。


一、方案详解:原理与实战

1. 数据库自增ID

原理:利用MySQL的AUTO_INCREMENT特性,每次插入获取新ID。
实现

CREATE TABLE sequence (id BIGINT AUTO_INCREMENT PRIMARY KEY);
INSERT INTO sequence VALUES ();
SELECT LAST_INSERT_ID();

痛点

  • ⚠️ 单点瓶颈:写入压力集中于单库,分库分表后ID不连续
  • ⚠️ 性能脆弱:实测万级QPS即成瓶颈(基于5.7版本InnoDB)
  • ✅ 适用场景:低并发内部工具系统,如后台管理ID

2. 号段模式(Segment)

原理:批量预分配ID段,减少DB交互。例如一次获取1000-1999号段,内存自增。
架构优化

  • 双Buffer机制:当前号段用至80%时异步加载下一号段
  • 京东改进版:号段大小动态调整(根据请求频率)
    性能:QPS提升100倍+,TP99<1ms(依赖本地缓存)
    缺陷:DB宕机导致号段丢失,ID非严格递增

3. Redis INCR

原理INCRBY命令原子递增,利用Redis单线程特性。
优化实践

SET id_generator 0  # 初始化
INCRBY id_generator 1000  # 批量获取

优势:万级QPS轻松支撑,集群部署高可用
隐患

  • 持久化可能丢数据(AOF每秒刷盘最多丢1s)
  • 需自行处理ID回拨(Redis重启后ID重置)

4. UUID

原理:128位全局唯一标识,含时间戳+MAC地址+随机数。
Java示例

String uuid = UUID.randomUUID().toString(); // 550e8400-e29b-41d4-a716-446655440000

致命缺陷

  • ❌ 无序:MySQL InnoDB主键用UUID导致页分裂,写性能下降50%+
  • ❌ 长度36字符:存储/索引成本高
    ✅ 仅推荐:非核心场景如TraceID、文件名

5. 雪花算法(SnowFlake)

原理:64位ID = 1位符号位 + 41位时间戳 + 10位工作节点 + 12位序列号
经典雪花结构
关键问题

  • 时钟回拨:NTP同步导致ID重复(解决方案:缓存历史时间戳,拒绝回拨请求)
  • WorkerID分配:早期依赖ZooKeeper,现多用Redis注册(美团Leaf改进)
    优化变种
  • 百度UidGenerator:用RingBuffer缓存ID,避免实时计算
  • 美团Leaf-snowflake:ZK/Redis动态分配WorkerID

6. 滴滴TinyID

架构设计

  • 号段模式增强版,分段加载 + 多DB分片
  • 独立HTTP服务:GET /tinyid/id?bizType=user
  • 双DB主备:故障时自动切换
    性能数据

    配置QPS99分位延迟
    4核8G28k3.2ms

    优势:无状态服务,水平扩展能力极强

7. 百度UidGenerator

核心创新

  • 借用RingBuffer思想,异步生成ID缓存队列
  • 采用AtomicLong替代系统时间,解决回拨
    ID结构(可配置):

    | time (32bit) | workerId (22bit) | sequence (10bit) |

    实测:单节点50w QPS无压力,1000万次测试0重复

8. 美团Leaf

双引擎架构

  • Leaf-segment:号段模式+双Buffer,DB宕机自动切换备用库
  • Leaf-snowflake:解决时钟回拨+ZK自动分配WorkerID
    生产级保障
  • 监控:ID获取延迟 >100ms 触发告警
  • 熔断:DB不可用时返回本地缓存ID(容忍10分钟故障)
    性能:单节点2万QPS(Segment模式),TP99<10ms

二、核心能力对比表

方案全局唯一趋势递增100万QPS时钟依赖容灾能力适用场景
数据库自增低并发单体应用
号段模式⭐⭐高并发业务ID
Redis INCR⭐⭐⭐中等并发,允许少量丢失
UUID⭐⭐⭐⭐非主键场景
雪花算法⚠️⭐⭐无DB依赖的ID生成
滴滴TinyID⭐⭐⭐金融级高可用场景
百度UidGenerator⚠️⭐⭐⭐超高并发无序ID
美团Leaf⚠️/❌⭐⭐⭐⭐生产环境首选
✅ 强支持 | ⚠️ 有条件支持 | ❌ 不支持 | ⭐ 1-5级(5最高)

三、选型黄金法则

  1. 核心交易系统(订单/支付)
    → 选美团Leaf-segment:金融级容灾+严格递增,避免分库分表数据倾斜
  2. 超高并发场景(日志/埋点)
    → 选百度UidGenerator:50w+ QPS无压力,容忍短暂无序
  3. 轻量级微服务
    → 选Redis INCR:运维简单,QPS<5万时性价比极高
  4. 规避自研陷阱

    • 严禁在核心系统使用原生UUID
    • 雪花算法必须集成时钟回拨熔断(参考Leaf实现)
    • 号段模式务必做双Buffer预热

四、未来演进方向

  1. 多级混合架构:美团最新实践将Snowflake+Segment融合,冷热数据分层
  2. 硬件辅助:Intel RDRAND指令生成真随机数,解决时钟依赖(仍处实验室阶段)
  3. 云原生集成:AWS KMS/阿里云KMS提供加密ID生成服务,满足合规要求
最后忠告:没有银弹!某电商平台曾因盲目使用雪花算法,在NTP故障时产生12万重复订单ID。分布式ID的核心不是算法,而是对业务的敬畏——在一致性、性能、可用性的三角中,找到属于你的平衡点。

扩展阅读

标签: 分布式

添加新评论