☕ 分布式 ID
2022年10月10日
- 分布式
☕ 分布式 ID
特点
- 全局唯一
- 不可重复
- 必要条件
- 单调递增
- 保证数据库的顺序写入
- 非必要添加,需要根据业务需求
1. UUID
- 组成形式:
32
个16
进制数 +4
个-
8-4-4-4-12
的形式- 例:
12345678-9abc-def0-1234-56789abcdef0
- 特点:
- 无外部依赖,本地生成,性能高
- 长度固定为 36 位的字符串,字段长度较长,空间占用大
- ID 无序,若作为数据库主键,无法顺序写入,性能受到影响
- 无法代表实际含义
- 保护安全隐私,外人无法通过 ID 直接得出业务隐私
2. 雪花算法
- 组成形式:
64
位表示一个 ID,分割为 4 部分- 具体形式:
1
位:- 固定为 0
41
位:- 表示时间戳,精确到 毫秒,可使用 69 年
10
位:- 表示机器标识,最多支持 1024 个节点
- 还可以继续拆分为 机房 ID + 机器 ID
12
位:- 表示序列号,最多支持一个机器节点一个毫秒中 4096 个 ID 号
- 特点:
- 无外部依赖,可以通过 Java 代码生成
- 长度固定为 64 位 = 8 字节
- ID 单调递增
- 可以根据值推测出具体含义
- 保护安全隐私,外人无法通过 ID 直接得出业务隐私
- 强依赖机器时间
- 若机器的系统时间回拨,可能出现 ID 重复的情况
- 如何解决?
- 本地维护一个文件,保存上次生成的时间戳,只有后写入的时间戳比前面的时间戳大,才说明时间正常,没有发生回拨情况
- 应用:
- 百度开源的 UidGenerator
- 美团开源的 Leaf
3. 数据库自增主键
- 单机部署
- 依赖 数据库自增主键
- 特点:
- 简单,成本低
- ID 单调自增
- 强依赖数据库,当数据库发生异常时,会影响整个系统;性能瓶颈也限制在单台 MySQL 机器的读写性能
- 集群部署
- 设置 ID 递增步长 = 集群机器数
- 特点:
- 依赖 集群机器 的性能
- 水平扩展困难,当增大一台机器时,处理过程比较麻烦
4. Redis 原子自增
- 原理:
- 借助 Redis 的 原子指令 Incr()
- 特点:
- 依赖 集群机器 的性能
- 水平扩展困难
5. ZK 顺序节点
- 原理:
- 在特定节点下 生成顺序节点
- 特点:
- 性能不高,频繁创建、删除节点影响性能