分布式ID实现方案实战示例总结

发布于:2025-06-12 ⋅ 阅读:(16) ⋅ 点赞:(0)

以下是几种常见的分布式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生成方案。