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