雪花算法中的时间回拨问题解决方案
什么是时间回拨问题
- 雪花算法通过时间来即将作为id的区分标准之一,对于同一台id生成机器,它通过时间和序号保证id不重复
- 当机器出现问题,时间可能回到之前,此时,时间就不能区分
- 又或者因为闰秒的出现,导致时间回拨
如何解决
方法1 直接抛出异常
- 不管3X7==21,直接抛出异常
- 将问题交给人工解决
- 这种方法也是原始的雪花算法,百度的uid-generator采用的
- 太过简单,显然不好
方法2 延迟等待
- 这种时间回拨(回跳)或许只出现一次,也许只是机器出现了小问题,所以产生
- 对于这种场景,没有必要抛出异常,中断业务
- 此时,将当前线程阻塞3ms,之后再获取时间,看时间是否比上一次请求的时间大
- 如果大了,说明恢复正常了,则不用管
- 如果还小,说明真出问题了,则抛出异常,呼唤程序员处理
- 实际应用项目: 美团的leaf, 用如果时间差在5ms内,则等待 时间差<<1, 然后再判断
方法3 备用机
- 当前机器出现问题,则换一台机器
- 通过高可用来解决该问题
方法4 采用之前最大时间
- 本身得出时间回拨结论就是通过当前时间和上次最后(大)的时间进行比较
- 那么此时可以采用上次最大时间的最大序号之后的序号来进行继续使用
- 从而保证了唯一性
方法5 追赶时间
- 可以采取这样的暴力思路,因为当前的时间回拨了,比之前的时间慢
- 那么我们便加速追赶时间
- 首先,不返回id
- 然后将我们的seq增加比如1024个,然后判断是否回拨,如果不是,再加1024
- 当seq超过了12位的maxSeq时,按照雪花算法的逻辑,时间便会进位,借用下个时间的seq
- 此时就实现了时间的加速
- 经过若干个加速,则可以实现时间正常
雪花算法中的时间回拨问题解决方案相关推荐
- 雪花算法自定义解决时钟回拨问题
雪花算法默认算法生成一个 64bit的长整型(Long)数据.主要由 4部分组成,1bit符号位.41bit时间戳位.10bit工作进程位以及 12bit 序列号位. 正常情况下,该算法可以保证系统中 ...
- sharding jdbc 的雪花算法中的属性worker.id和max.vibration.offset
雪花算法生成的id总共64位8个字节,结构如下: 符号位 时间位 工作机器标识位 序列位 1位(固定位0) 41位 10位 12位 worker.id sharding jdbc 4.1.1使用雪花 ...
- 通过PowerMockito来模拟时钟回拨, 验证改进版雪花算法是否起效
改进版雪花算法详见上篇传送门 简单说明: 通过PowerMockito来mock雪花算法中获取时间的算法, 从而实现伪造时间覆盖. 测试类 import org.junit.Assert; impor ...
- 从sharding-jdbc看如何解决雪花算法的时钟回拨问题
SNOWFLAKE SNOWFLAKE(雪花算法)是默认使用的主键生成方案,生成一个 64bit的长整型(Long)数据. sharding-jdbc 中雪花算法生成的主键主要由 4部分组成,1bit ...
- 雪花算法通过顺序号持久化解决时钟回拨
在雪花算法自定义解决时钟回拨问题一文中,对雪花算法的时钟回拨解决思路进行了说明,由于顺序号保存在内存中,每次启动都是从初始值开始,在特定场景下,比如停止服务后进行了时钟回拨,在理论上,还是可能出现序列 ...
- 【黄啊码】百万级别订单量,如何生成唯一订单ID(雪花算法)
Twitter-SnowFlake算法的产生是源于Twitter为了满足自己业务(每秒上万条消息的请求,每条消息都必须分配一条唯一的id,并且在分布式系统中不同机器产生的id必须不同)的需求. sno ...
- 分布式--雪花算法--使用/原理/实例
原文网址:分布式--雪花算法--使用/原理/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍分布式中的雪花算法.包括:用法.原理. 雪花算法用于生成全局的唯一ID. 使用时的注意事项 需要 ...
- 线上故障之-雪花算法重复、序列化、redis锁失效、double精准计算
线上故障之-雪花算法重复.序列化.redis锁失效.double精准计算 雪花算法重复 问题发现 定位 影响范围 解决方案 扩展-雪花算法原理分析: 序列化 运营商 POP 裸机搭售自营套餐事故分析 ...
- SnowFlake 雪花算法详解与实现
我是陈皮,一个在互联网 Coding 的 ITer,个人微信公众号「陈皮的JavaLib」关注第一时间阅读最新文章. 文章目录 背景 SnowFlake 雪花算法 算法实现 算法验证 算法优缺点 注意 ...
最新文章
- 虚幻引擎5:从零开始的蓝图近战AI学习教程
- mysql反弹提权_MySQL数据库反弹端口连接提权
- PIE SDK热力图
- 项目上线,php的错误信息必须不让其在页面中显示给客户,
- DataGridView中回车键的妙用
- 如何处理SAP Fiori Launchpad KPI tile点击后出现的错误消息
- SM66 does not have debug button in Q system
- CentOS6.5搭建SVN服务器(Apache+SVN)
- 如何确定你的伴侣真的爱你?复杂数学公式告诉你
- ext get id js_Ext.getCmp(“id”) 简单应用 | 学步园
- php ajax无刷新翻页,php ajax 无刷新翻页实现代码
- 爬虫文件存储-2:MongoDB
- vs2013 使用vs调试器,发现调试器显示的数据错误。查看内存,发现内存是正确的。...
- ACM算法笔记(一)模拟算法【详细解析】
- QGIS教程—缓冲区buffer
- iTerm2配置(rz/sz命令)
- 浅谈token是什么?
- Ubuntu Linux DNS服务器 BIND9配置文件命令介绍
- 高等数学(Calculus I)
- ext4文件系统布局
热门文章
- CF1364D Ehab‘s Last Corollary
- selenium python 简书_通过python+selenium3实现浏览器刷简书文章阅读量
- 空间向量模型和tf-idf
- 机器学习面试题之机器学习基础(一)
- C语言和JAVA的区别在哪里?
- oracle报错解决
- 学习ARM开发(11)
- clr(clr a是什么指令)
- Codeforces Round #644 (Div. 3) D.Buying Shovels
- Codeforces Round #644 (Div. 3) F.Spy-string