面试题:雪花算法(SnowFlake)如何解决时钟回拨问题
1. 雪花算法
雪花算法是一种分布式ID生成算法,首先它生产的是一个64bit位的ID,这64bit位中划分成多段:
- 第1个bit位:保留位,无实际作用
- 第2-42的bit位:这41位表示时间戳,精确到毫秒级别
- 第43-52的bit位:这10位表示专门负责生产ID的工作机器的id
- 第53-64的bit位:这12位表示序列号,也就是1毫秒内可以生成2122^{12}212个不同的ID
优点:
- 毫秒数在高位,自增序列在低位,整个ID都是
趋势递增
的。 - 作为DB表的主键,索引效率高。
- 不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。
- 高性能高可用:生成时不依赖于数据库,完全在内存中生成。
- 容量大,每秒中能生成数百万的自增ID。
- 可以根据自身业务特性分配bit位,非常灵活。
缺点:
- 强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。
- 不是严格全局递增的。
2. 时钟回拨问题
由于雪花算法是依赖于服务器的时间的,所以如果机器发生了故障或者别的情况,对服务器的时间进行了回拨,那么会导致生成的ID可能发生重复。
3. 解决方案
保存过去一段时间内每一台机器在当前这一毫秒产生的ID的最大值
,比如使用Map形式,就是<machine_id,max_id>,这样如果某台机器发生了时钟回拨,直接在这台机器对应的max_id的基础上继续自增生成ID即可。
THE END.
面试题:雪花算法(SnowFlake)如何解决时钟回拨问题相关推荐
- 雪花算法-Java实现-解决时钟回拨的一种方法
背景: 前不久发生了一次严重的生产事件, 与雪花算法有关,但不是雪花算法的问题 具体问题参考代码main中的注释, 结论如下 序列可以使用69年, 序列的长度变化是这样的, 假设以当前时间为初始化值 ...
- 雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论
文章目录 一.前言 二.雪花算法snowflake 1.基本定义 2.snowflake的优缺点 三.Java代码实现snowflake 1.组装生成id 2.计算最大值的几种方式 3.反解析ID 4 ...
- 分布式全局唯一ID生成算法(改进的雪花算法——解决时钟回拨问题)
改进的雪花算法--解决时钟回拨问题 原创 公众号: 软件设计活跃区 改进的雪花算法--姑且称为梨花算法吧(忽如一夜春风来,千树万树梨花开). 改进目标:解决雪花算法的时钟回拨问题:部分避免机器id重复 ...
- 记一次错误使用雪花算法引起的数据库主键冲突和解决时钟回拨问题
在分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUID,但是 UUID 有一些缺点,首先他相对比较长,另外 UUID 一般是无序的 有些时候我 ...
- 雪花算法通过顺序号持久化解决时钟回拨
在雪花算法自定义解决时钟回拨问题一文中,对雪花算法的时钟回拨解决思路进行了说明,由于顺序号保存在内存中,每次启动都是从初始值开始,在特定场景下,比如停止服务后进行了时钟回拨,在理论上,还是可能出现序列 ...
- Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID (Java版)
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...
- java 有穷自动机_Java实现雪花算法(snowflake)
本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...
- mysql snowflake_雪花算法-snowflake
雪花算法-snowflake 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有 ...
- java雪花_Java实现雪花算法(snowflake)
本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...
- 发号器:雪花算法(Snowflake)
雪花算法(Snowflake)是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器. 第一个bit位(1bit):Ja ...
最新文章
- 多线程下的HashMap竟然绕环了
- VC获取其他进程ListCtrl内容
- boost::fusion::cons用法的测试程序
- 你用或者不用:线程中synchronized关键字使用总结
- 全球计算机科学硕士申请,2019爱尔兰留学都柏林大学计算机科学硕士申请
- base cap 分布式_高并发架构系列:详解分布式一致性ACID、CAP、BASE,以及区别
- String类中IndexOf与SubString
- 前端学习(3282):立即执行函数
- 工程设计论——如何写好工程代码
- table表格 html 1128
- 机器视觉与Tesseract介绍
- Java List相关用法
- java shuffle list_static void shuffle(Listlt;?gt; list)_Java.util包|WIKI教程
- Echarts 3使用
- python读取tiff文件_怎么用python读取和写入TIFF文件1
- python初学入门教程_初学python编程入门教程
- 谢尔宾斯基三角形——python递归
- discuz 模板php,Discuz 模板语句分析及知识技巧
- js 打印 A-Z 字母
- linux网卡驱动离线安装_Linux下网卡驱动的安装