本文主要介绍 uid-generator (一种全局ID服务实现)
uid-generator介绍
全局ID服务是分布式服务中的基础服务,需要保持全局唯一,高效,高可靠性。有些时候还可能要求保持单调,但也并非一定要严格递增或者递减
全局ID也可以通过数据库的自增主键来获取,但是如果要求QPS很高显然是不现实的
uid-generator是对Snowflake算法的改进,也引入了高性能队列disruptor中RingBuffer思想,进一步提升了效率
+------+----------------------+----------------+-----------+
| sign | delta seconds | worker node id | sequence |
+------+----------------------+----------------+-----------+
1bit 28bits 22bits 13bits
sign 符号位 保证为正数
delta seconds 当前时间与约定时间的差值
word node id机器码
sequence 同一时刻支持并发数
上图就是snowflake算法生成的64位的长整型构成
uid-generator的work node id 使用了数据库自增主键的key,每次重启服务都需要刷新,这也保证了集群中全局ID的唯一性
worker node id字段处理
uid-generator使用数据库主键作为worker node id
这样看来这个worker node id其实可以有很丰富的扩展性,只要对表结构稍微修改,就可以记录使得worker node id 有更有意义的含义。
例如使用uid-generator生成的值作为表的主键ID,可以通过对WORKER_NODE表增加一列表名记录表,这样通过id就反向查找对应的表名
sequence字段的处理
uid-generator中实现了原生的snowflake以及缓存版的。这两个版本对于sequence字段的处理有所不同
DefaultUidGenerator.java
/**
* Get UID
*
* @return UID
* @throws UidGenerateException in the case: Clock moved backwards; Exceeds the max timestamp
*/
protected synchronized long nextId() {
long currentSecond = getCurrentSecond();
// Clock moved backwards, refuse to generate uid
if (currentSecond < lastSecond) {
long refusedSeconds = lastSecond - currentSecond;
throw new UidGenerateException("Clock