在一个并发量很大的分布式系统中,各功能模块、各站点之间,很多时候有需求生成全局唯一ID,保证不能出现重复,长度尽量短。
各功能模块之前提前获取唯一ID,保证成功创建数据。
所以对该功能要求:高可用、速度快。
UidGenerator只是众多雪花中的一种
UidGenerator是百度开源的一款分布式高性能的唯一ID生成器,基于Snowflake算法的唯一ID生成器。在实现上, UidGenerator通过借用未来时间来解决sequence天然存在的并发限制; 采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, 同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万。
使用环境:Java8及以上版本, MySQL(启动阶段通过DB进行分配; 如自定义实现, 则DB非必选依赖)
下面是对Snowflake雪花算法介绍
snowflake算法是twitter开源的一个算法,被应用在很多服务中。雪花算法支持的TPS可以达到419万左右(2^22*1000)。
Snowflake
上图中主要由4个部分组成:
第一部分,1位为标识位,不用。
第二部分,41位,用来记录当前时间与标记时间twepoch的毫秒数的差值,41位的时间截,可以使用69年,T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
第三部分,10位,用来记录当前节点的信息,支持2的10次方台机器
第四部分,12位,用来支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号