柴宝欢乐多
2021-09-06 09:37
采纳率: 0%
浏览 82

关于雪花算法的时钟回拨问题

最近工作需要使用到分布式ID的生成,准备使用雪花算法来实现,看到雪花算法有时钟回拨问题存在,原始算法是直接抛异常,百度有一套解决方案,不过比较复杂需要引入额外中间件,有个疑问想问一下:
如果时钟回拨的时候,不能在上一次时间戳的基础上加1继续提供服务么?
比如上一次时间戳记载是100,下一次获取ID时发生了时钟回拨时间戳变成了95,那就把上一次时间戳+1变成101来使用不行么?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • 於黾 2021-09-06 09:57

    分布式计算,最好使用GUID,以保证主键不重复。
    如果你的算法高度依赖时间戳,那么系统自动对时就可能造成时间回调。
    至于你所谓的上一次时间,你准备用什么来记录呢,一个全局变量吗,也就是说你每生产一个ID,都要另存一份时间戳,还得去跟上一次存放的时间戳进行比较,这算法变复杂了变慢了不说,时间回调又不是一秒两秒的事,比如回调了5分钟,你怎么办,你要缓存多少份ID?你相当于自己独立实现了一份时间计数器,这性能上损耗是相当大的,而且算法越复杂出bug的可能性也就越大,是十分不靠谱的行为。
    与其担心时间回调造成ID重复,你不如从源头上着手解决时间回调的问题。要么不允许系统自动对时,不管它跟标准时间相差多少就让它线性的运行,反正你最终只是需要ID,数据库还会再记录当时的时间;要么干脆放弃时间强相关的设计,改为跟时间不相关的GUID等ID。

    1 打赏 评论
  • 咕泡-灰灰老师 2021-09-06 14:05

    这个可以是可以,但是你这样发生时间回拨,你的ID就不跟你的时间戳相关了,还有+1后,时间回拨弄好了后,就会有可能重复!除非你真的就不用时间戳

    打赏 评论

相关推荐 更多相似问题