snowflake算法的时钟回拨问题如何解决(面试)

snowflake算法的时钟回拨问题如何解决

snowflake算法:一串数字,用很多的二进制里的bit位,去代表不同的东西;40多位都是当前机器上的时间,中间有几位是代表的是机器id,自增长的id;

分布式业务系统,分布在很多台机器上,这很多台机器都要生成唯一的id,不能重复,此时可以调用某台机器上的snowflake算法生成的唯一id;

12:00:00 500 28 1~20

12:00:04 300 28 1~20

12:00:05 308,当前你的snowflake算法部署的机器发生了本地时钟的回拨,时间回拨到了12:00:00 500这个时间。

判断是否发生了时钟回拨,当前时间比我上一次生成id的时间要小,此时就是发生了时钟回拨问题,12:00:00 500 28 1~20,snowflake算法生成的不重复的id,此时会导致生成的id是重复的,这就比较坑了。

比较简单容易理解的思路,当前的机器的可能会跟一台基准时间服务器进行时间校准,导致你的机器的时间本来跑的稍微快了一点,此时跟基准时间服务器进行了校准,你的时间回拨回去了,倒退回去了。

你在内存里把过去1个小时之内生成的每一毫秒的每台机器生成的id都在内存里保存最大的那个id。

如果发生下面的情况:

12:00:00 500 28 20

12:00:04 300 28 8

如果发生了时钟回拨,此时你看看时钟汇报到了之前的哪一毫秒里去,直接接着在那一毫秒里的最大的id继续自增就可以了。

只需要拿最大的id然后自增就行了:

12:00:00 500 28 21

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值