首页> 中国专利> 一种基于分布式ID生成的避免ID碰撞的升级方法

一种基于分布式ID生成的避免ID碰撞的升级方法

摘要

本发明公开了一种基于分布式ID生成的避免ID碰撞的升级方法,包括以下步骤:设计64位ID设计,建立ID碰撞双缓冲池,将ID碰撞双缓冲池分为碰撞缓冲池和预热缓冲池,碰撞缓冲池初始化时,将碰撞表中ID在范围区间的所有ID填充到缓冲池,预热缓冲池在发ID时,即时检查缓冲池中剩余碰撞ID数量,如小于设定阈值,则触发从碰撞表中加载下一个时段的碰撞ID至新ID碰撞缓冲池,定时记录本机时间至数据库,下次系统启动时候检测是否发生大步长时钟回拨,发现则报警,该发明通过初始化填充和异步实时填充方式,最大限度的保证了Id冲突的校验都从缓冲区发起,而不直接通过查库校验,减少数据库压力,同时降低查询开销,提升明显。

著录项

  • 公开/公告号CN112506929A

    专利类型发明专利

  • 公开/公告日2021-03-16

    原文格式PDF

  • 申请/专利权人 北京致远互联软件股份有限公司;

    申请/专利号CN202011478781.7

  • 发明设计人 李强;胡守云;

    申请日2020-12-15

  • 分类号G06F16/22(20190101);G06F16/245(20190101);G06F16/27(20190101);

  • 代理机构11638 北京权智天下知识产权代理事务所(普通合伙);

  • 代理人王新爱

  • 地址 100089 北京市海淀区北坞村路甲25号静芯园N座

  • 入库时间 2023-06-19 10:16:30

说明书

技术领域

本发明涉及基于分布式ID生成的避免ID碰撞的升级方法技术领域,具体为一种基于分布式ID生成的避免ID碰撞的升级方法。

背景技术

UUID简称通用唯一识别码是128位长的数字,常见的划分格式是8-4-4-4-12的部分,每一位是一个16进制的数字。另一种划分格式是采用高低位表示:高64位-低64位,每部分用一个64位长整型数据存储。UUID通常由以下几部分组成:当前日期和时间+时钟序列+全局唯一的IEEE机器识别号。鉴于UUID重复的概率非常的低且具有随机性,本地生成具有相当高的性能,但是这种ID长度过长,占用空间过大,且不具备主键索引需要的递增特性,不能有效利用索引组织表的性能,因此,亟待一种改进的技术来解决现有技术中所存在的这一问题。

发明内容

本发明的目的在于提供一种基于分布式ID生成的避免ID碰撞的升级方法,通过初始化填充和异步实时填充方式,最大限度的保证了Id冲突的校验都从缓冲区发起,而不直接通过查库校验,减少数据库压力,同时降低查询开销,由于id的生成对于任何服务都是一个极度高频的操作,优化在原方案的基础上提升性能接近100%,提升明显,以解决上述背景技术中提出的问题。

为实现上述目的,本发明提供如下技术方案:一种基于分布式ID生成的避免ID碰撞的升级方法,包括以下步骤:

步骤一:高位取从XX年X月X日到现在的毫秒数,预留40bit给毫秒数,每秒的单机高峰并发量小于2W,预留5bit给每毫秒内序列号,5年内机房数小于4个,预留2bit给机房标识,每个机房小于100台机器,预留7bit给每个机房内的服务器标识,剩余10位作为业务线号或进程号使用;

步骤二:建立ID碰撞双缓冲池,将ID碰撞双缓冲池分为碰撞缓冲池和预热缓冲池;

步骤三:碰撞缓冲池初始化时,将碰撞表中ID在范围区间的所有ID填充到缓冲池,预热缓冲池在发ID时,即时检查缓冲池中剩余碰撞ID数量,如小于设定阈值,则触发从碰撞表中加载下一个时段的碰撞ID至新ID碰撞缓冲池;

步骤四:定时记录本机时间至数据库,下次系统启动时候检测是否发生大步长时钟回拨,发现则报警。

优选的,所述步骤一中每个机房每个机器生成的ID不同。

优选的,所述步骤一中同一个机器,每个毫秒内生成的ID不同且以序列号区区分。

优选的,所述步骤一中毫秒数放在最高位以保证生成的ID是趋势递增的。

优选的,所述步骤一中业务线号或进程号互不相同。

优选的,所述步骤三中碰撞缓冲池用于缓存一段时间内从ID全局碰撞表中获取到的可能碰撞的ID号范围列表。

优选的,所述步骤三中预热缓冲池用于缓存一段时间内新生成的ID号范围。

与现有技术相比,本发明的有益效果是:

通过初始化填充和异步实时填充方式,最大限度的保证了Id冲突的校验都从缓冲区发起,而不直接通过查库校验,减少数据库压力,同时降低查询开销,由于id的生成对于任何服务都是一个极度高频的操作,优化在原方案的基础上提升性能接近100%,提升明显。

附图说明

图1为碰撞双缓冲池填充时机流程示意图。

图2为系统时钟校正流程示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

请参阅图1-2,本发明提供一种技术方案:一种基于分布式ID生成的避免ID碰撞的升级方法,包括以下步骤:

步骤一:高位取从XX年X月X日到现在的毫秒数,预留40bit给毫秒数,每秒的单机高峰并发量小于2W,预留5bit给每毫秒内序列号,5年内机房数小于4个,预留2bit给机房标识,每个机房小于100台机器,预留7bit给每个机房内的服务器标识,剩余10位作为业务线号或进程号使用;

步骤二:建立ID碰撞双缓冲池,将ID碰撞双缓冲池分为碰撞缓冲池和预热缓冲池;

步骤三:碰撞缓冲池初始化时,将碰撞表中ID在范围区间的所有ID填充到缓冲池,预热缓冲池在发ID时,即时检查缓冲池中剩余碰撞ID数量,如小于设定阈值,则触发从碰撞表中加载下一个时段的碰撞ID至新ID碰撞缓冲池;

步骤四:定时记录本机时间至数据库,下次系统启动时候检测是否发生大步长时钟回拨,发现则报警。

其中,步骤一中每个机房每个机器生成的ID不同,步骤一中同一个机器,每个毫秒内生成的ID不同且以序列号区区分,步骤一中毫秒数放在最高位以保证生成的ID是趋势递增的,步骤一中业务线号或进程号互不相同。

其中,步骤三中碰撞缓冲池用于缓存一段时间内从ID全局碰撞表中获取到的可能碰撞的ID号范围列表,步骤三中预热缓冲池用于缓存一段时间内新生成的ID号范围。

实施例一:

步骤一:高位取从2020年1月1日到现在的毫秒数,假设系统至少运行30年,那至少需要30年*365天*24小时*3600秒*1000毫秒=946*10^9,差不多预留40bit给毫秒数,每秒的单机高峰并发量小于2W,预留5bit给每毫秒内序列号,5年内机房数小于4个,预留2bit给机房标识,每个机房小于100台机器,预留7bit给每个机房内的服务器标识,剩余10位作为业务线号或进程号使用;

步骤二:建立ID碰撞双缓冲池,将ID碰撞双缓冲池分为碰撞缓冲池和预热缓冲池;

步骤三:碰撞缓冲池初始化时,将碰撞表中ID在范围区间的所有ID填充到缓冲池,预热缓冲池在发ID时,即时检查缓冲池中剩余碰撞ID数量,如小于设定阈值,则触发从碰撞表中加载下一个时段的碰撞ID至新ID碰撞缓冲池;

步骤四:定时记录本机时间至数据库,系统启动时候检测未发生大步长时钟回拨,无需报警。

对1000万的Id生成重复测试和16个线程的并发生成测试,目前吞吐量测试是6万+/秒,与性能测试库6亿+个ID对,16位的ID 29万个,生成16位ID目前与老系统可能重复概率接近万分之5。

相比建立16位ID碰撞全局表,找出库中所有全量16位ID入表,发新Id号时到该表做重复查询校验,采用新的ID碰撞双缓冲池方案可以显著提升性能。

通过初始化填充和异步实时填充方式,最大限度的保证了Id冲突的校验都从缓冲区发起,而不直接通过查库校验,减少数据库压力,同时降低查询开销,由于id的生成对于任何服务都是一个极度高频的操作,优化在原方案的基础上提升性能接近100%,提升明显。具体测试结果如下:

用16个线程的并发生成测试,目前吞吐量测试是6万+/秒,采用原先全部查库的方案,吞吐量降为3万+/秒,采用碰撞缓冲区的方案吞吐量为5.8万+/秒。

尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号