Optimized 'snowflake' ID generator. Compatible time backtracking.
- 不依赖中心服务器
- 随机性高
- 受时间回拨影响较大
- 可支持的工作线程为1024个
- 调整时间微秒至秒
- 调整实例ID至最后,在单实例上的服务上可以实现按照大小对比顺序
A. 0 1bit 不用。
B. 32位 秒级
C. 16位 序列号 6.5万 单进程不需要扩容
D. 15位 3.2万 最大支持160个实例,每个实例100线程或者进程。可以按照不同的业务进行区分。
每秒容量 2^31 = 21.47亿。原方案 每秒支持 41.9亿
总容量支撑135.8年,2^32/86400/366=135.8。原方案 可以支持 68年
机器码采用redis incr方案,或者使用MySQL 自增ID。不需要考虑这个服务的性能,只有启动及特殊情况需要进行同步。
把毫秒转换到秒之后,富余了9位,可以留给后面进程使用。
原方案的时间兼容性 较低,只支持1024个节点。假设机器ID需要复用,就必定会出现重复ID 扩充机器ID从10到15,扩充序列号从12到16。 机器ID扩大32倍之后,给了我们很大的可操作空间。比如可以随时更换新ID,而不是唯一。可以按照业务分配ID,用以区分。
初始数字可以使用随机,而不是从0开始 0~2^10,这样对于避免猜出实际调用量有意义。
性能测试,一秒钟能生成5亿。大多数时间消耗在了时间获取上。