snowflake
缺点:强依赖机器时钟,存在时钟回拨问题(会导致重复的ID⽣成)
uid-generator
uid-generator是由百度开源的基于Snowflake算法的唯⼀ID⽣成器,使⽤java语⾔实现。uid-generator以组件形式⼯作在应⽤项⽬中, ⽀持⾃定义workerId位数和初始化策略, 从⽽适⽤于docker等虚拟化环境下实例⾃动重启、漂移等场景。 在实现上, uid-generator通过借⽤未来时间来解决sequence天然存在的并发限制; 采⽤RingBuffer来缓存已⽣成的UID, 并⾏化UID的⽣产和消费, 同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万。
uid-generator项⽬详情: 请点击
uid-generator对Snowflake算法⽣成的ID构造做了调整,如下:
uid-generator snowflake id
worker node id 为每个⼯作节点的ID(机器、应⽤实例),uid-generator提供接⼝可由⽤户⾃⾏实现其⽣成⽅式,默认是基于数据库⽣成。
uid-generator解决时间回拨问题、提升性能主要是通过如下技术⼿段实现:
1、动态递增worker node id : 每次启动都会往数据库WORKER_NODE表中插⼊⼀条记录,插⼊成功后返回的该数据对应的⾃增唯⼀主键,此主键就作为该应⽤实例的worker node id 。保证每个应⽤实例、每次启动所获取的worker node id 都不同,因此不会出现⽣成重复的ID。即使时钟回拨,因为workerId不同,也不会出现ID冲突
2、RingBuffer: RingBuffer本质是⼀个数组,uid-generator利⽤RingBuffer数据结构预先⽣成若⼲个ID并缓存,当需要获取ID时候,如果数组中有则优先使⽤缓存的ID,这样可极⼤提⾼效率与吞吐量
3、未来时间:⼤部分snowflake算法的实现都会使⽤System.currentTimeMillis()来获取时间戳,这样严重依赖服务器的时间。uid-generator 使⽤填充完RingBuffer时的时间戳作为lastSecond(AtomicLong类型),下次填充时使⽤lastSecond.incrementAndGet()来获取新的时间戳,⾮使⽤System.currentTimeMillis(),规避了时钟回拨问题。
uid-generator-starter
从官⽹说明或者其他⽹上的使⽤教程可见,将uid-generator集成到springboot项⽬中,还是有点⼩⿇烦的。uid-generator-starter对uid-generator进⾏了Springboot Starter风格的封装,只要⼀⾏注解便可将其集成到项⽬中,同时还增加⼀些实⽤的特性:
1. spring-boot-starter风格的开箱即⽤。
2. 可为uid-generator独⽴设置数据源,和业务系统的主数据源分开。springboot结构
3. ⽀持使⽤ZooKeeper进⾏WORKER ID分配,藉由ZK的Paxos强⼀致性算法获取更⾼的可⽤性。
开源地址
github:uid-generator-starter
如果此⼯具对你有帮助,请在github中Star⽀持下
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论