浅谈解决雪花算法的时钟回拨问题

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值