UidGenerator 重生的Snowflake

106 阅读1分钟

问题陈述

snowflake的问题:

    时间回拨问题:时间回拨时有可能有重复id

    并发问题:一秒并发8196个,高峰时有问题

    伪共享问题:高峰并行消费时,如何保障消费到的id不给别的线程或者进程使用,从而避免生产端是唯一的,但是消费端不是。

目标

解决上面2个问题,而且支持分布式

非目标

    api接口提供部分不在此说明。

    高峰消费流程时合理的集合取数逻辑,也就是一次取多少个才合理的估算办法,不在此说明。

提议的解决方案

UidGenerator通过借用未来时间来解决sequence天然存在的并发限制; 

RingBuffer of UID + RingBuffer of Flag解决并发问题与伪共享问题

采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, 同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题.

github.com/baidu/uid-g…

参考:

uid-generator/README.zh_cn.md at master · baidu/uid-generator · GitHub