CN116775764A - 分布式id生成方法、分布式id生成装置及存储介质 - Google Patents

分布式id生成方法、分布式id生成装置及存储介质 Download PDF

Info

Publication number
CN116775764A
CN116775764A CN202310752973.XA CN202310752973A CN116775764A CN 116775764 A CN116775764 A CN 116775764A CN 202310752973 A CN202310752973 A CN 202310752973A CN 116775764 A CN116775764 A CN 116775764A
Authority
CN
China
Prior art keywords
distributed
self
node
time
historical
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202310752973.XA
Other languages
English (en)
Inventor
王帅
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
China Merchants Bank Co Ltd
Original Assignee
China Merchants Bank Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by China Merchants Bank Co Ltd filed Critical China Merchants Bank Co Ltd
Priority to CN202310752973.XA priority Critical patent/CN116775764A/zh
Publication of CN116775764A publication Critical patent/CN116775764A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了分布式ID生成方法、分布式ID生成装置及存储介质,其中,所述方法包括以下步骤:在缓存队列中可消费分布式ID的条数小于预设数量时,获取当前分库对应的节点ID,以及获取上一次生成的历史分布式ID;获取所述历史分布式ID的自增序号,时间回拨字段的第一填充值;若当前时间晚于所述历史分布式ID对应的时间,根据所述节点ID、所述第一填充值、执行自增之后的所述自增序号以及当前时间,组装成新增分布式ID;将所述新增分布式ID更新为所述缓存队列中的所述可消费分布式ID。本发明通过对节点ID对应的时间与历史分布式的时间进行比较,进而基于比对结果生成唯一的新增分布式ID,解决了因时间回溯导致分布式ID重复的问题。

Description

分布式ID生成方法、分布式ID生成装置及存储介质
技术领域
本发明涉及分布式系统领域,尤其涉及分布式ID生成方法、分布式ID生成装置及存储介质。
背景技术
在单体应用场景下最常用的方式是使用数据库自增ID(Identity document,身份标识)来作为唯一ID。而随着分布式架构的演进,数据在分库分表后需要分布式应用生成全局唯一ID来标识一条数据,数据库的自增ID只能保证同一数据库下ID唯一,显然不能满足分布式系统数据多分库和多应用实例情况下全局唯一ID的需求。常见的生成分布式唯一ID的算法有多种,例如UUID(Universally Unique Identifier,通用唯一标识码)、数据库或其他中间件自增以及雪花算法等。
在相关的分布式唯一ID的方案中,通过雪花算法生成的分布式ID依赖于机器的时钟,当设备的时钟从当前时刻回退到先前的某一时刻时,生成的ID的时间戳也会随之回退,此时则会出现生成的ID与时钟回退之前在当前时刻生成的ID相同的情况,使得生成的分布式ID出现重复,进而出现分布式系统下节点ID不唯一的问题。
上述内容仅用于辅助理解本发明的技术方案,并不代表承认上述内容是现有技术。
发明内容
本发明的主要目的在于提供一种分布式ID生成方法、分布式ID生成装置及存储介质,解决现有技术中基于雪花算法生成的分布式ID依赖时间戳导致分布式ID不唯一的问题。
为实现上述目的,本发明提供一种分布式ID生成方法,所述方法包括以下步骤:
在缓存队列中可消费分布式ID的条数小于预设数量时,获取当前分库对应的节点ID,以及获取上一次生成的历史分布式ID;
获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号;
若当前时间晚于所述历史分布式ID对应的时间,根据所述节点ID、所述第一填充值、执行自增之后的所述自增序号以及当前时间,组装成新增分布式ID;
将所述新增分布式ID更新为所述缓存队列中的所述可消费分布式ID。
可选地,所述获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号之后,还包括:
若当前时间早于所述历史分布式ID对应的时间,基于所述第一填充值执行自增动作,生成第二填充值;
根据所述节点ID、所述第二填充值、执行自增之后的所述自增序号以及当前时间,组装成所述新增分布式ID。
可选地,所述若当前时间早于所述历史分布式ID对应的时间,基于所述第一填充值执行自增动作,生成第二填充值的步骤包括:
若当前时间早于所述历史分布式ID对应的时间,确定所述当前时间与所述时间的差值;
若所述差值大于预设阈值,则基于所述第一填充值执行自增动作,生成所述第二填充值;或者
若所述差值小于所述预设阈值,跳转执行所述获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号的步骤。
可选地,所述若当前时间晚于所述历史分布式ID对应的时间,根据所述节点ID、所述第一填充值、执行自增之后的所述自增序号以及当前时间,组装成新增分布式ID的步骤包括:
若当前时间晚于所述历史分布式ID对应的时间,基于预设数值对所述自增序号进行自增处理,并确定自增处理后的所述自增序号的第三填充值;
获取所述自增序号的位数以及进位计数制,并基于所述位数以及所述进位计数制确定所述自增序号的最大填充值;
在所述第三填充值小于所述最大填充值时,根据所述节点ID、所述第一填充值、所述自增序号对应的第三填充值以及当前时间,基于雪花算法组装成新增分布式ID。
可选地,所述在缓存队列中可消费分布式ID的条数小于预设数量时,获取当前分库对应的节点ID,以及获取上一次生成的历史分布式ID的步骤包括:
在所述缓存队列中所述可消费分布式ID的条数小于所述预设数量时,获取所述当前分库对应的所述节点ID,以及所述节点ID的注册状态;
若所述注册状态为已注册,则获取所述历史分布式ID。
可选地,所述在所述缓存队列中所述可消费分布式ID的条数小于所述预设数量时,获取所述当前分库对应的所述节点ID,以及所述节点ID的注册状态的步骤之后,还包括:
若所述注册状态为未注册,确定分库数量,并根据所述分库数量确定所述当前分库的步长;
基于所述步长,对所述节点ID执行节点注册动作后,获取所述历史分布式ID。
可选地,所述在缓存队列中可消费分布式ID的条数小于预设数量时,获取当前分库对应的节点ID,以及获取上一次生成的历史分布式ID的步骤之前,还包括:
接收到分布式ID调用请求时,确定所述缓存队列的所述可消费分布式ID中,所述分布式ID调用请求关联的响应ID;
将所述响应ID发送到所述分布式ID调用请求对应的业务数据中。
可选地,所述接收到分布式ID调用请求时,确定所述缓存队列的所述可消费分布式ID中,所述分布式ID调用请求关联的响应ID的步骤之前,还包括:
确定所述缓存队列的尾部指针以及光标指针,其中,所述尾部指针用于标识所述缓存队列中最新填充的所述分布式ID,所述光标指针用于标识所述缓存队列中已消费的所述分布式ID;
在所述尾部指针处于所述光标指针的后一位置,或者所述光标指针处于所述尾部指针的所述后一位置时,基于预设拒接策略阻断新增的所述分布式ID或者阻断所述分布式ID的提取。
此外,为实现上述目的,本发明还提供一种分布式ID生成装置,所述分布式ID生成装置包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的分布式ID生成程序,所述分布式ID生成程序被所述处理器执行时实现如上所述的分布式ID生成方法的步骤。
此外,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有分布式ID生成程序,所述分布式ID生成程序被处理器执行时实现如上所述的分布式ID生成方法的步骤。
本发明实施例提供了分布式ID生成方法、分布式ID生成装置及存储介质,在缓存队列中可消费分布式ID的条数小于预设数量时,获取当前分库对应的节点ID,以及获取上一次生成的历史分布式ID,获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号,若当前时间晚于所述历史分布式ID对应的时间,根据所述节点ID、所述第一填充值、执行自增之后的所述自增序号以及当前时间,组装成新增分布式ID,将所述新增分布式ID更新为所述缓存队列中的所述可消费分布式ID。基于此,可以看出,对获取节点ID对应的时间以及历史分布式ID对应的时间进行比较,在当前时间晚于历史分布式ID对应的时间,说明当前并未发生时钟回拨,基于此,可以根据节点ID、时间回拨字段的第一填充值、自增处理后的自增序号以及当前时间组装成唯一的分布式ID,进而避免因时间回溯导致分布式ID重复的问题。也即使得当前生成的分布式ID具有唯一性。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明的原理。为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明分布式ID生成方法的第一实施例的流程示意图;
图2是本发明分布式ID生成方法的分布式ID的组成结构示意图;
图3为本发明分布式ID生成方法的分库注册示意图;
图4为本发明分布式ID生成方法的第二实施例的流程示意图;
图5为本发明分布式ID生成方法的双环形数组结构示意图;
图6为本发明分布式ID生成方法的第三实施例的流程示意图;
图7为本发明分布式ID生成方法的第四实施例的分布式ID生成示意图;
图8是本发明分布式ID生成方法的各个实施例的终端硬件结构示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在相关的分布式唯一ID的方案中,通过雪花算法生成的分布式ID依赖于机器的时钟,当设备的时钟从当前时刻回退到先前的某一时刻时,生成的ID的时间戳也会随之回退,此时则会出现生成的ID与时钟回退之前在当前时刻生成的ID相同的情况,使得生成的分布式ID出现重复,进而出现分布式系统下节点ID不唯一的问题。
为解决上述缺陷,本发明实施例提出一种分布式ID生成方法,其主要解决方案包括以下步骤:
在缓存队列中可消费分布式ID的条数小于预设数量时,获取当前分库对应的节点ID,以及获取上一次生成的历史分布式ID;
获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号;
若当前时间晚于所述历史分布式ID对应的时间,根据所述节点ID、所述第一填充值、执行自增之后的所述自增序号以及当前时间,组装成新增分布式ID;
将所述新增分布式ID更新为所述缓存队列中的所述可消费分布式ID。
本发明通过对获取节点ID对应的时间以及历史分布式ID对应的时间进行比较,在当前时间晚于历史分布式ID对应的时间,说明当前并未发生时钟回拨,基于此,可以根据节点ID、时间回拨字段的第一填充值、自增处理后的自增序号以及当前时间组装成唯一的分布式ID,进而避免因时间回溯导致分布式ID重复的问题,使得当前生成的分布式ID具有唯一性。
为了更好地理解上述技术方案,下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整地传达给本领域的技术人员。
第一实施例
请参照图1,图1为本发明分布式ID生成方法的第一实施例的流程示意图。
在本实施例中,在雪花算法的基础上进行优化,也即增加时钟回拨位,在发生时钟回拨时,可以将时钟回拨位加一,进而避免时钟回拨的问题。也即优化后的雪花算法可以通过时钟回拨位解决当前机器时钟回拨问题导致生成的分布式ID不唯一的缺陷。也即本实施例中可以通过优化后的雪花算法生成分布式ID。
示例性的,基于优化后的雪花算法生成的分布式ID的组成结构可以如图2所示。该分布式ID为20位字符,采用36进制(数字和字母),其中包括3位预留位,用于填入3位应用名用于区分业务,也可自定义使用;1位时钟回拨位,用于应对机器时钟回拨问题;8位时间戳,采用毫秒级时间戳,使用当前时间与基准时间之差表示,最大可以表示36的8次方,可使用约89年;5位机器ID,最大可以表示36的5次方,约为6000W节点;3位自增序号,最大可以表示36的3次方,每毫秒约为4W。
在本实施例中,分布式ID生成方法包括以下步骤:
步骤S10,在缓存队列中可消费分布式ID的条数小于预设数量时,获取当前分库对应的节点ID,以及获取上一次生成的历史分布式ID;
在本实施例中,分布式ID生成系统主要分为3个模块,包括注册模块、计算模块与缓存模块。而缓存模块主要负责根据ID的生成和消费情况进行实时的动态调整,保证ID生成的连续性。可消费分布式ID指的是当前缓存队列中未被使用的分布式ID。当前分库对应的节点ID是基于分库的步长进行注册的机器ID,而由于步长是依照各个分库的数量而设置,因而获取到的节点ID具备唯一性,在为了得到上一次获取节点ID时的时间,还需要获取上一次生成的历史分布式ID。
示例性的,缓存队列中可以设置有10000条可消费的分布式ID,而当可消费的分布式ID的数量少于3000条,也即预设阈值为3000条时,此时需要对缓存队列的数据进行补充,进而保障数据调度正常。因此,需要获取组装成分布式ID的各项参数,也即获取当前分库对应的节点ID。需要说明的是,上述数据仅用于解释说明,并非是对本发明的限定。
具体地,需要获取分布式ID时,可以从缓存模块的缓存队列中获取相应的数据。也即缓存队列中可消费的分布式ID指的是可以直接从缓存队列中获取的分布式ID。基于此,缓存队列中分布式ID被使用后,需要检查剩余可用的ID的条数,当可消费的分布式ID的条数小于预设数量时,需要生成新的分布式ID填补缓存队列中空闲的位置。此时需要获取节点ID,而节点ID包括已注册跟未注册的状态,需要进一步基于节点ID的注册状态判断是否需要执行节点注册动作,也即,步骤S10具体包括:
步骤S11,在所述缓存队列中所述可消费分布式ID的条数小于所述预设数量时,获取所述当前分库对应的所述节点ID,以及所述节点ID的注册状态;
步骤S12,若所述注册状态为已注册,则获取所述历史分布式ID。
在本实施例中,节点ID的已完成注册时,可以直接获取所述历史分布式ID。
可选地,步骤S11之后,还包括:
步骤S13,若所述注册状态为未注册,确定分库数量,并根据所述分库数量确定所述当前分库的步长;
步骤S14,基于所述步长,对所述节点ID执行节点注册动作后,获取所述历史分布式ID。
在本实施例中,为保障获取到的节点ID处于递增趋势且保障节点ID的唯一性,需要基于分布式系统中进行分库注册的子数据库的数量,确定当前分库的步长以及对应的编号,进而使得所述分库能够准确注册相应的节点ID。
为避免使用中间件注册节点ID的方式,因中间件单点故障导致整个服务不可用的状况,本实施例通过分库注册的方式进行分布式ID的注册。也即为保障每个子数据库分别进行ID注册时,不会出现重复的ID,此时需要确定分库的数量,并根据所述数量确定步长。例如信用卡授权系统CAX拥有9个分库,也即子数据库的数量为9,对应的步长为9时,分布式ID中对应的节点ID的分配可以如图3所示。
请继续参照图3,若当前的子数据库为CAXSDB01,此时对应的已注册的节点ID为1,10,19,...,等,因此,为避免生成的分布式ID出现重复,在获取到子数据库的数量后,可以基于数量确定步长,并根据步长注册需要生成的分布式ID对应的节点ID。
需要说明的是,总服务端可以只在应用启动时候访问数据库服务给节点分配唯一节点ID,同时采用分库分别注册的方式,降低数据库生成并分配分布式ID的压力,而进行分库注册的各个子数据库间不存在数据库瓶颈问题。与单个数据库统一注册相比还能大大提高数据的吞吐量。上述数据仅用于解释说明,并非是对本发明的限定。
步骤S20,获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号;
在本实施例中,为保障分布式ID的唯一性,通过设置时钟回拨位,在发生时钟回拨时能够对时钟回拨位进行加一处理,进而保障生成的分布式ID具有唯一性。基于此,需要提前获取系统当前的时钟回拨次数,而时钟回拨次数对应着历史分布式ID的时钟回拨字段的第一填充值。而分布式ID的组成还包括自增序号,而为避免自增序号重复性较高而影响数据取模的均匀度,需要获取随机的自增序号。
需要说明的是,自增序号是分布式ID的组成部分之一,在计算序号时,如果跨毫秒进行计算,则序号不分大多从0开始,此时会导致自增序号为0的分布式ID较多,进而导致生成的分布式ID出现取模后不均匀的状况。基于此,获取到的自增序号可以设置为一个0-9的随机数,进而保障进行处理后的自增序号更加均匀。可选地,还可将自增序号设置为0-Z的随机数(数字+字母的36进制数)。
步骤S30,若当前时间晚于所述历史分布式ID对应的时间,根据所述节点ID、所述第一填充值、执行自增之后的所述自增序号以及当前时间,组装成新增分布式ID;
在本实施例中,在当前时间晚于历史分布式ID对应的时间时,说明当前系统的时钟并未出现回溯,也即当前可以直接使用雪花算法生成分布式ID,而不必担心出现ID重复的状况。
具体地,步骤S30包括:
步骤S31,若当前时间晚于所述历史分布式ID对应的时间,基于预设数值对所述自增序号进行自增处理,并确定自增处理后的所述自增序号的第三填充值;
在本实施例中,自增序号的自增处理可以是加一处理。也可以是添加其他数值。在进行自增处理后,需要基于自增处理后的数值组装成分布式ID,也即需要确定自增处理后的所述第三填充值。
步骤S32,获取所述自增序号的位数以及进位计数制,并基于所述位数以及所述进位计数制确定所述自增序号的最大填充值;
在本实施例中,为避免自增后的第三填充值超过最大填充值而导致数据归零记录或记录失败,此时需要确定自增序号对应的理论最大值,进而将第三填充值与理论最大值进行比较。
示例性的,若自增序号的位数为5位,进位计数制为36位(数字加字母的进制),此时可以确定自增序号的理论最大值为“ZZZZZ”,而自增处理后的自增序号的数值则可以由原本获取到的随机数加一得到。
步骤S33,在所述第三填充值小于所述最大填充值时,根据所述节点ID、所述第一填充值、所述自增序号对应的第三填充值以及当前时间,基于雪花算法组装成新增分布式ID;
在本实施例中,若当前获取到的第三填充值小于最大填充值,说明当前自增序号并未超出数据的理论存储范围,此时可以根据所述节点ID、所述第一填充值、所述自增序号对应的第三填充值以及当前时间,基于雪花算法组装成新增分布式ID。
具体的,可以基于所述当前时间、所述节点ID、所述第三填充值以及所述第一填充值,利用雪花算法生成所述目标分布式ID。其中,基于雪花算法生成的分布式ID还包括业务预留位,基于业务数据获取到分布式ID后,可以基于具体业务代码,在业务预留位里添加相应的业务代码。
可选地,若自增处理后的所述自增序号的数值大于最大理论值,说明获取到的随机自增序号为“ZZZZZ”,此时,若对该数据进行加一处理,则会得到100000,而由于当前的自增序号只兼容五位数,得到的六位数无法应用于当前的方案中,此时需要重新生成自增序号。也即在所述数值大于所述理论最大值时,需要跳转执行获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号的步骤。
步骤S40,将所述新增分布式ID更新为所述缓存队列中的所述可消费分布式ID;
在本实施例中,生成的目标分布式ID可以反馈到缓存队列中,进而保障缓存队列中仍有数据可用,避免需要生成大量分布式ID时,因缓存队列中数据不够而增加子数据库的负载,导致分布式ID生成效率低。
在本实施例公开的技术方案中,在缓存队列中可消费的分布式ID数据少于预设数量时,对当前获取到的节点ID的当前时间以及历史分布式ID的时间比对校验,进而避免出现时钟回拨现象,使得生成新增分布式ID具备唯一性,并在高并发场景下具有较高的实用性。
第二实施例
请参照图4,在第二实施例中,基于第一实施例,步骤S20之后,还包括:
步骤S50,若当前时间早于所述历史分布式ID对应的时间,基于所述第一填充值执行自增动作,生成第二填充值;
在本实施例中,当前时间早于历史分布式ID对应的时间时,说明当前分布式ID生成系统中出现时间回溯的状况,基于此,需要对时钟回拨位进行相应的置位处理,也即对获取到的第一填充值进行自增处理,得到第二填充值。
同时为避免时间戳的获取出现误差或者在短时间内连续检测到时钟回拨,此时需要计算当前时间戳以及先前时间戳的差值,进而可以基于该差值进行时钟回拨位的置位处理。也即若当前时间早于所述历史分布式ID对应的时间,确定所述当前时间与所述时间的差值,若所述差值大于预设阈值,则基于所述第一填充值执行自增动作,生成所述第二填充值,若所述差值小于所述预设阈值,则跳转执行所述获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号的步骤,而不必执行时钟位置位处理的动作。
需要说明的是,本实施例设置时钟回拨位的位数为1位,也即最多支持35次时钟回拨,而在正常情况下,不会出现频繁时钟回拨的现象,因此,本实施例设置的时钟回拨次数基本满足使用需求。可选地,若处于时钟回拨较为频繁的场景中,可以根据场景状况动态调整始终回拨位的位数。
步骤S60,根据所述节点ID、所述第二填充值、执行自增之后的所述自增序号以及当前时间,组装成所述新增分布式ID。
具体的,可以基于所述当前时间、所述节点ID、执行自增之后的所述自增序号以及第二填充值,利用雪花算法生成所述目标分布式ID。其中,基于雪花算法生成的分布式ID还包括业务预留位,基于业务数据获取到分布式ID后,可以基于具体业务代码,在业务预留位里添加相应的业务代码。
在本实施例公开的技术方案中,在当前时间戳对应的时间,早于最大历史机器ID的时间戳对应的时间时,确定两个时间戳之间的差值,并根据所述差值进行是否对时钟回拨位进行置位处理的判断,基于此,通过设置时钟回拨位,在发生时钟回拨时,将时钟回拨位对应的字段填充值加一处理,进而再生成新增分布式ID,此时可以确保当前生成的分布式ID具备唯一性,进而解决了雪花算法中因为时钟回拨导致生成的分布式ID出现重复的问题,提高分布式ID生成系统的实用性。
第三实施例
请参照图5,在第三实施例中,基于第一实施例,步骤S10之前,还包括:
步骤S70,确定所述缓存队列的尾部指针以及光标指针,其中,所述尾部指针用于标识所述缓存队列中最新填充的所述分布式ID,所述光标指针用于标识所述缓存队列中已消费的所述分布式ID;
在本实施例中,为了保证分布式ID生成的高可用,且在高并发场景下的吞吐量,可以基于图6所示的双环形数组队列对生成ID做缓存和控制。
具体的,请继续参照图6,在缓存队列中,可以使用Tail指针、Cursor指针用于环形数组进行读写,其中Tail指针表示Producer(生产者)生产的最大序号(从0开始,持续递增)。Cursor指针表示Consumer(消费者)消费到的最小序号(序号序列与Producer序列相同)。因数组内存分配连续,采用的双环形数组队列充分利用CPU Cache对ID进行高效缓存。
示例性的,环形数组容量默认为1w。可通过配置进行扩容,以提高缓存队列的读写吞吐量。双环形数组分别用于存储生成的ID和ID状态(是否可填充、是否可消费)。
步骤S80,在所述尾部指针处于所述光标指针的后一位置,或者所述光标指针处于所述尾部指针的所述后一位置时,基于预设拒接策略阻断新增的所述分布式ID或者阻断所述分布式ID的提取;
在本实施例中,请继续参照图6,在双环形数组中,Tail不能超过Cursor,即生产者不能覆盖未消费的ID。当Tail已赶上Curosr,此时可通过设置拒接策略或者告警。Cursor不能超过Tail,即不能消费未生产的ID。当Cursor已赶上tail,此时也可通过设置拒接策略或者告警。
步骤S90,接收到分布式ID调用请求时,确定所述缓存队列的所述可消费分布式ID中,所述分布式ID调用请求关联的响应ID;
步骤S100,将所述响应ID发送到所述分布式ID调用请求对应的业务数据中。
在本实施例中,请继续参照图6,在分库的节点应用启动后,需要初始化预填充环形数组,也即预先填充满整个队列。在缓存队列中缓存的ID或者缓存的ID被消费时,需要即时检查剩余可用ID量(也即可消费分布式ID的条数,Tail-Cursor),在剩余可用ID量小于设定阈值,则需要生成分布式ID补全空闲。而当接收到调用请求时,则可直接将分布式ID调用请求关联的响应ID发送至相应的业务处理数据当中。
在本实施例公开的技术方案中,通过设置双环形数组来保障各个分库调用缓存队列的分布式ID时,能够提高调用效率。且双环形数组的设计可以进一步地提高了当前缓存队列的吞吐数量,使得在高并发的场景下也能保障分布式ID的吞吐量的稳定性。
第四实施例
请参照图7,在第四实施例中,基于上述任一实施例,提出本发明分布式ID生成方法的ID生成流程。
示例性的,在接收到相应的分布式ID获取请求时,可以直接从缓存队列中获取可消费的分布式ID,随后检查缓存队列中是否需要进行分布式ID的补充,若不需要,则直接结束流程。在需要进行补充时,此时可获取节点ID,若节点ID在分库中未完成注册,则基于子数据库的数量确定步长后,对其进行注册处理。而在注册完成后,可以获取当前的时间戳,并计算当前时间戳与前一次获取到节点ID时的时间之差,对于毫秒级级别的时间差异,如果当前时间小于上次获取时间时,且差别小于阈值,则重新获取当前时间。如果当前时间小于上次获取时间,且差别大于阈值时,则对时钟回拨位进行置位,也即加一处理并重新获取当前时间。如果当前时间大于上次获取时间,则获取自增序号并对自增序号进行+1处理,随后判断序号是否大于自增序号的理论最大值,若自增序号大于理论最大值,则重新获取当前时间,否则,则生成分布式ID,并将所述分布式ID组装到缓存队列当中,进而保障缓存队列的数据稳定性。
需要说明的是,组装ID至缓存的队列后,可以在接收到相应的分布式ID获取请求时,能够基于该补充后的缓存队列继续获取分布式ID,并非是将ID组装至缓存队列且未接收到相应的请求时,直接执行从缓存队列中获取ID。
在本实施例公开的技术方案中,通过提供分布式ID生成系统生成分布式ID的详细流程,基于详细的分布式ID生成流程体现当前分布式ID生成系统的稳定性以及在高并发场景中的稳定性。
参照图8,图8为本发明实施例方案涉及的硬件运行环境的终端结构示意图。
如图8所示,该终端可以包括:处理器1001,例如中央处理器(Central ProcessingUnit,CPU),通信总线1002、网络接口1003,存储器1004。其中,通信总线1002用于实现这些组件之间的连接通信。网络接口1003可选的可以包括标准的有线接口、无线接口(如无线保真(WIreless-FIdelity,WI-FI)接口)。存储器1004可以是高速的RAM存储器(RandomAccess Memory,RAM),也可以是稳定的非易失性存储器(Non-Volatile Memory,NVM),例如磁盘存储器。存储器1004可选的还可以是独立于前述处理器1001的存储装置。
本领域技术人员可以理解,图8中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图8所示,作为一种计算机存储介质的存储器1004中可以包括操作系统、数据存储模块、网络通信模块以及控制程序。
在图8所示的终端中,网络接口1003主要用于连接后台服务器,与后台服务器进行数据通信;处理器1001可以调用存储器1004中存储的分布式ID生成程序,并执行以下操作:
在缓存队列中可消费分布式ID的条数小于预设数量时,获取当前分库对应的节点ID,以及获取上一次生成的历史分布式ID;
获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号;
若当前时间晚于所述历史分布式ID对应的时间,根据所述节点ID、所述第一填充值、执行自增之后的所述自增序号以及当前时间,组装成新增分布式ID;
将所述新增分布式ID更新为所述缓存队列中的所述可消费分布式ID。
进一步地,处理器1001可以调用存储器1004中存储的分布式ID生成程序,还执行以下操作:
若当前时间早于所述历史分布式ID对应的时间,基于所述第一填充值执行自增动作,生成第二填充值;
根据所述节点ID、所述第二填充值、执行自增之后的所述自增序号以及当前时间,组装成所述新增分布式ID。
进一步地,处理器1001可以调用存储器1004中存储的分布式ID生成程序,还执行以下操作:
若当前时间早于所述历史分布式ID对应的时间,确定所述当前时间与所述时间的差值;
若所述差值大于预设阈值,则基于所述第一填充值执行自增动作,生成所述第二填充值;或者
若所述差值小于所述预设阈值,跳转执行所述获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号的步骤。
进一步地,处理器1001可以调用存储器1004中存储的分布式ID生成程序,还执行以下操作:
若当前时间晚于所述历史分布式ID对应的时间,基于预设数值对所述自增序号进行自增处理,并确定自增处理后的所述自增序号的第三填充值;
获取所述自增序号的位数以及进位计数制,并基于所述位数以及所述进位计数制确定所述自增序号的最大填充值;
在所述第三填充值小于所述最大填充值时,根据所述节点ID、所述第一填充值、所述自增序号对应的第三填充值以及当前时间,基于雪花算法组装成新增分布式ID。
进一步地,处理器1001可以调用存储器1004中存储的分布式ID生成程序,还执行以下操作:
在所述缓存队列中所述可消费分布式ID的条数小于所述预设数量时,获取所述当前分库对应的所述节点ID,以及所述节点ID的注册状态;
若所述注册状态为已注册,则获取所述历史分布式ID。
进一步地,处理器1001可以调用存储器1004中存储的分布式ID生成程序,还执行以下操作:
若所述注册状态为未注册,确定分库数量,并根据所述分库数量确定所述当前分库的步长;
基于所述步长,对所述节点ID执行节点注册动作后,获取所述历史分布式ID。
进一步地,处理器1001可以调用存储器1004中存储的分布式ID生成程序,还执行以下操作:
接收到分布式ID调用请求时,确定所述缓存队列的所述可消费分布式ID中,所述分布式ID调用请求关联的响应ID;
将所述响应ID发送到所述分布式ID调用请求对应的业务数据中。
进一步地,处理器1001可以调用存储器1004中存储的分布式ID生成程序,还执行以下操作:
确定所述缓存队列的尾部指针以及光标指针,其中,所述尾部指针用于标识所述缓存队列中最新填充的所述分布式ID,所述光标指针用于标识所述缓存队列中已消费的所述分布式ID;
在所述尾部指针处于所述光标指针的后一位置,或者所述光标指针处于所述尾部指针的所述后一位置时,基于预设拒接策略阻断新增的所述分布式ID或者阻断所述分布式ID的提取。
此外,本领域普通技术人员可以理解的是实现上述实施例的方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成。该计算机程序包括程序指令,计算机程序可以存储于一存储介质中,该存储介质为计算机可读存储介质。该程序指令被控制终端中的至少一个处理器执行,以实现上述方法的实施例的流程步骤。
因此,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质存储有分布式ID生成程序,所述分布式ID生成程序被处理器执行时实现如上实施例所述的分布式ID生成方法的各个步骤。
需要说明的是,由于本申请实施例提供的存储介质,为实施本申请实施例的方法所采用的存储介质,故而基于本申请实施例所介绍的方法,本领域所属人员能够了解该存储介质的具体结构及变形,故而在此不再赘述。凡是本申请实施例的方法所采用的存储介质都属于本申请所欲保护的范围。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例,或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框,以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
应当注意的是,在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的部件或步骤。位于部件之前的单词“一”或“一个”不排除存在多个这样的部件。本发明可以借助于包括有若干不同部件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二,以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

Claims (10)

1.一种分布式ID生成方法,其特征在于,所述分布式ID生成方法包括:
在缓存队列中可消费分布式ID的条数小于预设数量时,获取当前分库对应的节点ID,以及获取上一次生成的历史分布式ID;
获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号;
若当前时间晚于所述历史分布式ID对应的时间,根据所述节点ID、所述第一填充值、执行自增之后的所述自增序号以及当前时间,组装成新增分布式ID;
将所述新增分布式ID更新为所述缓存队列中的所述可消费分布式ID。
2.如权利要求1所述的分布式ID生成方法,其特征在于,所述获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号之后,还包括:
若当前时间早于所述历史分布式ID对应的时间,基于所述第一填充值执行自增动作,生成第二填充值;
根据所述节点ID、所述第二填充值、执行自增之后的所述自增序号以及当前时间,组装成所述新增分布式ID。
3.如权利要求2所述的分布式ID生成方法,其特征在于,所述若当前时间早于所述历史分布式ID对应的时间,基于所述第一填充值执行自增动作,生成第二填充值的步骤包括:
若当前时间早于所述历史分布式ID对应的时间,确定所述当前时间与所述时间的差值;
若所述差值大于预设阈值,则基于所述第一填充值执行自增动作,生成所述第二填充值;或者
若所述差值小于所述预设阈值,跳转执行所述获取所述历史分布式ID的时间回拨字段的第一填充值,以及随机的自增序号的步骤。
4.如权利要求1所述的分布式ID生成方法,其特征在于,所述若当前时间晚于所述历史分布式ID对应的时间,根据所述节点ID、所述第一填充值、执行自增之后的所述自增序号以及当前时间,组装成新增分布式ID的步骤包括:
若当前时间晚于所述历史分布式ID对应的时间,基于预设数值对所述自增序号进行自增处理,并确定自增处理后的所述自增序号的第三填充值;
获取所述自增序号的位数以及进位计数制,并基于所述位数以及所述进位计数制确定所述自增序号的最大填充值;
在所述第三填充值小于所述最大填充值时,根据所述节点ID、所述第一填充值、所述自增序号对应的第三填充值以及当前时间,基于雪花算法组装成新增分布式ID。
5.如权利要求1所述的分布式ID生成方法,其特征在于,所述在缓存队列中可消费分布式ID的条数小于预设数量时,获取当前分库对应的节点ID,以及获取上一次生成的历史分布式ID的步骤包括:
在所述缓存队列中所述可消费分布式ID的条数小于所述预设数量时,获取所述当前分库对应的所述节点ID,以及所述节点ID的注册状态;
若所述注册状态为已注册,则获取所述历史分布式ID。
6.如权利要求5所述的分布式ID生成方法,其特征在于,所述在所述缓存队列中所述可消费分布式ID的条数小于所述预设数量时,获取所述当前分库对应的所述节点ID,以及所述节点ID的注册状态的步骤之后,还包括:
若所述注册状态为未注册,确定分库数量,并根据所述分库数量确定所述当前分库的步长;
基于所述步长,对所述节点ID执行节点注册动作后,获取所述历史分布式ID。
7.如权利要求1所述的分布式ID生成方法,其特征在于,所述在缓存队列中可消费分布式ID的条数小于预设数量时,获取当前分库对应的节点ID,以及获取上一次生成的历史分布式ID的步骤之前,还包括:
接收到分布式ID调用请求时,确定所述缓存队列的所述可消费分布式ID中,所述分布式ID调用请求关联的响应ID;
将所述响应ID发送到所述分布式ID调用请求对应的业务数据中。
8.如权利要求7所述的分布式ID生成方法,其特征在于,所述接收到分布式ID调用请求时,确定所述缓存队列的所述可消费分布式ID中,所述分布式ID调用请求关联的响应ID的步骤之前,还包括:
确定所述缓存队列的尾部指针以及光标指针,其中,所述尾部指针用于标识所述缓存队列中最新填充的所述分布式ID,所述光标指针用于标识所述缓存队列中已消费的所述分布式ID;
在所述尾部指针处于所述光标指针的后一位置,或者所述光标指针处于所述尾部指针的所述后一位置时,基于预设拒接策略阻断新增的所述分布式ID或者阻断所述分布式ID的提取。
9.一种分布式ID生成装置,其特征在于,所述分布式ID生成装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的分布式ID生成程序,所述分布式ID生成程序被所述处理器执行时实现如权利要求1至8中任一项所述的分布式ID生成方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有分布式ID生成程序,所述分布式ID生成程序被处理器执行时实现如权利要求1至8中任一项所述的分布式ID生成方法的步骤。
CN202310752973.XA 2023-06-25 2023-06-25 分布式id生成方法、分布式id生成装置及存储介质 Pending CN116775764A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310752973.XA CN116775764A (zh) 2023-06-25 2023-06-25 分布式id生成方法、分布式id生成装置及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310752973.XA CN116775764A (zh) 2023-06-25 2023-06-25 分布式id生成方法、分布式id生成装置及存储介质

Publications (1)

Publication Number Publication Date
CN116775764A true CN116775764A (zh) 2023-09-19

Family

ID=87985574

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310752973.XA Pending CN116775764A (zh) 2023-06-25 2023-06-25 分布式id生成方法、分布式id生成装置及存储介质

Country Status (1)

Country Link
CN (1) CN116775764A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117149137A (zh) * 2023-10-31 2023-12-01 创云融达信息技术(天津)股份有限公司 一种分布式系统序号发生器

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117149137A (zh) * 2023-10-31 2023-12-01 创云融达信息技术(天津)股份有限公司 一种分布式系统序号发生器

Similar Documents

Publication Publication Date Title
CN112099958B (zh) 分布式多任务管理方法、装置、计算机设备及存储介质
CN111026767B (zh) 区块链的数据存储方法、装置及硬件设备
CN116775764A (zh) 分布式id生成方法、分布式id生成装置及存储介质
CN112948120A (zh) 负载均衡方法、系统、装置和存储介质
CN111541762B (zh) 数据处理的方法、管理服务器、设备及存储介质
US20030158883A1 (en) Message processing
CN107783842A (zh) 一种分布式锁实现方法、设备及存储装置
CN108399175B (zh) 一种数据存储、查询方法及其装置
CN111580959B (zh) 一种数据写入方法、数据写入装置、服务器及存储介质
CN115756955A (zh) 一种数据备份、数据恢复的方法、装置及计算机设备
CN113568891B (zh) 分布式id生成方法、装置、服务器和可读存储介质
CN113946427A (zh) 用于多操作系统的任务处理方法、处理器及存储介质
US8752061B2 (en) Resource allocation within multiple resource providers based on the incoming resource request and the expected state transition of the resource requesting application, and selecting a resource provider based on the sum of the percentage of the resource provider currently used, the requesting load as a percentage of the resource provider's total resource, and the additional load imposed by the expected state of the requesting application as a percentage of the resource provider's total resource
CN116578410A (zh) 资源管理方法、装置、计算机设备和存储介质
CN116074553A (zh) 视频流传输方法、装置、电子设备及存储介质
CN112243040B (zh) 一种唯一标识符的生成方法及其系统
CN110609707A (zh) 在线数据处理系统生成方法、装置及设备
CN111324668B (zh) 数据库数据同步处理方法、装置及存储介质
CN114157717A (zh) 一种微服务动态限流的系统及方法
CN116541428B (zh) 一种用于数据库的序列号生成方法、装置、设备及介质
CN115292314B (zh) 序列号生成方法、装置、计算机设备和存储介质
CN115730016B (zh) 数据同步方法、系统、装置、计算机设备和存储介质
CN112559254B (zh) 备份文件的保留方法、装置、电子设备和存储介质
CN109324887B (zh) 稽核数据并行加工方法及系统
CN113590176A (zh) 分布式系统的流水号配置方法、装置和设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination