此篇内容参考《亿级流量Java高并发与网络编程实战》
在分布式系统中,为了解决在不同的服务器上产生唯一的ID值的问题,通常有以下三种方法:
- 使用数据库的自增特性,不同节点直接使用相同数据库的自增ID值。
- 使用UUID算法产生ID值。
- 使用SnowFlake算法产生ID值。
这里讨论由Twitter提出的生成ID的SnowFlake算法,又称为雪花算法,该算法会生成一个64bit的整数,其中只使用了63bit,一共可以表示2^{63}个ID值,或者说是922 3372 0368 5477 5808个ID值。
其结构如下所示:
63 | 62~22 | 21~12 | 11~0 |
---|---|---|---|
未使用 | 41bit的时间戳 | 10bit的机器码 | 12bit的序列号(递增) |
其中,41bit的时间戳,若采用1ms作为时间单位,则可以表示69年左右的时间范围。
10bit的机器码可以分解为5bit地理位置+5bit机器编号的形式,也可以将机器的MAC或IP地址等唯一标识符转换为10bit机器码。