☕ 分布式 ID

吞佛童子2022年10月10日
  • 分布式
  • 分布式
大约 2 分钟

☕ 分布式 ID

特点

  • 全局唯一
    • 不可重复
    • 必要条件
  • 单调递增
    • 保证数据库的顺序写入
    • 非必要添加,需要根据业务需求

1. UUID

  1. 组成形式
    • 3216 进制数 + 4-
    • 8-4-4-4-12 的形式
    • 例:12345678-9abc-def0-1234-56789abcdef0
  2. 特点:
    • 无外部依赖,本地生成,性能高
    • 长度固定为 36 位的字符串,字段长度较长,空间占用大
    • ID 无序,若作为数据库主键,无法顺序写入,性能受到影响
    • 无法代表实际含义
    • 保护安全隐私,外人无法通过 ID 直接得出业务隐私

2. 雪花算法

  1. 组成形式
    • 64 位表示一个 ID,分割为 4 部分
    • 具体形式:
      • 1 位:
        • 固定为 0
      • 41 位:
        • 表示时间戳,精确到 毫秒,可使用 69 年
      • 10 位:
        • 表示机器标识,最多支持 1024 个节点
        • 还可以继续拆分为 机房 ID + 机器 ID
      • 12 位:
        • 表示序列号,最多支持一个机器节点一个毫秒中 4096 个 ID 号
  2. 特点
    • 无外部依赖,可以通过 Java 代码生成
    • 长度固定为 64 位 = 8 字节
    • ID 单调递增
    • 可以根据值推测出具体含义
    • 保护安全隐私,外人无法通过 ID 直接得出业务隐私
    • 强依赖机器时间
      • 若机器的系统时间回拨,可能出现 ID 重复的情况
      • 如何解决?
        • 本地维护一个文件,保存上次生成的时间戳,只有后写入的时间戳比前面的时间戳大,才说明时间正常,没有发生回拨情况
  3. 应用
    • 百度开源的 UidGenerator
    • 美团开源的 Leaf

3. 数据库自增主键

  1. 单机部署
    • 依赖 数据库自增主键
    • 特点:
      • 简单,成本低
      • ID 单调自增
      • 强依赖数据库,当数据库发生异常时,会影响整个系统;性能瓶颈也限制在单台 MySQL 机器的读写性能
  2. 集群部署
    • 设置 ID 递增步长 = 集群机器数
    • 特点:
      • 依赖 集群机器 的性能
      • 水平扩展困难,当增大一台机器时,处理过程比较麻烦

4. Redis 原子自增

  1. 原理
    • 借助 Redis 的 原子指令 Incr()
  2. 特点
    • 依赖 集群机器 的性能
    • 水平扩展困难

5. ZK 顺序节点

  1. 原理
    • 在特定节点下 生成顺序节点
    • 特点:
      • 性能不高,频繁创建、删除节点影响性能
上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou