type
status
date
slug
summary
tags
category
password

1、概述

分布式系统中生成唯一 ID 是一个常见需求,需要满足全局唯一、趋势递增、高性能、高可用等特性。以下是几种主流的分布式ID实现方案:
  • 业务字段组合唯一键
  • UUID
  • 数据库自增序列
  • 号段模式
  • 雪花(snowflake)算法
技术选型:
  1. 简单场景:UUID 或数据库自增序列
  1. 中等规模:号段模式
  1. 大规模分布式:Snowflake或其改进版本
  1. 强顺序要求: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_offsetauto_increment_increment 参数分别控制自增 id 的起始值和偏移量。例如
  • auto_increment_increment=2auto_increment_offset=1 → 生成ID: 1, 3, 5, 7...
  • auto_increment_increment=2auto_increment_offset=2 → 生成ID: 2, 4, 6, 8...
每次业务使用下列 SQL 读写 MySQL 得到 ID 号。
流程如下所示
notion image
优点:简单易实现
缺点:
  • 强依赖 Mysql,当 MySQL 异常时整个系统不可用。
  • 受 MySQL 的读写性能限制,容易出现性能瓶颈。

2.4 号段模式

号段模式是数据库自增方案的优化。
实现:预先从数据库获取一批 ID 号段,缓存在本地内存中,当应用需要 ID 时直接从内存中获取,当号段使用完毕后再向数据库申请新的号段。通常需要设计一个专门的表来管理号段:
实现步骤:
  1. 应用启动时或当前号段用完时,向数据库申请新号段
  1. 数据库通过原子操作更新 max_id 并返回新号段范围
  1. 应用将号段范围缓存在内存中
  1. 应用从内存中顺序分配 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-segmentLeaf-snowflake 模式。
  • Leaf-segment:对号段模式方案的优化
    • segment 分段取 id,减少 mysql 的 IO 次数
    • 双 buffer:号码消耗到一定程度(10%)就开启异步线程去取新的 id
    • notion image
  • Leaf-snowflake:对 snowflake 算法的优化,依赖 zk 生成 workerID
    • notion image
优点:
  • 高可用
  • 解决了时钟回拨的问题
缺点:
  • 依赖 zookeeper
分布式锁:实现汇总Git常用命令
Loading...