当前位置: 移动技术网 > 科技>人工智能>物联网 > 全局唯一ID

全局唯一ID

2020年07月19日  | 移动技术网科技  | 我要评论

序言

全局唯一ID在分布式系统当中的作用举足轻重。雪花算法也许是大家耳熟能详的一种方案,但其存在时间回拨可能引起ID重复的问题,网上也有很多能人异士通过特殊的处理降低时间回拨所带来的影响,但让本人来看,优化方案并没有那么好。本篇就给大家贡献一篇全局唯一ID的新方案。

方案

原理

本篇所要描述的全局唯一ID方案,是受雪花算法的启发,但其方案已和雪花算法完全不同,整体上看本方案比雪花算法更加的简洁。

 

了解雪花算法的都知道,64位的比特位,划了符号位,时间位,数据中心位(可没有),worker 位, 序列号位, 而时间回拨的问题正是影响了时间位,才导致可能出现ID重复的,因此本篇所要介绍的方案除了抛弃了时间位,亦没有数据中心,worker等位, 仅仅只有 epoch(周期) 和 序列号。

 

系统架构

系统架构如图所示:

服务节点存在两种角色:

  • follower: 对外提供获取ID的服务,向leader 申请序列号区间

  • leader: 对外提供获取ID的服务,向follower提供获取序列号区间的服务,并管理epoch的更新

 

IDService: 对外提供获取ID的服务接口

LeaderService: leader选举和epoch管理

SequenceApplyRpc:  follower和leader间的通信接口

zookeeper: 用于集群中节点间的协调以及epoch的持久化存储

时序图

ID生成方案

本篇和雪花算法一样,也是64位比特位(long), 划分方式如下图所示:

红色区域:符号位,确保ID是正数

蓝色区域:占31位,epoch值,表示周期

黑色区域:占32位,表示序列号

 

ID计算方式如下:

long ID = (epoch << 31) | sequenceNumber

 

epoch 管理

本方案的核心就是epoch的管理, 但总的来说也是非常的通俗易懂的。epoch,表示为周期,意思就是说, 在同一个周期内, 集群中的follower节点向leader节点申请一批的序列号(区间), 那么集群中每一个节点在序列号区间用完之前,不会和leader节点交互, 等同于说,这期间的操作都是纯内存操作,因此这保证了性能。

 

在整个全局唯一ID的集群运行过程中,必然会碰到epoch 变更的时机, 下面就介绍epoch的更新时机:

  • 在同一epoch周期内,序列号用完,也就是序列号达到了最大值(~((long)-1 << 32)), 那么此时epoch值加1, leader节点序列号重置为1, follower 再次申请序列号区间时,会直接进入到下一个周期内

  • leader变更, leader发生变化, 触发leader选举, 新leader将epoch加1, follower感知到leader变更,将向新leader申请新的序列号区间,即使follower感知leader变更存在延迟,也不会出现ID重复,因为在旧的epoch时, 其ID值就是唯一的, 感知到leader变更的follower会进入到下一个周期,自然不会和旧的重复。

 

源码传送门

结束

Everybody ! The End !!!!

欢迎关注本人公号

 

本文地址:https://blog.csdn.net/AWEI1024/article/details/107419135

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网