问题陈述
snowflake的问题:
-
时间回拨问题:时间回拨时有可能有重复id
-
并发问题:一秒并发8196个,高峰时有问题
-
伪共享问题:高峰并行消费时,如何保障消费到的id不给别的线程或者进程使用,从而避免生产端是唯一的,但是消费端不是。
目标
解决上面2个问题,而且支持分布式
非目标
-
api接口提供部分不在此说明。
-
高峰消费流程时合理的集合取数逻辑,也就是一次取多少个才合理的估算办法,不在此说明。
提议的解决方案
UidGenerator通过借用未来时间来解决sequence天然存在的并发限制;
RingBuffer of UID + RingBuffer of Flag解决并发问题与伪共享问题
采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, 同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题.
参考:
uid-generator/README.zh_cn.md at master · baidu/uid-generator · GitHub