type
status
date
slug
summary
tags
category
password
1、概述
分布式系统中生成唯一 ID 是一个常见需求,需要满足全局唯一、趋势递增、高性能、高可用等特性。以下是几种主流的分布式ID实现方案:
- 业务字段组合唯一键
- UUID
- 数据库自增序列
- 号段模式
- 雪花(snowflake)算法
技术选型:
- 简单场景:UUID 或数据库自增序列
- 中等规模:号段模式
- 大规模分布式:Snowflake或其改进版本
- 强顺序要求:Snowflake或数据库自增序列
2、分布式ID实现方案
2.1 业务字段组合唯一键
实现:使用业务字段(如用户ID、时间戳等)组合作为唯一标识,例如
yyMMddHHmm[10] + uid后四位[4] + server Id[2] + 随机数[4]
优点:无需额外组件
缺点:依赖业务规则,可能不够通用
2.2 UUID
实现:UUID(Universally Unique Identifier,通用唯一标识符)是一种用于唯一标识信息的标准化格式,通常由 32个十六进制数字 组成,以连字符分隔为五组,形式为:
8-4-4-4-12(例如:
550e8400-e29b-41d4-a716-446655440000
)。Java 内置了 UUID 的生成工具。优点:简单易实现,全局唯一
缺点:无序导致索引效率低,存储空间大(128位)
适用场景:对性能要求不高的小型系统
2.3 数据库自增序列
实现:单独部署一个 MySQL 数据库实例专门用于生成 ID,创建一张用于生成 ID 的数据表,把 id 字段设置为自增列(
AUTO_INCREMENT
)。MySQL可以设置
auto_increment_offset
和auto_increment_increment
参数分别控制自增 id 的起始值和偏移量。例如auto_increment_increment=2
,auto_increment_offset=1
→ 生成ID: 1, 3, 5, 7...
auto_increment_increment=2
,auto_increment_offset=2
→ 生成ID: 2, 4, 6, 8...
每次业务使用下列 SQL 读写 MySQL 得到 ID 号。
流程如下所示

优点:简单易实现
缺点:
- 强依赖 Mysql,当 MySQL 异常时整个系统不可用。
- 受 MySQL 的读写性能限制,容易出现性能瓶颈。
2.4 号段模式
号段模式是数据库自增方案的优化。
实现:预先从数据库获取一批 ID 号段,缓存在本地内存中,当应用需要 ID 时直接从内存中获取,当号段使用完毕后再向数据库申请新的号段。通常需要设计一个专门的表来管理号段:
实现步骤:
- 应用启动时或当前号段用完时,向数据库申请新号段
- 数据库通过原子操作更新 max_id 并返回新号段范围
- 应用将号段范围缓存在内存中
- 应用从内存中顺序分配 ID
优点
- 高性能:ID生成在内存中完成,性能极高
- 可扩展:通过增加step可以调整号段大小,适应不同吞吐量需求
- 简单可靠:实现简单,依赖少,稳定性高
- 趋势递增:生成的ID是趋势递增的,适合数据库索引
缺点:
- ID不连续:号段之间不连续,但趋势递增
- 重启可能浪费:应用重启可能导致号段中的ID未被使用而浪费
- 数据库依赖:仍然依赖数据库,但访问频率很低
优化方案
- 双 Buffer 优化:预加载下一个号段,实现无缝切换(美团 Leaf 的实现方案)
- 动态调整 step:根据使用情况动态调整号段大小
- 多实例隔离:不同业务使用不同 biz_tag 隔离
- 监控告警:监控号段使用情况,提前预警
2.5 雪花(snowflake)算法
参考 雪花算法介绍和实现
3、分布式ID开源框架
业界常用的开源框架有:
- 美团 Leaf:提供号段模式和snowflake算法两种实现。
- 滴滴 Tinyid:基于美团 Leaf-segment 算法的扩展。
- 百度 uid-generator:基于 snowflake 算法的扩展。
以美团 Leaf 为例。分为 Leaf-segment 和 Leaf-snowflake 模式。
- Leaf-segment:对号段模式方案的优化
- segment 分段取 id,减少 mysql 的 IO 次数
- 双 buffer:号码消耗到一定程度(10%)就开启异步线程去取新的 id

- Leaf-snowflake:对 snowflake 算法的优化,依赖 zk 生成 workerID

优点:
- 高可用
- 解决了时钟回拨的问题
缺点:
- 依赖 zookeeper
- Author:mcbilla
- URL:http://mcbilla.com/article/22f85c7d-7c1d-80b3-a25c-c1a5779c976c
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts