分布式ID生成方案
# 分布式 ID 生成方案
核心命题:分库分表后,自增主键失效——如何生成全局唯一、趋势递增、高性能的 ID?
# 01. 案例引入
一个真实事故或痛点:订单号冲突、ID重复导致数据覆盖、时钟回拨引发灾难。
# 02. 问题拆解
- 全局唯一 vs 趋势递增 vs 单调递增
- 信息携带(日期/机器/序号)vs 纯随机
- 性能:QPS 要求 / 可用性 / 延迟
# 03. 业界方案
| 方案 | 代表 | 优点 | 缺点 |
|---|---|---|---|
| UUID | 标准库 | 简单、无中心 | 无序、索引不友好 |
| Snowflake | 趋势递增、高性能 | 时钟回拨风险 | |
| 号段模式 | 美团Leaf | 性能高、无时钟依赖 | 需DB/缓存 |
| Redis自增 | — | 简单、有序 | 持久化依赖 |
| ZK序号 | — | 强一致 | 性能低 |
# 04. 设计原则
- 全局唯一是底线
- 趋势递增优于纯随机(B+Tree 索引友好)
- 无单点:发号服务需高可用
- 时钟回拨必须有兜底方案
# 05. 方案落地
- Snowflake 核心实现(41位时间 + 10位机器 + 12位序列)
- 号段模式双Buffer设计
- 时钟回拨的三种处理策略
# 06. 踩坑反例
- Bigint装不下Snowflake → 前端精度丢失
- 号段耗尽不告警 → 服务雪崩
- 时钟回拨未处理 → ID重复
# 07. 演进路线
- V1: 单机自增 → V2: Snowflake → V3: 号段模式 + 多机房
下一篇:11. 消息队列方案选型
上次更新: 2026/06/28, 17:55:19