分布式系统中序列号的生成方法及其装置与流程

文档序号:29566746发布日期:2022-04-09 02:42阅读:185来源:国知局
分布式系统中序列号的生成方法及其装置与流程

1.本发明涉及数据处理领域,具体而言,涉及一种分布式系统中序列号的生成方法及其装置。


背景技术:

2.目前,在分布式系统中,往往需要对大量业务、数据和消息进行唯一标识。在相关技术中的分布式系统中,主要存在以下生成序列号的方法:(1)通用唯一识别码(universally unique identifier简称uuid):uuid标准形式为“8-4-4-4-12”的36个字符,其中包含32个16进制数字,用
“‑”
符号将生成的id分为5段。uuid通过本地的算法能力生成,没有网络消耗,其性能非常高;但uuid生成的字符串一是长度过长,不易于存储;二是如果uuid作为数据库主键,其无序性会引起数据位置频繁变动,严重影响性能;三是uuid并不具备业务意义,如果需要生成定制化的、具有业务属性的编码,uuid无法适用。(2)snowflake雪花算法:是一种以划分命名空间来生成id的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等,其性能高、部署灵活,生成的序列号趋势递增,且不依赖数据库等第三方系统。但其强依赖时钟回拨,如果机器上时钟回拨,则会导致生成的序列号重复的问题,如果需要生成定制化的、具有业务属性的编码,雪花算法也无法适用。(3)数据库生成:利用现有数据库系统的功能进行实现,成本小且生成的序列号单调递增。但序列号的生成强依赖与数据库,当数据库发生异常时,将会导致整个系统的不可用。(4)基于redis实现:redis的所有命令操作都是单线程的,本身提供像incr和increby这样的自增原子命令,所以能保证生成的id肯定是唯一有序的,不依赖于数据库,灵活方便,且性能优于数据库;数字id天然排序,对分页或者需要排序的结果很有帮助。如果系统中没有redis,还需要引入新的组件,增加系统复杂度;需要编码和配置的工作量比较大。
3.针对上述问题,目前尚未提出有效的解决方案。


技术实现要素:

4.本发明实施例提供了一种分布式系统中序列号的生成方法及其装置,以至少解决针对相关技术中生成序列号方式较为繁琐并且对特定数据库依赖性较强导致生成的序列号适用性不强、实用性不高的技术问题。
5.根据本发明实施例的一个方面,提供了一种分布式系统中序列号的生成方法,包括:基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式,其中,所述号段获取模式包括以下之一:本地获取模式、远程获取模式;判断预定数据库中是否存在所述目标序列号的序列号记录,得到判断结果,其中,所述预定数据库用于存储序列号以及序列号相关信息;基于所述号段获取模式以及所述判断结果获取号段资源;根据所述号段资源生成所述目标序列号。
6.可选地,在基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式之前,所述方法还包括:获取包含所述目标序列号的多种类型的序列号的序列号信
息;基于所述序列号信息配置所述多种类型的序列号中每一种序列号的序列号自定义规则。
7.可选地,所述序列号自定义规则包括以下至少之一:序列号规则标识、序列号模板、序列号最小值以及最大值、序列号的号段长度、回拨模式、号段获取模式、排序模式。
8.可选地,在基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式之前,所述方法还包括:在jvm虚拟机中创建缓存结构,其中,所述缓存结构用于存储号段资源。
9.可选地,基于所述号段获取模式以及所述判断结果获取号段资源,包括:在所述判断结果表示所述预定数据库中不存在所述目标序列号的序列号记录时,在确定所述预定数据库中创建所述目标序列号的序列号资源记录后,基于所述号段获取模式从所述预定数据库中获取所述号段资源;在所述判断结果表示所述预定数据库中存在所述目标序列号的序列号记录时,检查所述预定数据库中是否存在所述号段资源的回收记录,并基于检查结果以及所述号段获取模式获取所述号段资源。
10.可选地,基于检查结果以及所述号段获取模式获取所述号段资源,包括:在所述检查结果表示所述预定数据库中存在所述号段资源的回收记录时,从所述回收记录中获取所述号段资源;在所述检查结果表示所述预定数据库中不存在所述号段资源的回收记录时,从序列号资源记录表中获取所述号段资源。
11.可选地,根据所述号段资源生成所述目标序列号,包括:从所述缓存结构中的所述号段资源中取出目标序列号资源;基于所述序列号自定义规则以及所述目标序列号资源生成所述目标序列号。
12.可选地,在根据所述号段资源生成所述目标序列号之后,所述方法还包括:基于所述号段获取模式回收所述号段资源;其中,基于所述号段获取模式回收所述号段资源,包括:在所述号段获取模块为所述本地获取模式时,将所述号段资源存储至预定应用所使用的数据库,其中,所述预定应用为所述分布式系统中的应用;在所述号段获取模块为所述远程获取模式时,将所述号段资源通过序列号服务端存储服务端的数据库。
13.根据本发明实施例的另外一个方面,还提供了一种分布式系统中序列号的生成装置,包括:确定模块,用于基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式,其中,所述号段获取模式包括以下之一:本地获取模式、远程获取模式;判断模块,用于判断预定数据库中是否存在所述目标序列号的序列号记录,得到判断结果,其中,所述预定数据库用于存储序列号以及序列号相关信息;第一获取模块,用于基于所述号段获取模式以及所述判断结果获取号段资源;生成模块,用于根据所述号段资源生成所述目标序列号。
14.可选地,所述装置还包括:第二获取模块,用于在基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式之前,获取包含所述目标序列号的多种类型的序列号的序列号信息;自定义规则模块,用于基于所述序列号信息配置所述多种类型的序列号中每一种序列号的序列号自定义规则。
15.可选地,所述序列号自定义规则包括以下至少之一:序列号规则标识、序列号模板、序列号最小值以及最大值、序列号的号段长度、回拨模式、号段获取模式、排序模式。
16.可选地,所述装置还包括:创建模块,用于在基于序列号自定义规则确定目标分布
式系统所需目标序列号的号段获取模式之前,在jvm虚拟机中创建缓存结构,其中,所述缓存结构用于存储号段资源。
17.可选地,所述第一获取模块,包括:获取单元,用于在所述判断结果表示所述预定数据库中不存在所述目标序列号的序列号记录时,在确定所述预定数据库中创建所述目标序列号的序列号资源记录后,基于所述号段获取模式从所述预定数据库中获取所述号段资源;检查单元,用于在所述判断结果表示所述预定数据库中存在所述目标序列号的序列号记录时,检查所述预定数据库中是否存在所述号段资源的回收记录,并基于检查结果以及所述号段获取模式获取所述号段资源。
18.可选地,所述检查单元,包括:第一获取子单元,用于在所述检查结果表示所述预定数据库中存在所述号段资源的回收记录时,从所述回收记录中获取所述号段资源;第二获取子单元,用于在所述检查结果表示所述预定数据库中不存在所述号段资源的回收记录时,从序列号资源记录表中获取所述号段资源。
19.可选地,所述生成模块,包括:取出单元,用于从所述缓存结构中的所述号段资源中取出目标序列号资源;生成单元,用于基于所述序列号自定义规则以及所述目标序列号资源生成所述目标序列号。
20.可选地,所述装置还包括:回收模块,用于在根据所述号段资源生成所述目标序列号之后,基于所述号段获取模式回收所述号段资源;其中,所述回收模块,包括:第一存储单元,用于在所述号段获取模块为所述本地获取模式时,将所述号段资源存储至预定应用所使用的数据库,其中,所述预定应用为所述分布式系统中的应用;第二存储单元,用于在所述号段获取模块为所述远程获取模式时,将所述号段资源通过序列号服务端存储服务端的数据库。
21.根据本发明实施例的另外一个方面,还提供了一种计算机可读存储介质,所述计算机可读存储介质包括存储的计算机程序,其中,在所述计算机程序被处理器运行时控制所述计算机可读存储介质所在设备执行上述中任一项所述的分布式系统中序列号的生成方法。
22.根据本发明实施例的另外一个方面,还提供了一种处理器,所述处理器用于运行计算机程序,其中,所述计算机程序运行时执行上述中任一项所述的分布式系统中序列号的生成方法。
23.在本发明实施例中,基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式,其中,号段获取模式包括以下之一:本地获取模式、远程获取模式;判断预定数据库中是否存在目标序列号的序列号记录,得到判断结果,其中,预定数据库用于存储序列号以及序列号相关信息;基于号段获取模式以及判断结果获取号段资源;根据号段资源生成目标序列号。通过本发明实施例提供的分布式系统中序列号的生成方法,达到了基于序列号的号段获取模式以及预定数据库中是否存在目标序列号的序列号记录来生成目标序列号的目的,从而实现了提升生成的序列号实用性的技术效果,进而解决了针对相关技术中生成序列号方式较为繁琐并且对特定数据库依赖性较强导致生成的序列号适用性不强、实用性不高的技术问题。
附图说明
24.此处所说明的附图用来提供对本发明的进一步理解,构成本技术的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
25.图1是根据本发明实施例的分布式系统中序列号的生成方法的流程图;
26.图2是根据本发明实施例的本地模式的号段获取模式的示意图;
27.图3是根据本发明实施例的远程模式的号段获取模式的示意图;
28.图4(a)是根据本发明实施例的首次填充号段资源的情况的示意图;
29.图4(b)是根据本发明实施例的非首次填充号段资源的情况的示意图;
30.图5是根据本发明实施例的获取序号的各个阶段的示意图;
31.图6是根据本发明实施例的序列号回收的示意图;
32.图7是根据本发明实施例的分布式系统中序列号的生成装置的示意图。
具体实施方式
33.为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
34.需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
35.实施例1
36.根据本发明实施例,提供了一种分布式系统中序列号的生成方法的方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
37.图1是根据本发明实施例的分布式系统中序列号的生成方法的流程图,如图1所示,该方法包括如下步骤:
38.步骤s102,基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式,其中,号段获取模式包括以下之一:本地获取模式、远程获取模式。
39.可选的,在上述步骤中,首先基于序列号自定义规则来确定目标系统(即目标分布式系统)所需目标序列号的号段获取模式为本地获取模式或者为远程获取模式。
40.图2是根据本发明实施例的本地模式的号段获取模式的示意图,如图2所示,在应用a和b中都有各自的序列号sdk(序列号的软件开发包)以及jvm(虚拟机),当其序列号sdk获取号段资源时,从本地应用的数据库中获取,并将获取到的号段资源加载到jvm缓存中。
序列号sdk直连的数据库为应用自己的业务库,该数据库也承担业务数据的存储,序列号资源的存储只是其中的一部分。
41.图3是根据本发明实施例的远程模式的号段获取模式的示意图,如图3所示,序列号sdk获取号段资源时,首先向服务端发起获取号段资源的请求,服务端接收到序列号sdk的请求后从其连接的数据库中获取号段资源,最终将号段返回给序列号sdk并加载至jvm缓存中。与序列号sdk直连的数据库不同的是,序列号服务端连接的数据库只用于序列号资源的管理。
42.需要说明的是,序列号服务端(即目标分布式系统)用来接收序列号sdk获取号段的请求,并将号段资源返回给序列号sdk。假设,某序列号的自定义规则的号段获取模式为远程模式,序列号sdk获取该序列号的号段资源时,需要向服务端发起获取号段资源的请求,服务端接收到该请求后,从其直连的数据库中取出号段资源并返回给序列号sdk。
43.步骤s104,判断预定数据库中是否存在目标序列号的序列号记录,得到判断结果,其中,预定数据库用于存储序列号以及序列号相关信息。
44.可选的,在上述步骤中,判断预定数据库中是否存在目标序列号的序列号记录,如果不存在,则在数据库中创建该条记录;如果存在,则从回收表中取出号段,并将该条记录从回收表中删除。
45.需要说明的是,数据库用于保存序列号资源的使用记录和回收记录。每次获取号段资源时,优先从序列号资源的回收记录表中获取,如果回收记录表中没有该种序列号的记录,则从序列号资源的使用记录表中获取。
46.步骤s106,基于号段获取模式以及判断结果获取号段资源。
47.可选的,在上述步骤中,在号段获取模式以及判断数据库中是否存在于目标序列号的序列号记录的基础上来获取号段资源。
48.步骤s108,根据号段资源生成目标序列号。
49.由上可知,在本发明实施例中,首先可以基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式,其中,号段获取模式包括以下之一:本地获取模式、远程获取模式;接着可以判断预定数据库中是否存在目标序列号的序列号记录,得到判断结果,其中,预定数据库用于存储序列号以及序列号相关信息;接着可以基于号段获取模式以及判断结果获取号段资源;最后可以根据号段资源生成目标序列号。通过本发明实施例提供的分布式系统中序列号的生成方法,达到了基于序列号的号段获取模式以及预定数据库中是否存在目标序列号的序列号记录来生成目标序列号的目的,从而实现了提升生成的序列号实用性的技术效果,进而解决了针对相关技术中生成序列号方式较为繁琐并且对特定数据库依赖性较强导致生成的序列号适用性不强、实用性不高的技术问题。
50.作为一种可选的实施例,在基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式之前,该分布式系统中序列号的生成方法还包括:获取包含目标序列号的多种类型的序列号的序列号信息;基于序列号信息配置多种类型的序列号中每一种序列号的序列号自定义规则。
51.在上述可选的实施例中,序列号的序列号自定义规则是针对每种序列号提供自定义规则的定制。需要说明的是,自定义规则包括:规则id、格式化模板、最小值、最大值、号段长度、回拨模式、号段获取模式和排序模式。序列号的自定义规则存放在配置中心或本地工
程文件中,以保证应用运行时能读取到。
52.进一步地,在本发明实施例中的序列号生成系统中主要包含:序列号sdk(软件开发工具包)、序列号服务端(即目标分布式系统)和序列号数据库(即预定数据库)。下面通过表1对每个组件的功能进行详细说明。
53.表1
54.组件功能序列号sdk生成序列号序列号服务端从数据库获取号段资源,并将号段资源返回给序列号sdk数据库管理序列号资源
55.作为一种可选的实施例,序列号自定义规则包括以下至少之一:序列号规则标识、序列号模板、序列号最小值以及最大值、序列号的号段长度、回拨模式、号段获取模式、排序模式。
56.可选的,下面通过表2对自定义规则的说明进行详细说明。
57.表2
[0058][0059]
作为一种可选的实施例,在基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式之前,该分布式系统中序列号的生成方法还包括:在jvm虚拟机中创建缓存结构,其中,缓存结构用于存储号段资源。
[0060]
在上述可选的实施例中,序列号sdk在jvm缓存中创建存储序列号资源的缓存结构,在本发明实施例中采用双号段的缓存结构,序列号资源以号段的形式存储在缓存中,每个号段包含最小值、最大值和当前值这三个重要属性,下面利用表3对号段属性进行详细说明,其中,当前值即每次获取的序列号值。完成序列号的获取后,此时会根据序列号自定义规则中的格式化模板生成最终业务所需要的序列号。缓存中的序列号资源主要来源于数据库。
[0061]
表3
[0062][0063]
作为一种可选的实施例,基于号段获取模式以及判断结果获取号段资源,包括:在判断结果表示预定数据库中不存在目标序列号的序列号记录时,在确定预定数据库中创建目标序列号的序列号资源记录后,基于号段获取模式从预定数据库中获取号段资源;在判断结果表示预定数据库中存在目标序列号的序列号记录时,检查预定数据库中是否存在号段资源的回收记录,并基于检查结果以及号段获取模式获取号段资源。
[0064]
在上述可选的实施例中,首次获取该序列号,数据库中是不存在该序列号的记录,因此需要在数据库中创建该条记录,所以当数据库中不存在该序列号的记录时,需要在数据库创建一条新纪录的场景包括:数据库中不存在该规则id的序列号;该序列号为按日期回拨的序列号,获取新的日期的序列号时,需要在数据库中创建新日期的序列号资源记录。创建序列号资源记录时,主要根据配置的自定义规则进行创建,sequence_rule_id与自定义规则中的规则id保持一致,version则根据规则中的回拨模式来设置,current_value即规则中的最小值。序列号记录创建完成后,需要从数据库中获取号段资源。根据自定义规则中的号段长度这一属性,将current_value字段更新为原来的值加上号段长度之和。例如,current_value值为1,号段长度值为1000,即需要取走1000个序列号资源,完成号段的获取后,current_value值更新为1001,即下次获取号段从1001开始获取,此次获取的号段资源为1至1000。
[0065]
进一步地,在上述可选的实施例中,当数据库中已存在该序列号的记录,获取号段需要检查数据库中是否存在号段的回收记录,号段的回收记录使用下表来表示。若存在该种序列号的回收记录,则从回收表中取出号段,取出后并将该条记录从回收表中删除。若不存在则从序列号资源记录表中获取号段,需要注意的是,获取号段是否达到了自定义规则中的最大值,如果小于最大值,则根据自定义规则中的号段长度这一属性,将current_value字段更新为原来的值加上号段长度之和,如果大于或等于最大值,则需要判断是否为满回拨,满回拨模式的话则将current_value更新为自定义规则的最小值,非满回拨模式则将current_value更新为自定义规则的最大值,下次再次向数据库中获取号段则报错处理,表示序列号已经达到最大值。
[0066]
需要说明的是,预定数据库分为两种类型的数据库,一是应用所使用的数据库,该数据库中不仅保存着序列号的记录还保存着应用的业务数据;二是序列号服务端所使用的数据库,该数据库只保存序列号的记录。其中,两种类型的数据库保存的序列号记录是互相隔离的。
[0067]
作为一种可选的实施例,基于检查结果以及号段获取模式获取号段资源,包括:在检查结果表示预定数据库中存在号段资源的回收记录时,从回收记录中获取号段资源;在检查结果表示预定数据库中不存在号段资源的回收记录时,从序列号资源记录表中获取号段资源。
[0068]
下面利用表4对序列号资源的回收记录表进行详细说明。
[0069]
表4
[0070][0071]
下面利用表5对序列号资源的使用记录表进行详细说明。
[0072]
表5
[0073][0074][0075]
作为一种可选的实施例,根据号段资源生成目标序列号,包括:从缓存结构中的号段资源中取出目标序列号资源;基于序列号自定义规则以及目标序列号资源生成目标序列号。
[0076]
在上述可选的实施例中,首先从缓存结构中的号段资源中取出目标序列号资源,接着基于序列号自定义规则以及取出的目标序列号资源来生成目标序列号。
[0077]
需要说明的是,在从缓存结构中的号段资源中取出目标序列号资源之前,该分布式系统中序列号的生成方法还包括:将号段资源存储至缓存结构。
[0078]
作为一种可选的实施例,在根据号段资源生成目标序列号之后,该分布式系统中序列号的生成方法还包括:基于号段获取模式回收号段资源;其中,基于号段获取模式回收
号段资源,包括:在号段获取模块为本地获取模式时,将号段资源存储至预定应用所使用的数据库,其中,预定应用为分布式系统中的应用;在号段获取模块为远程获取模式时,将号段资源通过序列号服务端存储服务端的数据库。
[0079]
下面对本发明实施例提供的分布式系统中序列号的生成步骤进行详细说明。
[0080]
步骤1)、应用针对每种序列号配置自定义规则。
[0081]
步骤2)、在jvm中创建存储号段资源的缓存结构。该缓存结构可存储两个号段资源,其中每个号段主要包括三个属性,分别为起始值、终点值和当前值。对于每个号段来说,序列号的生成从该号段的起始值开始生成,直至该号段的终点值,使用当前值来表示当前所获取的序列号。
[0082]
步骤3)、获取号段资源。根据序列号自定义规则中的号段获取模式,选择从本地应用的数据库中获取号段资源还是远程请求服务端获取号段资源。
[0083]
步骤4)、获取号段资源分为以下两种情况:
[0084]
情况一:数据库中不存在该序列号的记录:
[0085]
需要说明该情况的是,首次获取该序列号,数据库中是不存在该序列号的记录,因此需要在数据库中创建该条记录。
[0086]
需要在数据库创建一条新纪录的场景包括:数据库中不存在该规则id的序列号;该序列号为按日期回拨的序列号,获取新的日期的序列号时,需要在数据库中创建新日期的序列号资源记录。创建序列号资源记录时,主要根据配置的自定义规则进行创建,sequence_rule_id与自定义规则中的规则id保持一致,version则根据规则中的回拨模式来设置,current_value即规则中的最小值。序列号记录创建完成后,需要从数据库中获取号段资源。根据自定义规则中的号段长度这一属性,将current_value字段更新为原来的值加上号段长度之和。例如,current_value值为1,号段长度值为1000,即需要取走1000个序列号资源,完成号段的获取后,current_value值更新为1001,即下次获取号段从1001开始获取,此次获取的号段资源为1至1000。
[0087]
情况二:数据库中已存在该序列号的记录。
[0088]
需要说明该情况的是,获取号段需要检查数据库中是否存在号段的回收记录,号段的回收记录使用下表来表示。若存在该种序列号的回收记录,则从回收表中取出号段,取出后并将该条记录从回收表中删除。
[0089]
若不存在则从序列号资源记录表中获取号段,需要注意的是,获取号段是否达到了自定义规则中的最大值,如果小于最大值,则该步骤与情况一中的最后一个步骤相同,如果大于或等于最大值,则需要判断是否为满回拨,满回拨模式的话则将current_value更新为自定义规则的最小值,非满回拨模式则将current_value更新为自定义规则的最大值,下次再次向数据库中获取号段则报错处理,表示序列号已经达到最大值。
[0090]
步骤5)、将获取的号段资源填充至jvm中创建的缓存结构。该缓存结构一共包含两个号段,记作号段1和号段2。其中,号段资源的填充主要分为两种场景。下面结合附图进行详细说明。
[0091]
图4(a)是根据本发明实施例的首次填充号段资源的情况的示意图,如图4(a)所示,获取的号段资源为1-1000的号段填充至号段1的位置,此时缓存中的号段2位置上并不存在号段资源。
[0092]
图4(b)是根据本发明实施例的非首次填充号段资源的情况的示意图,如图4(b)所示,号段1的位置上已经存在号段资源,但号段2的位置上不存在号段资源,此时号段1的序列号资源已使用超过一定的阈值,需要对号段2填充号段资源。为保证分布式系统下序列号生成的高并发和低延时的能力,对号段2的填充采用异步填充的方式。例如,如下图所示,号段1的序列号范围为1-1000,假设填充的阈值为50%,此时号段1消耗的序列号达到501,触发号段2的填充,假设获取的号段范围为2001-3000。
[0093]
下面结合附图对获取序号的各个阶段进行展开详细说明。
[0094]
图5是根据本发明实施例的获取序号的各个阶段的示意图,如图5所示,阶段1,获取号段1的序列号,当前获取的序列号值为156,未超过该号段的50%;阶段2,号段1的序列号已超过50%,触发对号段2的异步填充流程;阶段3,完成异步填充;阶段4,号段1的序列号已耗尽,需要切换号段;阶段5,完成号段的切换,即号段2修改为号段1,号段1修改为号段2。
[0095]
步骤6)、从缓存中取出序列号。缓存中存在号段资源后,则从号段1中取出一个序列号,此时号段1的当前值自增加一,当前值使用java提供的atomiclong的getandincrement进行自增。当号段1的序列号资源消耗完时,切换号段,将号段2更新为号段1,号段更新为号段2。假设号段1的最大值为1000,此时号段1递增得到的序列号为1001,已经超过了1000,于是进行号段的切换,切换主要通过数组的下标更换来实现,将号段2的下标更改为“1”,号段1的下标更改为“2”,即完成切换。序列号的获取和号段切换操作采用读写锁进行实现,获取序列号频率高,此时使用读锁,号段切换操作频率低,此时使用写锁。
[0096]
步骤7)、生成序列号。根据自定义规则中的格式化模板来生成最终的序列号返回给用户。格式化模板类似于java的string format,例如补零。
[0097]
步骤8)、序列号回收。由于序列号资源以号段的形式缓存在jvm中,且一些序列号本身资源就有限,本发明提供了序列号的回收功能,主要是应用程序在优雅停机时对jvm缓存中号段资源的回收,将回收的号段资源存储在序列号回收表中。
[0098]
图6是根据本发明实施例的序列号回收的示意图,如图6所示,当前缓存中存在号段1和号段2,号段1范围为1-1000,号段2范围为1001-2000,回收时号段1已使用至56,则需要回收的号段为57-1000和1001-2000。回收时需要根据序列号自定义规则中号段获取模式来选择回收的数据库,如果为本地模式则直接将需要回收的号段存储在应用所使用的数据库中;号段获取模式为远程模式时,则发起远程调用序列号服务端的请求,将待回收的号段通过序列号服务端存储在序列号的数据库中。
[0099]
由上可知,通过本发明实施例提供的分布式系统中序列号的生成方法,用户可以对不同的序列号采用不同的号段获取模式,其中,采用本地模式,将序列号的数据存储于应用所使用的数据库,序列号的生成不依赖于序列号服务端;采用远程模式,可以统一管理号段资源的获取,也方便线性扩展,同时,存储号段资源的缓存结构采取双号段结构,每次获取序列号从号段1中进行获取,当号段1的序列号消耗到本号段资源的一定阈值时,异步填充号段2;当号段1的序列号资源耗尽时,切换号段,并且优雅停机时对序列号资源的回收和填充号段优先使用回收的号段。由于业务所需要的序列号资源有限,且存储在缓存中,应用程序优雅停机时将缓存中的号段资源记录至数据库的回收表中,且填充缓存的号段时优先使用回收表中的号段,避免了序列号资源的浪费。
[0100]
进一步地,本发明实施例提供的分布式系统中序列号的生成方法还具有以下优
势:
[0101]
(1)满足用户对于序列号规则的定制化。针对不同业务场景,用户可定制不同的序列号规则
[0102]
(2)高可用性,能容忍数据库一定时间的不可用。采用双号段式缓存结构,当数据库不可用时,缓存中还存在一定的序列号资源,只要能在缓存在序列号资源耗尽前恢复数据库系统即可正常运行。另外,号段模式中采用本地模式,将序列号的数据存储于应用所使用的数据库,当序列号数据库或序列号服务端不可用时,仍能保证业务的正常进行。
[0103]
(3)高并发、低时延。将序列号资源存储在jvm缓存中,直接从缓存中获取序列号,运行时的填充号段使用异步线程来完成。
[0104]
实施例2
[0105]
根据本发明实施例的另外一个方面,还提供了一种分布式系统中序列号的生成装置,图7是根据本发明实施例的分布式系统中序列号的生成装置的示意图,如图7所示,包括:确定模块71、判断模块73、第一获取模块75以及生成模块77。下面对该分布式系统中序列号的生成装置进行说明。
[0106]
确定模块71,用于基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式,其中,号段获取模式包括以下之一:本地获取模式、远程获取模式;
[0107]
判断模块73,用于判断预定数据库中是否存在目标序列号的序列号记录,得到判断结果,其中,预定数据库用于存储序列号以及序列号相关信息;
[0108]
第一获取模块75,用于基于号段获取模式以及判断结果获取号段资源;
[0109]
生成模块77,用于根据号段资源生成目标序列号。
[0110]
此处需要说明的是,上述确定模块71、判断模块73、第一获取模块75以及生成模块77对应于实施例1中的步骤s102至s108,上述模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例1所公开的内容。需要说明的是,上述模块作为装置的一部分可以在诸如一组计算机可执行指令的计算机系统中执行。
[0111]
由上可知,在本发明实施例中,首先可以借助确定模块71基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式,其中,号段获取模式包括以下之一:本地获取模式、远程获取模式;接着借助判断模块73判断预定数据库中是否存在目标序列号的序列号记录,得到判断结果,其中,预定数据库用于存储序列号以及序列号相关信息;接着借助第一获取模块75基于号段获取模式以及判断结果获取号段资源;最后借助生成模块77根据号段资源生成目标序列号。通过本发明实施例提供的分布式系统中序列号的生成装置,达到了基于序列号的号段获取模式以及预定数据库中是否存在目标序列号的序列号记录来生成目标序列号的目的,从而实现了提升生成的序列号实用性的技术效果,进而解决了针对相关技术中生成序列号方式较为繁琐并且对特定数据库依赖性较强导致生成的序列号适用性不强、实用性不高的技术问题。
[0112]
可选地,该分布式系统中序列号的生成装置还包括:第二获取模块,用于在基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式之前,获取包含目标序列号的多种类型的序列号的序列号信息;自定义规则模块,用于基于序列号信息配置多种类型的序列号中每一种序列号的序列号自定义规则。
[0113]
可选地,序列号自定义规则包括以下至少之一:序列号规则标识、序列号模板、序
列号最小值以及最大值、序列号的号段长度、回拨模式、号段获取模式、排序模式。
[0114]
可选地,该分布式系统中序列号的生成装置还包括:创建模块,用于在基于序列号自定义规则确定目标分布式系统所需目标序列号的号段获取模式之前,在jvm虚拟机中创建缓存结构,其中,缓存结构用于存储号段资源。
[0115]
可选地,第一获取模块,包括:获取单元,用于在判断结果表示预定数据库中不存在目标序列号的序列号记录时,在确定预定数据库中创建目标序列号的序列号资源记录后,基于号段获取模式从预定数据库中获取号段资源;检查单元,用于在判断结果表示预定数据库中存在目标序列号的序列号记录时,检查预定数据库中是否存在号段资源的回收记录,并基于检查结果以及号段获取模式获取号段资源。
[0116]
可选地,检查单元,包括:第一获取子单元,用于在检查结果表示预定数据库中存在号段资源的回收记录时,从回收记录中获取号段资源;第二获取子单元,用于在检查结果表示预定数据库中不存在号段资源的回收记录时,从序列号资源记录表中获取号段资源。
[0117]
可选地,生成模块,包括:取出单元,用于从缓存结构中的号段资源中取出目标序列号资源;生成单元,用于基于序列号自定义规则以及目标序列号资源生成目标序列号。
[0118]
可选地,该分布式系统中序列号的生成装置还包括:回收模块,用于在根据号段资源生成目标序列号之后,基于号段获取模式回收号段资源;其中,回收模块,包括:第一存储单元,用于在号段获取模块为本地获取模式时,将号段资源存储至预定应用所使用的数据库,其中,预定应用为分布式系统中的应用;第二存储单元,用于在号段获取模块为远程获取模式时,将号段资源通过序列号服务端存储服务端的数据库。
[0119]
实施例3
[0120]
根据本发明实施例的另外一个方面,还提供了一种计算机可读存储介质,计算机可读存储介质包括存储的计算机程序,其中,在计算机程序被处理器运行时控制计算机可读存储介质所在设备执行上述中任一项的分布式系统中序列号的生成方法。
[0121]
实施例4
[0122]
根据本发明实施例的另外一个方面,还提供了一种处理器,处理器用于运行计算机程序,其中,计算机程序运行时执行上述中任一项的分布式系统中序列号的生成方法。
[0123]
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0124]
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
[0125]
在本技术所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
[0126]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0127]
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以
是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0128]
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
[0129]
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1