如何优化雪花算法的问题?

0
小熊
小熊
管理员提问于7月前

雪花算法的问题主要在于时间回拨出现id重复、机器id有上限

时钟回拨就是本机时间略快,完成时间服务器的校准(NTP或者闰秒回拨)以后,会出现时间倒退,导致生成ID重复

答案 1
0
最佳答案
小熊小熊 管理员回答于7月前

时钟回拨解决办法:
* 继续在当前ID序列号最大基础上增加,方案来自 snowflake算法的时钟回拨问题如何解决
* 如果时间偏差比较小,<=5ms 可以等待2倍时间,牺牲很短时间的可用性,方案来自 SnowFlakeID原理和改进优化
* 时间回拨跨度太大时告警,并摘除本身节点,只会影响一个节点
* 也可以考虑直接关闭时间同步

机器id有上限的解决办法(雪花算法优化)
* 百度(uid-generator)的解决办法是可以自定义各部分的位数,工作机器ID需要数据库中创建一个表,插入机器相关信息(host和port),再根据表的自增ID作为workID,重启服务就另申请workID
* 美团使用Leaf算法,可以基于号段模式或雪花算法,对号段模式优化 双buffer方案,提前加载下一号段;雪花算法借助zookeeper的持久顺序节点的特性配置workID(我想上容器的话直接使用hostname或者使用k8s中的sts也不错)
* 注意雪花算法实际上是趋势递增,而不是绝对递增,这是为了保证性能