一种流水号生成方法和装置、计算设备和存储介质与流程

文档序号:24413726发布日期:2021-03-26 20:23阅读:152来源:国知局
一种流水号生成方法和装置、计算设备和存储介质与流程

1.本发明涉及数据处理技术领域,尤其涉及一种流水号生成方法和装置、计算设备和存储介质。


背景技术:

2.在软件系统中,经常会遇到给应用设置流水号的情况,以对不同的应用进行区分。
3.现有技术,基于数据库生成流水号的方案中,在生成过程中,多个应用会访问同一数据库,导致数据库的压力过大,性能不足,从而不满足业务需要。


技术实现要素:

4.本发明提供一种流水号生成方法和装置、计算设备和存储介质,用以解决现有技术中存在的技术缺陷。
5.本发明提供一种流水号生成方法,包括:
6.在目标应用启动的过程中,发送编号请求至应用编号服务器,以使所述应用编号服务器根据所述编号请求在编号数据库中查询机器编号;
7.接收所述应用编号服务器返回的机器编号;
8.生成目标应用的流水号信息,根据所述流水号信息和所述机器编号,生成所述目标应用对应的流水号。
9.根据本发明提供的一种流水号生成方法,在目标应用启动的过程中,发送编号请求至应用编号服务器,包括:
10.在目标应用启动的过程中,生成编号请求,其中,所述编号请求包括应用名称、主机名称以及局域网地址;
11.将所述编号请求通过协议链路发送至所述应用编号服务器。
12.根据本发明提供的一种流水号生成方法,所述应用编号服务器根据所述编号请求在编号数据库中查询机器编号,包括:
13.所述应用编号服务器根据所述编号请求中的应用名称在编号数据库中查询当前最大的机器编号,其中,编号数据库中包括n个机器编号;
14.若查询不到当前最大的机器编号,确定当前的机器编号段为1至n,在所述当前的机器编号段中按照从小到大的顺序依次确定所述编号请求对应的机器编号,并在当前的机器编号段使用完毕后,将n个机器编号更新为下一个相邻的编号段;
15.若查询得到当前最大的机器编号,判断所述当前最大的机器编号是否大于等于第一阈值;
16.若大于等于第一阈值,更新当前的机器编号段为1至n,在所述当前的机器编号段中按照从小到大的顺序依次确定所述编号请求对应的机器编号,并在当前的机器编号段使用完毕后,将n个机器编号更新为下一个相邻的编号段;
17.若小于第一阈值,在所述当前的机器编号段中按照从小到大的顺序依次确定所述
编号请求对应的机器编号,并在当前的机器编号段使用完毕后,将n个机器编号更新为下一个相邻的编号段。
18.根据本发明提供的一种流水号生成方法,所述应用编号服务器在接收到编号请求后,所述方法还包括:
19.所述应用编号服务器获取发送该编号请求的网络地址;
20.根据所述网络地址,以应用名称为主键请求分布式锁;
21.判断是否获取到分布式锁;
22.若是,执行所述应用编号服务器根据所述编号请求在编号数据库中查询机器编号的步骤;
23.若否,在间隔时间段内重试请求所述分布式锁。
24.根据本发明提供的一种流水号生成方法,生成目标应用的流水号信息,包括:
25.通过分布式流水号组件生成目标应用的符号位、版本号、时间戳、时钟回拨标识和序列号中的至少一项。
26.根据本发明提供一种的流水号生成方法,所述时钟回拨标识通过以下方法生成:获取时间戳,判断当前获取的时间戳是否大于前一个时间戳;若是,获取时钟回拨标识位;若否,将时钟回拨标识位自增1,获取时钟回拨标识位。
27.根据本发明提供的一种流水号生成方法,所述序列号通过以下方法生成:
28.判断当前的时间戳与前一个时间戳是否在同一秒内;
29.若否,将序列号设置为0,等待下一秒重新获取时间戳后再进行标记;
30.若是,将序列号自增1,然后判断自增1后的序列号是否大于第二阈值;
31.若自增1后的序列号大于第二阈值,将序列号设置为0,等待下一秒重新获取时间戳后再进行标记;
32.若自增1后的序列号小于等于第二阈值,输出所述序列号。
33.本发明还提供一种流水号生成装置,包括:
34.编号请求模块,用于在目标应用启动的过程中,发送编号请求至应用编号服务器,以使所述应用编号服务器根据所述编号请求在编号数据库中查询机器编号;
35.机器编号接收模块,用于接收所述应用编号服务器返回的机器编号;
36.流水号生成模块,用于生成目标应用的流水号信息,根据所述流水号信息和所述机器编号,生成所述目标应用对应的流水号。
37.本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述流水号生成方法的步骤。
38.本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述流水号生成方法的步骤。
39.本发明提供的流水号生成方法和装置,在目标应用启动的过程中,通过请求应用编号服务器查询机器编号,并在查询到机器编号后,不再访问服务器,而是通过自身来生成流水号,从而可以快速、高效、准确地生成流水号。
40.另外,面对发生时钟回拨的恶劣情况,本发明的流水号生成方法通过时间戳生成时钟回拨标识位,并在当前获取的时间戳小于前一个时间戳的情况下将时钟回拨标识位自
增1,这样即使在时钟回拨发生时,也可以保证生成的流水号的唯一性。
附图说明
41.为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
42.图1是本发明提供的流水号生成方法的流程示意图之一;
43.图2是本发明提供的流水号生成方法的流程示意图之二;
44.图3是本发明提供的流水号生成方法的流程示意图之三;
45.图4是本发明提供的流水号生成方法的流程示意图之四;
46.图5是本发明提供的流水号生成装置的结构示意图;
47.图6是本发明提供的电子设备的结构示意图。
具体实施方式
48.为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
49.本发明实施例公开了一种流水号生成方法,参见图1,包括:
50.101、在目标应用启动的过程中,发送编号请求至应用编号服务器,以使所述应用编号服务器根据所述编号请求在编号数据库中查询机器编号。
51.其中,编号数据库中存储有t_app_info表,表中存储有n个机器编号。根据应用名称,在编号数据库中查询对应的机器编号。若查询不到机器编号,则将编号数据库中当前的机器编号段设置为1~n,将该目标应用对应的机器编号设置为1。
52.若查询到当前编号数据库中最大的机器编号段大于设定的阈值,例如阈值设置为16383,则意味着机器编号需要重新从1开始进行编号。
53.在实际使用时,一般地,每个应用布置多个节点,每个节点会对应地生成流水号。例如一个应用有10个节点,在首次获取机器编号时,在编号数据库中获得的机器编号为1~10;在第二次获取机器编号时,在编号数据库中获得的机器编号为11~20
……
以此类推,直至要获得的机器编号大于设定阈值,则重新从1开始循环。由于每个应用的节点不会大于设定阈值,所以不会出现机器编号不够用或者重复的情况。
54.具体地,步骤101包括:
55.在目标应用启动的过程中,生成编号请求,其中,所述编号请求包括应用名称、主机名称以及局域网地址;将所述编号请求通过协议链路的方式发送至所述应用编号服务器。
56.其中,本实施例中可以在应用启动过程中,通过应用中的分布式流水号组件来生成编号请求。
57.其中,具体的协议链路有多种,例如超文本传输http协议、用户数据报udp协议等
等。
58.102、接收所述应用编号服务器返回的机器编号。
59.本实施例中,在目标应用的启动过程中获取机器编号,之后不再跟应用编号服务器等外界服务器交互,以提高性能,减少依赖。
60.103、生成目标应用的流水号信息,根据所述流水号信息和所述机器编号,生成所述目标应用对应的流水号。
61.其中,流水号信息包括:符号位、版本号、时间戳、时钟回拨标识和序列号中的至少一项。用二进制64位来存储符号位、版本号、时间戳、时钟回拨标识、序列号和机器编号6个信息。
62.1)符号位在二进制数字中的位置是第64位,默认值是0;
63.2)秒级时间戳在二进制数字中的位置是35位至63位,值是获取的当前系统时间戳;
64.3)版本号在二进制数字中的位置是32至34位,取值范围是1

999;
65.4)机器编号在二进制数字中的位置第17位至31位,值是步骤102获取的值。
66.5)时钟回拨标识在二进制数字中的位置是第15、16位。当发现当前的时间戳小于之前获取的时间戳时,此标识位自增1。
67.6)序列号在二进制数字中的位置是1到14位。取值范围是0至16383,在当前一秒内,初始值为0,每次生成序列号自增1,如果序列号等于16383,则延迟序列号到下一秒重新获取时间戳生成序列号。
68.参见下表1,表1示出了一种流水号的结构表示。
69.表1
[0070][0071]
本发明实施例提供的流水号生成方法,在目标应用启动的过程中,通过请求应用编号服务器查询机器编号,并在查询到机器编号后,不再访问服务器,而是通过自身来生成流水号,从而可以快速、高效、准确地生成流水号。
[0072]
本发明实施例公开了一种流水号生成方法,参见图2,包括下述步骤201~208:
[0073]
201、在目标应用启动的过程中,发送编号请求至应用编号服务器。
[0074]
具体地,步骤201包括:在目标应用启动的过程中,通过分布式流水号组件生成编
号请求,其中,编号请求包括应用名称、主机名称以及局域网地址。分布式流水号组件将编号请求通过超文本传输协议http的方式发送至应用编号服务器。
[0075]
202、应用编号服务器在接收到编号请求后,获取发送该编号请求的网络地址。
[0076]
203、应用编号服务器根据所述网络地址,以应用名称为主键请求分布式锁。
[0077]
本实施例中,应用编号服务器接到编号请求后,自动获取请求者的ip地址。并以应用名称为主键,利用redis的setnx命令特性,进行分布式锁,用来保障分配机器编号并发问题。
[0078]
为了防止分布式系统中的多个应用的进程之间相互干扰,需要一种分布式协调技术来对这些应用的进程进行调度。而这个分布式协调技术的核心就是通过分布式锁来实现。
[0079]
204、应用编号服务器判断是否获取到分布式锁,若是,执行步骤205,若否,执行步骤206。
[0080]
205、应用编号服务器根据所述编号请求在编号数据库中查询机器编号,然后执行步骤207。
[0081]
具体地,参见图3,步骤205包括下述步骤301~305:
[0082]
301、所述应用编号服务器判断根据所述编号请求中的应用名称在编号数据库中是否查询当前最大的机器编号,若否,执行步骤302;若是,执行步骤303。
[0083]
其中,编号数据库中包括n个机器编号。
[0084]
302、若查询不到当前最大的机器编号,确定当前的机器编号段为1至n,然后执行步骤305。
[0085]
303、若查询得到当前最大的机器编号,判断所述当前最大的机器编号是否大于等于第一阈值,若是,执行步骤304,若否,执行步骤305。
[0086]
304、更新当前的机器编号段为1至n,然后执行步骤305。
[0087]
305、在所述当前的机器编号段中按照从小到大的顺序依次确定所述编号请求对应的机器编号,并在当前的机器编号段使用完毕后,将n个机器编号更新为下一个相邻的编号段。
[0088]
以n=10为例,第一个编号段为1~10,下一个相邻的编号段为11~20,
……
以此类推。当n个机器编号中的最大编号超过了第一阈值,则意味着机器编号应当重新开始计数。
[0089]
其中,第一阈值可以根据实际需求而设置,例如设置为16383。
[0090]
具体设置时,一个应用中的节点数小于等于n,且第一阈值不应当超过一个应用中的节点数,这样应用的节点在更新流水号时,不会出现每次重启后更新所需要的机器编号超过第一阈值的情形。
[0091]
206、应用编号服务器在间隔时间段内重试请求所述分布式锁,并执行步骤204。
[0092]
207、目标应用接收所述应用编号服务器返回的机器编号。
[0093]
其中,目标应用中设置有分布式流水号组件,通过该组件可以实现接收机器编号,并在后续步骤中生成流水号的作用。
[0094]
208、目标应用通过所述分布式流水号组件生成目标应用的符号位、版本号、时间戳、时钟回拨标识和序列号,通过分布式流水号组件根据目标应用的符号位、版本号、时间戳、时钟回拨标识、序列号和机器编号,生成目标应用对应的流水号。
[0095]
其中,时钟回拨标识通过以下步骤s281~s283生成:
[0096]
s281、获取时间戳,判断当前获取的时间戳是否大于前一个时间戳;
[0097]
s282、若是,获取时钟回拨标识位;
[0098]
s283、若否,将时钟回拨标识位自增1,获取时钟回拨标识位。
[0099]
通过时钟回拨标识位的生成,可以在机器时钟发生回拨的恶劣情况下保障流水号的唯一性。
[0100]
其中,参见图4,序列号通过以下步骤401~406生成:
[0101]
401、判断当前的时间戳与前一个时间戳是否在同一秒内,若否,执行步骤402,若是,执行步骤403。
[0102]
402、将序列号设置为0,等待下一秒重新获取时间戳后再进行标记。
[0103]
需要解释的是,对于时间戳不在同一秒的情况,两个序列号应当分属于不同的流水号序列。通过步骤402的处理,避免不属于同一流水号序列的序列号在同一流水号序列中生成,保证流水号生成的准确性。
[0104]
403、将序列号自增1。
[0105]
404、判断自增1后的序列号是否大于第二阈值。
[0106]
405、若自增1后的序列号大于第二阈值,将序列号设置为0,等待下一秒重新获取时间戳后再进行标记。
[0107]
其中,第二阈值可以为16383。
[0108]
406、若自增1后的序列号小于等于第二阈值,输出所述序列号。
[0109]
本实施例提供的流水号生成方法,在目标应用启动的过程中,请求应用编号服务器查询机器编号,并在查询到机器编号后,不再访问服务器,而是通过自身来生成流水号,从而可以快速、高效、准确地生成流水号。
[0110]
另外,面对发生时钟回拨的恶劣情况,本发明的流水号生成方法通过时间戳生成时钟回拨标识位,并在当前获取的时间戳小于前一个时间戳的情况下将时钟回拨标识位自增1,这样即使在时钟回拨发生时,也可以保证生成的流水号的唯一性。
[0111]
下面对本发明提供的流水号生成装置进行描述,下文描述的流水号生成装置与上文描述的流水号生成方法可相互对应参照。
[0112]
本实施例公开了一种流水号生成装置,参见图5,包括:
[0113]
编号请求模块501,用于在目标应用启动的过程中,发送编号请求至应用编号服务器;
[0114]
查询模块502,用于所述应用编号服务器根据所述编号请求在编号数据库中查询机器编号;
[0115]
机器编号接收模块503,用于接收所述应用编号服务器返回的机器编号;
[0116]
流水号生成模块504,用于生成目标应用的流水号信息,根据所述流水号信息和所述机器编号,生成所述目标应用对应的流水号。
[0117]
可选地,编号请求模块501,具体用于:在目标应用启动的过程中,生成编号请求,其中,所述编号请求包括应用名称、主机名称以及局域网地址;
[0118]
将所述编号请求通过协议链路发送至所述应用编号服务器。
[0119]
可选地,所述查询模块502,具体用于:
[0120]
所述应用编号服务器根据所述编号请求中的应用名称在编号数据库中查询当前最大的机器编号,其中,编号数据库中包括n个机器编号;
[0121]
若查询不到当前最大的机器编号,确定当前的机器编号段为1至n,在所述当前的机器编号段中按照从小到大的顺序依次确定所述编号请求对应的机器编号,并在当前的机器编号段使用完毕后,将n个机器编号更新为下一个相邻的编号段;
[0122]
若查询得到当前最大的机器编号,判断所述当前最大的机器编号是否大于等于第一阈值;
[0123]
若大于等于第一阈值,更新当前的机器编号段为1至n,在所述当前的机器编号段中按照从小到大的顺序依次确定所述编号请求对应的机器编号,并在当前的机器编号段使用完毕后,将n个机器编号更新为下一个相邻的编号段;
[0124]
若小于第一阈值,在所述当前的机器编号段中按照从小到大的顺序依次确定所述编号请求对应的机器编号,并在当前的机器编号段使用完毕后,将n个机器编号更新为下一个相邻的编号段。
[0125]
可选地,所述装置还包括:
[0126]
地址获取模块,用于所述应用编号服务器获取发送该编号请求的网络地址;
[0127]
分布式锁请求模块,用于根据所述网络地址,以应用名称为主键请求分布式锁;
[0128]
判断模块,用于判断是否获取到分布式锁,若是,执行所述查询模块502,若否,执行重试请求模块;
[0129]
重试请求模块,用于在间隔时间段内重试请求所述分布式锁。
[0130]
可选地,流水号生成模块504,具体用于:通过所述分布式流水号组件生成目标应用的符号位、版本号、时间戳、时钟回拨标识和序列号中的至少一项。
[0131]
可选地,所述装置还包括时钟回拨标识模块,用于:
[0132]
获取时间戳,判断当前获取的时间戳是否大于前一个时间戳;
[0133]
若是,获取时钟回拨标识位;
[0134]
若否,将时钟回拨标识位自增1,获取时钟回拨标识位。
[0135]
可选地,所述装置还包括序列号生成模块,用于:
[0136]
判断当前的时间戳与前一个时间戳是否在同一秒内;
[0137]
若否,将序列号设置为0,等待下一秒重新获取时间戳后再进行标记;
[0138]
若是,将序列号自增1,然后判断自增1后的序列号是否大于第二阈值;
[0139]
若自增1后的序列号大于第二阈值,将序列号设置为0,等待下一秒重新获取时间戳后再进行标记;
[0140]
若自增1后的序列号小于等于第二阈值,输出所述序列号。
[0141]
本发明提供的流水号生成装置,在目标应用启动的过程中,请求应用编号服务器查询机器编号,并在查询到机器编号后,不再访问服务器,而是通过自身来生成流水号,从而可以快速、高效、准确地生成流水号。
[0142]
图6示例了一种电子设备的实体结构示意图,如图6所示,该电子设备可以包括:处理器(processor)610、通信接口(communications interface)620、存储器(memory)630和通信总线640,其中,处理器610,通信接口620,存储器830通过通信总线640完成相互间的通信。处理器610可以调用存储器630中的逻辑指令,以执行流水号生成方法,包括:
[0143]
在目标应用启动的过程中,发送编号请求至应用编号服务器,以使所述应用编号服务器根据所述编号请求在编号数据库中查询机器编号;
[0144]
接收所述应用编号服务器返回的机器编号;
[0145]
生成目标应用的流水号信息,根据所述流水号信息和所述机器编号,生成所述目标应用对应的流水号。
[0146]
此外,上述的存储器630中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read

only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0147]
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法所提供的流水号生成方法,包括:
[0148]
在目标应用启动的过程中,发送编号请求至应用编号服务器,以使所述应用编号服务器根据所述编号请求在编号数据库中查询机器编号;
[0149]
接收所述应用编号服务器返回的机器编号;
[0150]
生成目标应用的流水号信息,根据所述流水号信息和所述机器编号,生成所述目标应用对应的流水号。
[0151]
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各提供的流水号生成方法,包括:
[0152]
在目标应用启动的过程中,发送编号请求至应用编号服务器,以使所述应用编号服务器根据所述编号请求在编号数据库中查询机器编号;
[0153]
接收所述应用编号服务器返回的机器编号;
[0154]
生成目标应用的流水号信息,根据所述流水号信息和所述机器编号,生成所述目标应用对应的流水号。
[0155]
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
[0156]
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
[0157]
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1