雪花算法

什么是雪花算法

雪花算法用于生成全局唯一ID

符号位 | 时间戳 | 机器码 | 序列号

符号位:占一位,固定为0

时间戳:占41位(毫秒级),当前Unix时间-自定义时间

机器ID:占10位

序列号:占12位,同一毫秒内递增有序

雪花算法生成的ID为什么是有序的?

  • 高位是时间戳

  • 时间戳随时间递增

  • 同一时间内按序列号递增

雪花算法生成的ID是绝对有序的吗?

不是100%全局有序的

时钟回拨问题:回调时间,可能会生成重复ID

解决办法:

等待补偿:检测到时间回拨之后,程序进入休眠至时间追平

回拨容错位:在机器位预留几位,发生时间回拨之后进行标记,防止重复

机器位重复:生成相同的机器位

解决办法:使用Zookeeper动态分配机器ID