现在我们开发的系统都越来越复杂,以前那种单一的系统已经不再适合如今业务快速增长的今日。现在的系统基本上都是采用分布式架构,将业务都拆分在不同应用中。那么就有一个问题,如何使用唯一不重复的ID呢?
今天给大家介绍这款开源软件就能很好解决分布式系统的唯一ID问题
一、UidGenerator简介
UidGenerator是百度开源的Java语言实现,基于Snowflake算法的唯一ID生成器。
它是分布式的,并克服了雪花算法的并发限制。
单个实例的QPS能超过6000000。
需要的环境:JDK8+,MySQL(用于分配WorkerId)
二、雪花算法snowflake
由下图可知,雪花算法的几个核心组成部分:
1为sign标识位;
41位时间戳;
10位workId(数据中心+工作机器,可以其他组成方式);
12位自增序列;
但是百度对这些组成部分稍微调整了一下:
由上图可知,UidGenerator的时间部分只有28位,这就意味着UidGenerator默认只能承受8.5年(2^28-1/86400/365)
也可以根据你业务的需求,UidGenerator可以适当调整delta seconds、worker node id和sequence占用位数。
三、如何使用UidGenerator 生成全局唯一ID
开发环境: springboot,mybatis
由于UidGenerator没有上传jar包到maven仓库上,需要从GitHub上上面下载源码,自己打成jar包安装到maven本地库中。
官方文档
UidGenerator源码地址(https://github.com/baidu/uid-generator)
UidGenerator官方中文文档(https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md)
1.新建springboot项目
如果不会springboot,请参考springboot教程。
pom.xml
2.添加数据库和mybatis依赖
3.最后添加uid-generator 依赖
4. 新建表结构
在数据库中创建uid-generator 依赖的表结构
sql语句如下:
5.复制WorkerNodeDAO
从uid-generator 源码中复制WorkerNodeDAO到自己项目,改名WorkerNodeMapper,并去掉@Repository注解,添加@Mapper
6.复制WORKER_NODE.xml文件
把WORKER_NODE.xml文件拷贝到resource的目录下,改名为WorkerNodeMapper.xml,并把里面的namespace="com.baidu.fsg.uid.worker.dao.WorkerNodeDAO"改为自己项目中的WorkerNodeMapper。
7.复制DisposableWorkerIdAssigner类
复制DisposableWorkerIdAssigner类到自己的工程中,并把里面依赖的WorkerNodeDAO 改为本地新增的WorkerNodeMapper,并添加@Component 注解
8.修改mybatis配置
在application.yml配置文件中修改mybatis的配置,添加com.baidu.fsg.uid.worker.entity 扫描
9.添加UidGenerator配置,并添加扫描路径
10.添加单元测试类
只需引入cachedUidGenerator bean实例,直接调用cachedUidGenerator.getUID()方法即可生成uid
每生成一个uid都会往WORKER_NODE表中插入一条记录
四、UidGenerator的说明
UidGenerator提供两种方式实现:DefaultUidGenerator和CachedUidGenerator。
DefaultUidGenerator
DefaultUidGenerator是UidGenerator 默认的实现方式
参数
说明
timeBits
相对于时间基点"2016-05-20"的增量值,单位:秒,可使用的时间为2^timeBis 秒例如:timeBits=30,则可使用230秒,约34年,timeBits=31,则可使用231秒,约68年
workerBits
机器id,最多可支持2^22约420w次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,每次启动都会重新生成一批ID,因此重启次数也是会有限制的,后续可提供复用策略。
seqBits
每秒下的并发序列,9 bits可支持每台服务器每秒512个并发。
epochStr
指集成UidGenerator生成分布式ID服务第一次上线的时间,可配置,也一定要根据你的上线时间进行配置,因为默认的epoch时间可是2016-09-20,不配置的话,会浪费好几年的可用时间。
CachedUidGenerator
CachedUidGenerator是UidGenerator的重要改进实现
参数
说明
boostPower
RingBuffer size扩容参数, 可提高UID生成的吞吐量默认:3, 原bufferSize=8192, 扩容后bufferSize= 8192 << 3 = 65536
paddingFactor
指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50举例: bufferSize=1024, paddingFactor=50 -> threshold=1024 * 50 / 100 = 512.当环上可用UID数量 < 512时, 将自动对RingBuffer进行填充补全
scheduleInterval
另外一种RingBuffer填充时机, 在Schedule线程中, 周期性检查填充默认:不配置此项, 即不实用Schedule线程. 如需使用, 请指定Schedule线程时间间隔, 单位:秒
欢迎大家留言讨论
评论留言