欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

全局唯一ID

程序员文章站 2022-10-02 20:06:26
序言全局唯一ID在分布式系统当中的作用举足轻重。雪花算法也许是大家耳熟能详的一种方案,但其存在时间回拨可能引起ID重复的问题,网上也有很多能人异士通过特殊的处理降低时间回拨所带来的影响,但让本人来看,优化方案并没有那么好。本篇就给大家贡献一篇全局唯一ID的新方案。方案原理本篇所要描述的全局唯一ID方案,是受雪花算法的启发,但其方案已和雪花算法完全不同,整体上看本方案比雪花算法更加的简洁。了解雪花算法的都知道,64位的比特位,划了符号位,时间位,数据中心位(可没有),worker 位....

序言

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

方案

原理

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

 

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

 

系统架构

系统架构如图所示:

全局唯一ID

服务节点存在两种角色:

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

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

 

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

LeaderService: leader选举和epoch管理

SequenceApplyRpc:  follower和leader间的通信接口

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

时序图

全局唯一ID

ID生成方案

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

全局唯一ID

红色区域:符号位,确保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 !!!!

欢迎关注本人公号

全局唯一ID

 

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