分布式ID实现方案实战示例总结
以下是几种常见的分布式ID实现方案的实战示例总结:
数据库自增ID
-
示例
- 创建数据库表,设置自增主键:
CREATE TABLE id_generator (id BIGINT AUTO_INCREMENT PRIMARY KEY,-- 其他字段... );
- 获取ID时,插入一条记录并返回自增ID:
INSERT INTO id_generator () VALUES (); SELECT LAST_INSERT_ID();
-
优点
- 实现简单,ID有序递增。
-
缺点
- 存在单点故障,扩展性差。
- 高并发下性能瓶颈。
数据库号段模式
-
示例
- 创建表,记录当前号段和最大值:
CREATE TABLE id_segment (biz_type VARCHAR(32) PRIMARY KEY,current_id BIGINT,max_id BIGINT );
- 获取ID时,更新号段:
UPDATE id_segment SET current_id = ?, max_id = ? WHERE biz_type = ? AND current_id < max_id;
如果更新成功,从
current_id
开始分配ID;否则,重新获取新的号段。 -
优点
- 减少数据库访问,提高性能。
-
缺点
- 需要处理号段耗尽的情况。
- 仍存在单点问题。
Redis自增
-
示例
- 使用
INCR
命令生成ID:
Jedis jedis = new Jedis("localhost", 6379); long id = jedis.incr("id_generator");
- 使用
-
优点
- 高性能,支持高并发。
-
缺点
- 依赖Redis,存在单点风险。
- ID单调递增,可能暴露业务信息。
UUID
-
示例
- 生成UUID:
String id = UUID.randomUUID().toString().replace("-", "");
-
优点
- 生成简单,本地生成无需网络请求。
- 全球唯一性高。
-
缺点
- 长度较长,存储成本高。
- 无序性导致数据库索引性能下降。
雪花算法(Snowflake)
-
示例
- 实现
SnowflakeIdWorker
类:
public class SnowflakeIdWorker {// 机器ID(可配置)private final long workerId;// 数据中心ID(可配置)private final long datacenterId;// 其他参数...public long nextId() {// 生成分布式ID...} }
- 实现
-
优点
- 高性能,生成速度快。
- ID有序递增,满足时间趋势。
- 分布式部署,无单点问题。
-
缺点
- 依赖时钟,时钟回拨可能导致ID重复。
- 需要管理机器ID和数据中心ID。
美团Leaf
-
示例
- 使用Leaf框架,配置数据库或Redis模式。
- 调用API获取ID:
long id = LeafIdGenerator.get();
-
优点
- 结合号段模式和Snowflake算法,兼顾性能和可靠性。
- 提供双缓存机制,提高可用性。
-
缺点
- 引入额外依赖,增加维护成本。
选择建议
- 高性能、有序ID:Redis自增、雪花算法。
- 高可用、简单:UUID、数据库自增ID(配合集群)。
- 兼顾性能与可靠性:数据库号段模式、美团Leaf。
根据业务需求、系统架构和性能要求,选择合适的分布式ID生成方案。