1. 什么是时钟回拨问题
由于生成随机数时依赖于服务器的时间,加入机器发生了故障或者别的情况,对于服务器的时间进行了回拨,那么会导致生成的 ID 可能发生重复。
2. 雪花算法
雪花算法是一种分布式 ID 生成算法,首先它生产的是一个 64 bit 为的ID,这 64 bit 位中划分成多段:
第1个bit位:保留位,无实际作用
第2-42的bit位:这41位表示时间戳,精确到毫秒级别
第43-52的bit位:这10位表示专门负责生产ID的工作机器的id
第53-64的bit位:这12位表示序列号,也就是1毫秒内可以生成2的12方个不同的 ID
好处:
毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。
作为DB表的主键,索引效率高。
不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。
高性能高可用:生成时不依赖于数据库,完全在内存中生成。
容量大,每秒中能生成数百万的自增ID。
可以根据自身业务特性分配bit位,非常灵活。
缺点:
依赖于机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。
不是严格全局递增的
3. 解决方案
每个一段时间内保存过去一段时内 机器当前这一毫秒产生的 ID 的最大值,例如使用Map形式,就是<机器的id,最大值>,如果发生了时钟回拨,直接在这台机器对应的最大值继续自增生成 ID 即可。