首页 > 编程语言 >雪花算法中的时间回拨问题5种方案

雪花算法中的时间回拨问题5种方案

时间:2023-04-14 18:58:56浏览次数:33  
标签:seq 雪花 回拨 算法 时间 id

什么是时间回拨问题

  • 雪花算法通过时间来即将作为id的区分标准之一,对于同一台id生成机器,它通过时间和序号保证id不重复
  • 当机器出现问题,时间可能回到之前,此时,时间就不能区分
  • 又或者因为闰秒的出现,导致时间回拨

如何解决

方法1 直接抛出异常

  • 不管3X7==21,直接抛出异常
  • 将问题交给人工解决
  • 这种方法也是原始的雪花算法,百度的uid-generator采用的
  • 太过简单,显然不好

方法2 延迟等待

  • 这种时间回拨(回跳)或许只出现一次,也许只是机器出现了小问题,所以产生
  • 对于这种场景,没有必要抛出异常,中断业务
  • 此时,将当前线程阻塞3ms,之后再获取时间,看时间是否比上一次请求的时间大
  • 如果大了,说明恢复正常了,则不用管
  • 如果还小,说明真出问题了,则抛出异常,呼唤程序员处理
  • 实际应用项目: 美团的leaf, 用如果时间差在5ms内,则等待 时间差<<1, 然后再判断

方法3 备用机

  • 当前机器出现问题,则换一台机器
  • 通过高可用来解决该问题

方法4 采用之前最大时间

  • 本身得出时间回拨结论就是通过当前时间和上次最后(大)的时间进行比较
  • 那么此时可以采用上次最大时间的最大序号之后的序号来进行继续使用
  • 从而保证了唯一性

方法5 追赶时间

  • 可以采取这样的暴力思路,因为当前的时间回拨了,比之前的时间慢
  • 那么我们便加速追赶时间
  • 首先,不返回id
  • 然后将我们的seq增加比如1024个,然后判断是否回拨,如果不是,再加1024
  • 当seq超过了12位的maxSeq时,按照雪花算法的逻辑,时间便会进位,借用下个时间的seq
  • 此时就实现了时间的加速
  • 经过若干个加速,则可以实现时间正常

 

标签:seq,雪花,回拨,算法,时间,id
From: https://www.cnblogs.com/shoshana-kong/p/17319307.html

相关文章

  • J8、Inception v1算法实战与解析
    ......
  • 雪花算法那些事
    对id的要求业务全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。信息安全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可;如果是订单号就更危险了,竞对可以直接知道我们一天的单量。所以在一些应用场景下,会需要ID无规则、不规则。......
  • 雪花算法的详解及时间回拨解决方案
     ......
  • 二叉树先序,中序,后序遍历的非递归算法(一)
    前序遍历的非递归算法<法一>思路:二叉树的前序遍历过程:从树根开始沿着左子树一直深入,直到最左端无法深入时,返回;进入最近深入时遇到结点的右子树,再进行如此的深入和返回;直到最后从根节点的右子树返回到根节点为止;由其深入返回的过程我们知道可以用一个栈来帮助我们消除递归......
  • 排序算法-选择排序
    排序算法-选择排序1.简单选择排序SelectSort1.1SelectSort介绍简单选择排序(selectSort)的基本思想是:每一轮排序都从待排序的序列(无序区)中选取一个最小值,并将其与无序区的第一个元素进行交换,此时有序区长度+1,无序区长度-1。重复上述过程直至整个序列完成排序。1.2图......
  • 时序建模算法库PaddleTS技术与实践1
            ......
  • 谷歌优化2023算法揭秘:适应新变化,把握核心策略
    作为一名有多年运营经验的站长,我深知谷歌SEO的重要性。随着谷歌优化2023算法的发布,许多站长都在寻找新的策略来适应变化。在这篇文章中,我将分享一些关于新算法的见解和应对方法。1.了解谷歌优化2023算法的变化了解新算法的变化是站长们应对新算法的第一步。谷歌优化2023算法更加注......
  • 雪花算法那些事
    对id的要求业务全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。信息安全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可;如果是订单号就更危险了,竞对可以直接知道我们一天的单量。所以在一些应用场景下,会需要ID无规则、不规则。......
  • java 垃圾回收算法
    标记-清除把非垃圾对象进行标记,把未标记的进行清除。这是最基础的算法,别的算法都是基于此不断改进不足的地方效率不高(要看跟谁比,比如标记-复制就要快些)内存碎片:会产生大量不连续的内存碎片,导致可能无法给大对象分配内存标记-整理还是要先标记哪些对象是垃圾,标记了先不着......
  • Java中常用排序算法及示例-冒泡排序、希尔排序、选择排序、插入排序、合并排序、基数
    场景Java中需要对数据进行排序处理,常用的排序算法以及示例进行归纳整理。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现1、冒泡排序冒泡排序法又称为交换排序法,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较。如此扫描......