什么是雪花算法?
雪花算法是Twitter开源的一种高效的分布式id生成算法.其id主要有以下几个部分组成:
固定的1位,
表示时间戳的41位,
表示机器的10位,
区分同毫秒内的的id.(同毫秒内自增)雪花算法的优点:
- 生成的id具有递增特点,对B-Tree的存储结构友好(避免页分裂)
- 不依赖第三方系统, 以服务的方式部署,可实现高性能,高可用性
- 可根据具体情况配置bit数
雪花算法的缺点:
强依赖机器时钟, 如果发生时钟重拨,则会导致生成id不唯一.为啥么会发生时钟重拨:
- 可能人工修改了系统时间
- 多机器同步系统时间后,当有机器存在误差时,可能出现时钟重拨.
- 如何解决时钟重拨问题带来的影响?
- 对于每个要新上的节点,需要有检测异常的能力(通过线上定时持久化系统时间,上线时比对即可;以及上线时同其他机器平均值比对与阈值对比),发现时钟回拨了就不要上线
通过1,我们只用解决线上机器发生了时钟重拨的问题
- 当重拨时间微小时,可以考虑等待原时间再开始生成id
- 当重播时间误差大时,要么直接抛错误,要么利用扩展位发生时钟重拨后将扩展位加一
- 机器检测到自身时钟回拨后,进行上报,摘除自身节点.然后重新上新节点