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

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

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

  • 写回答

2条回答 默认 最新

  • 於黾 2021-09-06 09:57
    关注

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

    评论

报告相同问题?

问题事件

  • 创建了问题 9月6日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog