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 即可。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐