Sonyflake 分布式 ID 生成方案

Sonyflake 是索尼开源的一种分布式 ID 生成算法,可以看作 Snowflake 思路的一种轻量实现。它通过时间、序列号和机器 ID 三部分组合生成 64 位整数,不依赖数据库自增,因此适合分布式服务在本地快速生成唯一 ID。

Sonyflake 实际使用 63 个 bit,最高位保留不用。默认布局为 39 bit Time + 8 bit Sequence + 16 bit Machine ID。

字段 位数 作用
Time 39 bit 表示从指定起始时间开始经过的时间
默认时间单位为 10ms
可以覆盖约 174 年
Sequence 8 bit 同一时间片内的序列号
最多支持 256 个序号,即理论单节点吞吐约 2.56 万 ID/s
Machine ID 16 bit 标识生成 ID 的节点
最多支持 65536 个节点。
合计 63 bit 最高 1 bit 不使用

Sonyflake 的核心价值在于不需要中心协调即可生成唯一 ID,同时生成速度快、ID 基本按时间趋势递增,也能够从 ID 中解析出时间、节点等信息。与 UUID 相比,它更加紧凑且具有时间有序性;与数据库自增 ID 相比,则更适合多节点、多实例环境。

Sonyflake 与 Snowflake

Snowflake 通常采用 时间 + 数据中心/机器 + 序列号 的设计,并使用 41 bit 时间(单位是毫秒,覆盖 69.7 年)、10 bit节点和 12 bit 序列号。Sonyflake 则重新调整了位分配,并提供更灵活的配置方式。两者核心思想一致,都是利用时间、节点和序列号解决分布式唯一 ID 问题。

Sonyflake v1 与 v2

Sonyflake v2 对 ID 结构进行了更灵活的配置,时间位数、Sequence 位数、Machine ID 位数以及时间单位都可以调整,而不是固定采用 v1 的默认布局。v2 因此更适合根据实际业务的节点规模、吞吐量和生命周期重新设计 ID 格式。

我的自定义方案

主要是考虑到可以预期的将来,没有机会开发 65536 个节点的系统,16 bit 可以拿出一点来好好利用。
我的方案采用 39 + 12 + 12:

  1. 39 bit 可以覆盖约 174 年 不变,时间生命周期基本足够。
  2. 12 bit Sequence 表示每毫秒最多 4096 个 ID,单节点理论吞吐约 40 万 ID/s。
  3. 12 bit Machine 拆成 4 bit Cluster ID + 8 bit Machine ID,即最多 16 个集群,每个集群最多 256 台机器。
    主要是一套系统多地部署的需求还是经常有的,这样就可以根据 ID 判断是来自哪套系统,方便排查问题。
    Cluster ID 可以在程序编译阶段注入,Machine ID 则依赖数据库来实现自动分配,参考《Sonyflake MachineID 分配方案》。
如果你有魔法,你可以看到一个评论框~