一种消息幂等处理、生成和消费方法、装置和计算机设备与流程

文档序号:30061778发布日期:2022-05-17 23:48阅读:79来源:国知局
一种消息幂等处理、生成和消费方法、装置和计算机设备与流程

1.本发明涉及大数据数据分析技术领域,尤其是一种消息幂等处理、生成和消费方法、装置和计算机设备。


背景技术:

2.消息中间件能够为分布式应用之间提供高效、可靠的数据传输服务,但其为了保证消息的可达性所采用的超时、重传或确认机制,可能会导致同一条消息推送给多个消息服务端或业务方。而分布式系统中的不同服务端或业务方在消费消息时是相互独立互无感知的,因此无法判断该条消息是否已经被他人消费过或者正在消费,导致同一条消息被多次消费,最终造成损失。
3.因此,本文旨在提供一种消息幂等处理、生成和消费方法、装置和计算机设备,以解决现有技术中存在的重复消费消息的问题。


技术实现要素:

4.针对现有技术的上述问题,本文的目的在于,提供一种消息幂等处理、生成和消费方法、装置和计算机设备,以解决现有技术中消息被重复消费的问题。
5.为了解决上述技术问题,本文的具体技术方案如下:
6.第一方面,本文提供一种消息幂等处理方法,包括:
7.接收消费者对消息的消费请求;
8.解析所述消费请求,获得与所述消息相对应的唯一标识符和业务版本号;
9.根据所述唯一标识符,查询redis缓存中预先存储的与所述消息相对应的目标版本号;
10.判断所述业务版本号与所述目标版本号是否一致;
11.当所述业务版本号与所述目标版本号一致时,确定所述消息为未消费并反馈给消费者,以使所述消费者获取所述消息的业务代码并消费所述消息;并将所述目标版本号由初值改为终值。
12.第二方面,本文还提供一种消息幂等处理装置,包括:
13.第一接收模块,用于接收消费者对消息的消费请求;
14.解析模块,用于解析所述消费请求,获得与所述消息相对应的唯一标识符和业务版本号;
15.查询模块,用于根据所述唯一标识符,查询redis缓存中预先存储的与所述消息相对应的目标版本号;
16.判断模块,用于判断所述业务版本号与所述目标版本号是否一致;
17.执行模块,用于当所述业务版本号与所述目标版本号一致时,确定所述消息为未消费并反馈给消费者,以使所述消费者获取所述消息的业务代码并消费所述消息;并将所述目标版本号由初值改为终值。
18.进一步地,所述消息幂等处理装置还包括判断模块;
19.所述判断模块用于在根据所述唯一标识符,查询redis缓存中预先存储的与所述消息相对应的目标版本号之前,判断是否成功获取所述redis缓存的文件锁;
20.若是,则查询所述redis缓存中预先存储的与所述消息相对应的目标版本号;
21.若否,则确定所述消费者不具备对所述消息的消费资格。
22.第三方面,本文提供一种消息生成方法,包括:
23.生成消息,所述消息包括业务代码和与所述消息相对应的唯一标识符和业务版本号,所述唯一标识符用于唯一确定所述消息,所述业务版本号用于标记所述消息的消费状态;
24.将所述消息存储于消息中间件中,以使所述消息中间件将所述消息推送给消费者;
25.将所述唯一标识符同步存储于redis缓存中,以及将所述业务版本号同步存储于redis缓存中作为目标版本号。
26.第四方面,本文还提供一种消息生成装置,包括:
27.消息生成模块,用于生成消息,所述消息包括业务代码和与所述消息相对应的唯一标识符和业务版本号,所述唯一标识符用于唯一确定所述消息,所述业务版本号用于标记所述消息的消费状态;
28.存储模块,用于将所述消息存储于消息中间件中,以使所述消息中间件将所述消息推送给消费者;
29.同步模块,用于将所述唯一标识符同步存储于redis缓存中,以及将所述业务版本号同步存储于redis缓存中作为目标版本号。
30.第五方面,本文提供一种消息消费方法,包括:
31.获取消息中间件推送的消息,所述消息包括与所述消息相对应的唯一标识符和业务版本号;
32.生成对所述消息的消费请求并发送给消息幂等处理装置,所述消费请求包括所述唯一标识符和所述业务版本号,以使所述消息幂等处理装置根据所述唯一标识符和所述业务版本号反馈所述消息的消费状态;
33.接收所述消息幂等处理装置返回的所述消息的消费状态;
34.当所述消费状态为未消费时,基于所述唯一标识符查询所述消息中间件以获取所述消息的业务代码,并执行所述业务代码以消费所述消息。
35.第六方面,本文还提供一种消息消费装置,包括:
36.获取模块,用于获取消息中间件推送的消息,所述消息包括与所述消息相对应的唯一标识符和业务版本号;
37.消费请求生成模块,用于生成对所述消息的消费请求并发送给消息幂等处理装置,所述消费请求包括所述唯一标识符和所述业务版本号,以使所述消息幂等处理装置根据所述唯一标识符和所述业务版本号反馈所述消息的消费状态;
38.第二接收模块,用于接收所述消息幂等处理装置返回的所述消息的消费状态;
39.消费模块,用于当所述消费状态为未消费时,基于所述唯一标识符查询所述消息中间件以获取所述消息的业务代码,并执行所述业务代码以消费所述消息。
40.第七方面,本文提供一种消息处理方法,包括:
41.消息生成装置生成消息并将所述消息存储于消息中间件中,以及将所述消息的唯一标识符和业务版本号同步存储于redis缓存中,所述唯一标识符用于唯一确定所述消息,所述业务版本号用于标记所述消息的消费状态;
42.消息消费装置接收所述消息中间件推送的消息,生成对所述消息的消费请求发送给消息幂等处理装置,所述消费请求包括所述唯一标识符和所述业务版本号;
43.消息幂等处理装置解析所述消费请求,根据解析得到的所述唯一标识符和所述业务版本号确定所述消息的消费状态并反馈给所述消息消费装置,以使所述消息消费装置在所述消费状态为未消费时,根据所述唯一标识符查询所述消息中间件获取并执行所述消息的业务代码以消费所述消息。
44.第八方面,本文还提供一种消息处理系统,包括:
45.消息生成装置,用于生成消息并将所述消息存储于消息中间件中,以及将所述消息的唯一标识符和业务版本号同步存储于redis缓存中,所述唯一标识符用于唯一确定所述消息,所述业务版本号用于标记所述消息的消费状态;
46.消息消费装置,用于接收所述消息中间件推送的消息,生成对所述消息的消费请求发送给消息幂等处理装置,所述消费请求包括所述唯一标识符和所述业务版本号;
47.消息幂等处理装置,用于解析所述消费请求,根据解析得到的所述唯一标识符和所述业务版本号确定所述消息的消费状态并反馈给所述消息消费装置,以使所述消息消费装置在所述消费状态为未消费时,根据所述唯一标识符查询所述消息中间件获取并执行所述消息的业务代码以消费所述消息。
48.第九方面,本文提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上述技术方案提供的方法。
49.第十方面,本文提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如上述技术方案提供的方法。
50.以及第十一方面,本文提供一种计算机程序产品,包括至少一条指令或至少一段程序,所述至少一条指令或所述至少一段程序由处理器加载并执行以实现如上述技术方案提供的方法。
51.采用上述技术方案,本文所述一种消息幂等处理、生成和消费方法、装置和计算机设备,利用消息的版本号取代状态机的状态流转机制,能够避免状态流转失败甚至状态逆流转的问题,从而避免了消息不幂等的情况;并且,将消息的版本号和唯一标识符作存储于redis缓存中,能够保证存储的稳定性,避免目标版本号被篡改;且redis缓存能够在高并发场景下,降低系统i/o,提高系统吞吐量。
52.为让本文的上述和其他目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附图式,作详细说明如下。
附图说明
53.为了更清楚地说明本文实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本文
的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
54.图1示出了本文实施例提供的一种消息幂等处理方法的步骤流程图;
55.图2示出了本文实施例中判断是否获取redis缓存文件锁的步骤流程图;
56.图3示出了本文实施例中判断消息是否过期的步骤流程图;
57.图4示出了本文实施例中判断redis缓存中是否存储有唯一标识符和目标版本号的步骤流程图;
58.图5示出了本文实施例提供的一种消息幂等处理装置的结构示意图;
59.图6示出了本文实施例提供的一种消息生成方法的步骤流程图;
60.图7示出了本文实施例提供的一种消息生成装置的结构示意图;
61.图8示出了本文实施例提供的一种消息消费方法的步骤流程图;
62.图9示出了本文实施例中提供的判断消息是否异常的步骤流程图;
63.图10示出了本文实施例中另一种判断消息是否过期的步骤流程图;
64.图11示出了本文实施例提供的一种消息消费装置的结构示意图;
65.图12示出了本文实施例提供的一种消息处理方法的步骤流程图;
66.图13示出了本文实施例中另一种消息处理方法的步骤流程图;
67.图14示出了本文实施例提供的一种消息处理系统的结构流程图;
68.图15示出了本文实施例提供的一种计算机设备的结构示意图。
69.附图符号说明:
70.51、第一接收模块;
71.52、解析模块;
72.53、查询模块;
73.54、判断模块;
74.55、执行模块;
75.71、消息生成模块;
76.72、存储模块;
77.73、同步模块;
78.111、获取模块;
79.112、消费请求生成模块;
80.113、第二接收模块;
81.114、消费模块;
82.141、消息生成装置;
83.142、消息消费装置;
84.143、消息幂等处理装置;
85.1502、计算机设备;
86.1504、处理器;
87.1506、存储器;
88.1508、驱动机构;
89.1510、输入/输出模块;
90.1512、输入设备;
91.1514、输出设备;
92.1516、呈现设备;
93.1518、图形用户接口;
94.1520、网络接口;
95.1522、通信链路;
96.1524、通信总线。
具体实施方式
97.下面将结合本文实施例中的附图,对本文实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本文一部分实施例,而不是全部的实施例。基于本文中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本文保护的范围。
98.需要说明的是,本文的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本文的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、装置、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
99.消息中间件能够为分布式应用之间提供高效、可靠的数据传输服务,高并发的分布式系统消费的场景下,同一条消息只允许由一个消费者进行消费,而消息中间件其为了保证消息的可达性所采用的超时、重传或确认机制,可能会导致同一条消息推送给多个消息服务端或业务方。而分布式系统中的不同服务端或业务方在消费消息时是相互独立互无感知的,因此无法判断该条消息是否已经被他人消费过或者正在消费,导致同一条消息被多次消费,最终造成损失。
100.为了解决上述问题,本文实施例提供了一种消息幂等处理、生成和消费方法、装置和计算机设备,能够避免消息的重复消费。图1是本文实施例提供的一种消息幂等处理方法的步骤示意图,本说明书提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的系统或装置产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行。所述方法适用于消息幂等处理装置,具体的如图1所示,所述方法可以包括:
101.s110:接收消费者对消息的消费请求。
102.s120:解析所述消费请求,获得与所述消息相对应的唯一标识符和业务版本号。
103.所述唯一标识符可以包括所述消息的业务指纹码和业务主键,所述业务指纹码是表征消息唯一特性的属性参数的组合;所述业务主键可以从消息的业务层面上来反应消息唯一性的信息,比如订单号、员工编号、商品编号等。即所述唯一标识符用于唯一确定所述消息。所述业务版本号用于表征所述消息的消费状态,所述业务版本号包括初值和终值,当
所述业务版本号为初值时,表征所述消息为未消费;当所述业务版本号为终值是,表征所述消息为已消费。
104.s130:根据所述唯一标识符,查询redis缓存中预先存储的与所述消息相对应的目标版本号。
105.本说明书实施例中,将消息的目标版本号存储在redis缓存中。所述redis缓存是一种高性能的键值对(key-value)数据库,具体地,可将所述目标业务版本号作为value,而将所述唯一标识符作为key,能够减小业务系统磁盘i/o,提高业务系统的吞吐量。
106.s140:判断所述业务版本号与所述目标版本号是否一致。
107.s150:当所述业务版本号与所述目标版本号一致时,确定所述消息为未消费并反馈给消费者,以使所述消费者获取所述消息的业务代码并消费所述消息;并将所述目标版本号由初值改为终值。
108.当所述业务版本号与所述目标版本号一致时,将原本为初值的目标版本号改为终值,以表征该消息被当前的消费者占有,从而其他消费者再来查询该消息是否为未消费的状态时,可由所述目标版本号的值获知该消息的消费状态,从而避免消息被重复消费。
109.需要说明的是,本说明书实施例中,所述目标版本号的初值可设为“0”,终值可设为“1”,则将所述目标版本号由初值改为终值的过程,实际为对初值进行的加一处理,操作便利,可以使用较少的代码来实现。当然,所述目标版本号的初值和终值还可以有其他的设置方式,例如:将初值设置为“0”,终值设置为
“‑
1”;或初值设置为“是”,终值设置为“否”等等,具体可根据实际应用需要进行调节设置。由于所述目标版本号是作为redis缓存中键值对中的value存储的,可保证其值不易发生异常。
110.本说明书实施例提供的一种消息幂等处理方法,利用消息的版本号取代状态机的状态流转机制,能够避免状态机在高并发场景下状态流转失败甚至状态逆流转的问题,从而避免了消息不幂等的情况;并且,将消息的版本号作为value,将消息的唯一标识符作为key存储于redis缓存中,能够保证存储的稳定性;且redis缓存能够在高并发场景下,降低系统i/o,提高系统吞吐量。
111.如图2所示,本说明书实施例中,步骤s130,根据所述唯一标识符,查询redis缓存中预先存储的与所述消息相对应的目标版本号之前,所述方法还包括:
112.s210:判断是否成功获取所述redis缓存的文件锁;
113.本说明书实施例中,只有获取到所述redis缓存的文件锁的消费者,才有资格查询其中存储的目标版本号;进而,在所述目标版本号为初值时将其改写为终值。本说明书实施例中,所述文件锁可以是以预设字符串构成的令牌,所述文件锁可设置为通过启动脚本以获取文件锁。
114.s220:若是,则查询所述redis缓存中预先存储的与所述消息相对应的所述目标版本号;
115.若所述消费者能够获取所述redis缓存的文件锁,则说明所述消费者具有查询所述redis缓存中存储信息的资格,则可查询redis缓存中的所述目标版本号,以验证所述消息是否已经被消费。
116.s230:若否,则确定所述消费者不具备对所述消息的消费资格。
117.若所述消费者不能获取所述redis缓存的文件锁,则说明当前正有其他的消费者
获取了redis缓存的文件锁以查询其中存储的目标版本号。
118.示例性的,当有多个消费者发起对同一个消息的消费请求时,例如,消费者a和消费者b发起对消息m的消费请求;所述消息幂等处理装置根据接收到的消费请求的先后顺序使得第一个消费者获取所述redis缓存的文件锁,假设消息幂等处理装置先接受到消费者a发起消费请求,则使得消费者a获取redis缓存的文件锁;进而查询所述目标版本号是否与a发起的消费请求中携带的业务版本号相同,若相同,则消费者a具有消费资格并将目标版本号由初值改写为终值;若不相同,则说明该消息m已经被消费。也就是说,当redis缓存的文件锁被其他消费者(消费者a)获取时,则可直接判断得到当前消费者(消费者b)不具备消费资格,从而可以简便对消费者b的判断步骤。
119.本说明书实施例中,通过设置redis缓存文件锁的方式,使得当有多个消费者发起对同一个消息的消费请求时(比如,因网络异常,消息中间件将同一个消息多次推送给了消费者),有且只有一个消费者能在同一时刻拥有对所述redis缓存的文件锁以具有对所述目标版本号的查询资格;进而在其消费请求中所包含的业务版本号与目标版本号相一致时,允许其对目标版本号改写处理,避免多个消费者抢占资源使得所述目标版本号标识混乱,从而进一步保证了消息消费的幂等性。
120.需要说明的是,若消息幂等处理装置无法根据接收到的消费请求的先后顺序来判断使得哪一个消费者获取所述文件锁时,即多个消费者发起的消费请求同时被所述消息幂等处理装置接收时,所述消息幂等处理装置可随机抽取其中的一个消费者使其获取所述文件锁。在一些其他可行的实施例中,所述消息幂等处理装置还可以根据消费者的占用率等状态选择其中工作状态最佳的一个来获取所述文件锁;所述消息幂等处理装置还可以采用轮询的方式选择多个消费者中的一个来获取所述文件锁。
121.需要说明的是,在消费者对所述目标版本号进行改写后,或判断到所述目标版本号与业务版本号不一致后,可通过调用停止脚本,即时的或定时的,释放所述redis缓存的文件锁。
122.进一步地,如图3所示,本说明书实施例中,步骤s130,根据所述唯一标识符,查询redis缓存中预先存储的与所述消息相对应的目标版本号之前,所述方法还包括:
123.s310:解析所述消费请求,获得与所述消息相对应的过期时间;
124.即所述消费请求中除包括所述唯一标识符和所述业务版本号之外,还包括所述消息的过期时间。所述过期时间具体可以为某年某月某日并细节到某时某分某秒;所述过期时间可以是在消息生成时便设置好,且由文件中间件连同所述唯一标识符和所述业务版本号一并推送给所述消费者的。
125.s320:根据所述过期时间和当前时间戳判断所述消息是否过期;
126.此处,所述当前时间戳是指,所述消息幂等处理装置接收到所述消费请求的时刻。
127.s330:若所述消息未过期,则查询所述redis缓存中预先存储的与所述消息相对应的目标版本号;
128.s340:若所述消息已过期,则发送消息过期提醒给所述消息的生产者。
129.当所述消息已过期时,则无需判断所述消费者是否获取了redis缓存的文件锁,以及所述消费者是否具有对消息的消费资格(即消费者消费请求中的业务版本号是否与目标版本号一致),能够简便判断逻辑。
130.当然,步骤s340还可以是:若所述消息已过期,则发送消息过期提醒给所述生产者和所述消费者。
131.本说明书实施例提供的一种消息幂等处理方法,只有当消息未被消费、消息未过期且第一个前来进行消费资格验证的消费者具有消费资格,可进行消费,极大地避免了消息不幂等的情况。
132.进一步地,本说明书实施例中,当步骤s340中,判断到所述消息已过期时,所述方法还可以包括:
133.删除所述redis缓存中存储的所述消息的唯一标识符和所述目标版本号。
134.删除redis缓存中的唯一标识符和目标版本号可以节约所述redis缓存的存储空间。需要说明的是,对redis缓存中唯一标识符和所述目标版本号的删除操作,可以是在消息过期后即刻进行,也可以是定时的对一些过期的消息的唯一标识符和所述目标版本号批量进行删除操作。
135.优选地,消费者还可以将消息过期提醒转发给生产者。对于所述消息还未消费就已过期的情况,可能是消费者在接收到消息中间件推送的消息后未及时进行消费导致的,则生产者在接收消息过期提醒后可根据实际需要作废所述消息,或重新生成消息以使消费者消费。对于所述消息已过期且已被消费过的情况,则说明消息中间件在消息已被消费之后又再次进行了推送,则生产者还可以将消息中间件中的消息清除避免消息再次推送,并呼叫运维人员对消息中间件进行故障分析和修复。
136.如图4所示,在一些可行的实施例中,步骤s330:若所述消息未过期,则查询所述redis缓存中预先存储的与所述消息相对应的目标版本号,可以进一步包括:
137.s410:根据所述唯一标识符,查询所述redis缓存中是否存储有与所述消息相对应的唯一标识符和目标版本号。
138.在一些正常的场景中,生产者生成消息后会将消息存储于消息中间件中,以使消息中间件将消息推送给消费者进行消费;同时,还会将消息的唯一标识符和业务版本号存储在redis缓存中,存储于redis缓存中的业务版本号即为所述目标版本号。
139.s420:若不存在,则将解析得到的所述唯一标识符同步至所述redis缓存中,以及将所述业务版本号同步至所述redis缓存中作为所述目标版本号。
140.当redis缓存出现异常时,消费者已经从消息中间件处接收到的消息并生成了对消息的消费请求,但redis缓存中尚未同步有该消息的唯一标识符和所述目标版本号。此时,消息幂等处理装置根据消费请求中的过期时间判断所述消息是否过期;当所述消息未过期时,将所述消息的唯一标识符同步至所述redis缓存中,并将所述业务版本号作为所述目标版本号同步至所述redis缓存中,作为对消息幂等判断的依据。
141.需要说明的是,由于本说明书实施例提供的一种消息幂等处理方法,其存储于redis缓存中的唯一标识符和目标版本号是在消息过期后才会被删除,因此不会出现对未过期但已消费的消息进行幂等验证时,缓存中没有验证依据的情况。即示例性的,redis缓存中存储有消息m的唯一标识符和目标版本号,消息幂等处理装置验证得到消费者a具备对消息m的消费资格,消费者a获取消息m的业务代码以消费该消息m的同时将消息m的目标版本号加一处理。若此时消息m尚未过期,并又有消费者b发起对消息m的消费请求;此时,redis缓存中依然存储有消息m的唯一标识符和目标版本号(此时为终值),以作为判断消费
者b不具备消费资格的依据。
142.本说明书实施例中,所述方法还包括:
143.当所述业务版本号与所述目标版本号不一致时,确定所述消息为已消费并生成消费异常提醒以反馈给所述消费者和所述消息的生产者。
144.当所述业务版本号与所述目标版本号不一致时说明所述消息已被消费,消息幂等处理装置驳回消费者的消费请求,实现消息幂等。也就是说,同一消息推送给了两个消费者,或多次发送给了同一个消费者,则说明业务系统网络可能出现了抖动,或消息中间件发生了故障。因此,可将所述消费异常提醒反馈给所述消费者以告知其消费请求未被通过;以及反馈给所述生产者以使其对业务系统网络和消息中间件进行故障诊断和分析。
145.综上,本说明书实施例提供的一种消息幂等处理方法,无需在消息生产者和消费者两侧建立关系型数据库或文档型数据库,有利于降低业务系统成本;通过redis缓存中的键值对实现对消息幂等的判断,并通过设置redis文件锁和消息的过期时间,使得在高并发场景下有且只有第一个来消费的消费者能够对未消费的且未过期的消息进行消费,避免了消息消费状态混乱的同时,有效保证了消息的幂等性;并且有利于提高业务系统吞吐量。
146.如图5所示,为本说明书实施例提供的一种消息幂等处理装置,包括:
147.第一接收模块51,用于接收消费者对消息的消费请求;
148.解析模块52,用于解析所述消费请求,获得与所述消息相对应的唯一标识符和业务版本号;
149.查询模块53,用于根据所述唯一标识符,查询redis缓存中预先存储的与所述消息相对应的目标版本号;
150.判断模块54,用于判断所述业务版本号与所述目标版本号是否一致;
151.执行模块55,用于当所述业务版本号与所述目标版本号一致时,确定所述消息为未消费并反馈给消费者,以使所述消费者获取所述消息的业务代码并消费所述消息;并将所述目标版本号由初值改为终值。
152.进一步地,在一些可行的实施例中,所述消息幂等处理装置还包括判断模块;
153.所述判断模块用于在根据所述唯一标识符,查询redis缓存中预先存储的与所述消息相对应的目标版本号之前,判断是否成功获取所述redis缓存的文件锁;
154.若是,则查询所述redis缓存中预先存储的与所述消息相对应的目标版本号;
155.若否,则确定所述消费者不具备对所述消息的消费资格。
156.通过本说明书实施例提供的装置所取得的有益效果和上述方法所取得的有益效果相一致,此处不再赘述。
157.图6是本文实施例提供的一种消息生成方法的步骤示意图,本说明书提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的系统或装置产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行。
158.所述方法适用于消息生成装置,具体的如图6所示,所述方法可以包括:
159.s610:生成消息,所述消息包括业务代码和与所述消息相对应的唯一标识符和业务版本号,所述唯一标识符用于唯一确定所述消息,所述业务版本号用于标记所述消息的
消费状态。
160.所述业务代码即为消费所述消息时所需的业务逻辑代码。
161.s620:将所述消息存储于消息中间件中,以使所述消息中间件将所述消息推送给消费者。
162.即,将所述业务代码、唯一标识符和业务版本号存储于所述消息中间件中。
163.s630:将所述唯一标识符同步存储于redis缓存中,以及将所述业务版本号同步存储于redis缓存中作为目标版本号。
164.需要说明的是,由于所述消息是刚被生产者生成出来,因此,此时所述消息的业务版本号为初值,从而同步至redis缓存中的所述目标版本号也为初值。所述redis缓存是一种高性能的键值对(key-value)数据库,具体地,可将所述目标版本号作为value,而将所述唯一标识符作为key,能够减小业务系统磁盘i/o。
165.本说明书实施例提供的一种消息生成方法,通过消息中间件实现分布式应用之间高效、可靠的数据传输,通过redis缓存中存储的唯一标识符和目标版本号表征消息的消费状态,并作为消费者是否具备消费资格的判断依据,避免消息的重复消费的同时,有利于提高业务系统吞吐量。
166.进一步地,本说明书实施例中,所述方法还包括:
167.接收消费者反馈的业务代码异常信息;
168.即当消费者根据所述唯一标识符未能在所述消息中间件中获取到所述消息的业务代码时,将反馈给消费者业务代码异常信息。
169.根据所述业务代码异常信息,调度备份在数据库中的与所述业务代码相对应的原始业务数据,以根据所述原始业务数据组装得到所述业务代码并发送至所述消息中间件中。
170.本说明书实施例中,当网络异常或发生有其他的异常时,消息中间件中存储的消息缺失或遗失,生产者可以采取重新将所述消息存储于消息中间件中的方式,使得消费者能够顺利获取其中的业务代码以执行消费逻辑。但若生产者在多次重试后仍无法将消息存储于消息中间件中时,此时,可将这个异常消息的原始业务数据,保存在异常消息表中。然后用采用分布式任务调度,通过一定的采集频率多次批量读取异常消息表,组装json报文后再次保存在消息中间件中。从而保证了消息中间件中消息的完整性和可靠性,保证了消息被消费者顺利消费。
171.如图7所示,为本说明书实施例提供的一种消息生成等装置,包括:
172.消息生成模块71,用于生成消息,所述消息包括业务代码和与所述消息相对应的唯一标识符和业务版本号,所述唯一标识符用于唯一确定所述消息,所述业务版本号用于标记所述消息的消费状态;
173.存储模块72,用于将所述消息存储于消息中间件中,以使所述消息中间件将所述消息推送给消费者;
174.同步模块73,用于将所述唯一标识符和所述业务版本号同步存储于redis缓存中,此时,所述业务版本号为初值,标记所述消息的消费状态为未消费。
175.通过本说明书实施例提供的装置所取得的有益效果和上述方法所取得的有益效果相一致,此处不再赘述。
176.图8是本文实施例提供的一种消息消费方法的步骤示意图,本说明书提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的系统或装置产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行。
177.所述消息消费方法适用于消息消费装置,具体的,如图8所示,所述方法可以包括:
178.s810:获取消息中间件推送的消息,消息包括与消息相对应的唯一标识符和业务版本号。
179.s820:生成对消息的消费请求并发送给消息幂等处理装置,消费请求包括唯一标识符和业务版本号,以使消息幂等处理装置根据唯一标识符和业务版本号反馈消息的消费状态。
180.所述消息幂等处理装置基于所述唯一标识符和所述业务版本号判断所述消息消费状态的方法可参照前文描述,此处不再展开。
181.s830:接收消息幂等处理装置返回的消息的消费状态。
182.s840:当消费状态为未消费时,基于唯一标识符查询消息中间件以获取消息的业务代码,并执行所务代码以消费消息。
183.本说明书实施例提供的一种消息消费方法,能够在消费者消费消息前,对消息的消费状态进行验证,当且仅当所述消息的消费状态为未消费时,所述消费者才可执行所述消息的业务代码,从而有利于实现消息幂等。
184.本说明书实施例中,当根据所述唯一标识符未能从所述消息中间件中获取所述业务代码时,所述方法还包括:
185.生成业务代码异常信息并反馈给消息生成装置,以使所述消息生成装置调度备份在数据库中的与所述业务代码相对应的原始业务数据,并基于所述原始业务数据组装得到所述业务代码并发送至所述消息中间件中。
186.当网络异常或发生有其他的异常时,消息中间件中存储的消息出现缺失或遗失,生产者可以采取重新将所述消息存储于消息中间件中的方式,使得消费者能够顺利获取其中的业务代码以执行消费逻辑。但若生产者在多次重试后仍无法将消息存储于消息中间件中时,此时,可用将这个异常消息的原始业务数据,保持的异常消息表中。然后用采用分布式任务调度,通过一定的采集频率多次批量读取异常消息表,组装json报文后再次保存在消息中间件中。从而保证了消息中间件中消息的完整性和可靠性,保证了消息被消费者顺利消费。
187.本说明书实施例中,如图9所示,在步骤s840中的,执行所述业务代码以消费所述消息,可进一步包括:
188.s910:根据所述唯一标识符,获取redis缓存中预先存储的与所述消息相对应的目标版本号;
189.s920:判断所述业务版本号与所述目标版本号是否一致;
190.s930:当所述业务版本号与所述目标版本号一致时,执行所述业务代码以消费消息;
191.s940:当所述业务版本号与所述目标版本号不一致时,生成异常信息并存储至异
常消息表中。
192.本说明书实施例提供的一种消息消费方法,在消息幂等处理装置验证消费者具备对消息的消费资格后,消费者获取消息的业务代码进行执行时,将再次查询redis缓存中的目标版本号以进行验证,起到双重验证的作用,极大地保证了消息的幂等性。
193.进一步地,所述根据所述唯一标识符,获取redis缓存中预先存储的与所述消息相对应的目标版本号之前,所述方法还包括:
194.获取所述redis缓存的文件锁。
195.只有获取到所述redis缓存的文件锁的消费者,才有资格查询其中存储的目标版本号。若所述消费者未能获取所述redis缓存的文件锁,则确定所述消费者不具备对所述消息的消费资格。
196.进一步地,本说明书实施例中,所述消息还包括过期时间,即消费者接受到的所述消息中间件推送的消息中还包括所述消息的过期时间。则如图10所示,步骤s820:生成对所述消息的消费请求并发送给消息幂等处理装置之前,所述方法还包括:
197.s1010:根据所述过期时间和当前时间戳判断所述消息是否过期;
198.需要说明的是,此处当前时间戳为所述消费者接受到所述消息中间件推送的消息的时间。
199.s1020:若所述消息未过期,则生成所述消费请求;
200.s1030:若所述消息已过期,则发送消息过期报警给所述消息生成装置。
201.当所述消费者接受的消息已过期,则可能所述消息中间件发生故障即消息中间件将已过期的消息推送给了消费者,从而,所述消息生成装置可以根据所述消息过期报警对所述消息中间件进行故障排查和修复。并且,当消费者接受到的消息为已过期时,则无需获取redis缓存的文件锁以及进行消息幂等判断,从而可以减轻消息幂等处理装置的工作压力。
202.如图11所示,本说明书实施例还提供一种消息消费装置,包括:
203.获取模块111,用于获取消息中间件推送的消息,所述消息包括与所述消息相对应的唯一标识符和业务版本号;
204.消费请求生成模块112,用于生成所述消息的消费请求并发送给消息幂等处理装置,所述消费请求包括所述唯一标识符和所述业务版本号以使所述消息幂等处理装置根据所述唯一标识符和所述业务版本号反馈所述消息的消费状态;
205.第二接收模块113,用于接收所述消息幂等处理装置返回的所述消息的消费状态;
206.消费模块114,用于当所述消费状态为未消费时,基于所述唯一标识符和所述业务主键查询消息中间件以获取所述消息的业务代码,并执行所述业务代码以消费所述消息。
207.如图12所示,本说明书实施例还提供一种消息处理方法,所述方法适用于消息处理系统,具体地,所述方法包括:
208.s1210:消息生成装置生成消息并存储;
209.具体地,所述消息生成装置生成消息,并将所述消息存储于消息中间件中,以及将所述消息的唯一标识符和业务版本号同步存储于redis缓存中,所述唯一标识符用于唯一确定所述消息,所述业务版本号用于标记所述消息的消费状态。
210.s1220:消息消费装置接收消息,生成对所述消息的消费请求并发送给消息幂等处
理装置;
211.具体地,所述消息消费装置接收所述消息中间件推送来的消息,所述消费请求包括所述唯一标识符和所述业务版本号。
212.s1230:消息幂等处理装置根据所述消费请求确定消息的消费状态并反馈给消息消费处理装置,以使消息消费装置在消费状态为未消费时获取并执行消息的业务代码以消费消息。
213.具体地,所述消息幂等处理装置解析所述消费请求,进而根据解析得到的所述唯一标识符和所述业务版本号确定所述消息的消费状态;将所述消费状态反馈给所述消息消费处理装置,以使所述消息消费装置在所述消费状态为未消费时,根据所述唯一标识符查询所述消息中间件获取并执行所述消息的业务代码以消费所述消息。
214.在一些具体的实施例中,如图13所示,所述消息处理方法,还可以是:
215.s1301:生产者(即消息生成装置)生成消息,所述消息包括业务代码、唯一标识符、业务版本号和过期时间;将所述消息存储于消息中间件中,以及将所述唯一标识符、业务版本号和所述过期时间同步存储于redis缓存中,存储于所述redis缓存中业务版本号即为目标版本号。
216.所述唯一标识符用于唯一确定所述消息,所述业务版本号用于标记所述消息的消费状态。
217.s1302:所述消息中间件将所述消息推送给消费者(即消息消费装置)。
218.s1303:所述消费者根据所述过期时间和当前时间戳判断所述消息是否过期。
219.当前时间戳是指,消费者接受到所述消息中间件推送的消息的时间。
220.s1304:若所述消息未过期,则生成对所述消息的消费请求并发送给消息幂等处理装置。所述消费请求中包含所述消息的唯一标识符和业务版本号。
221.s1305:若所述消息已过期,则发送消息过期报警给生产者。
222.若消息已过期,即消息中间件将已过期的消息推送给了消费者,则可将消息过期报警发送给生产者以使生产者获知所述消息中间件发生故障,从而对所述消息中间件进行故障排查和修复。
223.s1306:消息幂等处理装置接收所述消费请求,并判断是否获取所述redis缓存的文件锁。
224.只有获取到所述redis缓存的文件锁的消费者,才有资格查询其中存储的目标版本号;进而基于存储于redis缓存中的目标版本号进行判断。
225.s1307:若是,则根据所述过期时间和当前时间戳判断所述消息是否过期。
226.当前时间戳是指,所述消息幂等处理装置接收到所述消费请求的时刻。
227.s1308:若否,则确定所述消费者不具备对所述消息的消费资格。
228.示例性的,当消费者a和消费者b先后发起了对消息m的消费请求;所述消息幂等处理装置使得消费者a获取redis缓存的文件锁;进而查询消费者是否具备对消息m的消费资格;若有,则将目标版本号由初值改写为终值;若无,则说明该消息m已经被消费。也就是说,当redis缓存的文件锁被其他消费者(消费者a)获取时,无论消费者a是否具备对消息m的消费资格,消费者b均不具备消费资格。
229.s1309:若所述消息未过期,则查询redis缓存中预先存储的目标版本号,判断所述
目标版本号和所述业务版本号是否一致。
230.s1310:若所述消息已过期,则发送消息过期提醒给所述消费者和所述生产者。
231.需要说明的是,步骤s1303中对消息是否过期进行判断的执行主体是消费者,此时消息过期可能是消息中间件未在消息的有效期内将消息推送给消费者,此步骤可用于判断消息中间件是否发生故障。步骤s1308中对消息是否过期进行判断的执行主体是消息幂等处理装置,此时消息过期可能是由于消费者在接收到消息中间件推送的消息后未及时进行消费导致的。对不不同原因导致的消息过期,可采取不同的应对措施,提高业务逻辑的缜密性和合理性。
232.s1311:当所述目标版本号和所述业务版本号一致时,确定所述消息的消费状态为未消费,将所述消费状态发生给消费者;并将所述目标版本号由初值改为终值。
233.当所述消息的消费状态为未消费时,即说明所述消费者具备对消息的消费资格,将所述消费状态告知所述消费者以执行步骤s1312。将所述目标版本号由初值改为终值后,当消息幂等处理装置再次接收到消费者发起对所述消息的消费请求并进行幂等验证时,将判断到所述消息为已消费,从而驳回其他消费者对该消息的消费请求,保证了消息的幂等性。
234.当所述消息的消费状态为未消费时,即所述消费者具备对消息的消费资格时,所述方法还包括,s1312:所述消费者根据所述唯一标识符查询所述消息中间件以获取所述消息的业务代码,执行所述业务代码以消费所述消息。
235.s1313:当所述业务版本号与所述目标版本号不一致时,确定所述消息为已消费并生成消费异常提醒以反馈给所述消费者。
236.本说明书实施例提供的一种消息处理方法,利用消息的版本号取代状态机的状态流转机制,能够避免在高并发场景下状态流转失败甚至状态逆流转的问题,从而避免了消息不幂等的情况;并且,将消息的版本号和唯一标识符存储于redis缓存中,能够保证存储的稳定性;且redis缓存能够在高并发场景下,降低系统i/o,提高系统吞吐量。
237.在一些可行的实施例中,当所述消费者执行所述业务代码以消费所述消息,还可进一步包括:
238.消费者获取所述redis缓存的文件锁;
239.若获取成功,则判断所述redis缓存中存储的目标版本号是否与所述业务版本号相一致;
240.当所述业务版本号与所述目标版本号一致时,消费者执行所述业务代码以消费消息;
241.当所述业务版本号与所述目标版本号不一致时,消费者生成异常信息并存储至异常消息表中。
242.如图14所示,为本说明书实施例提供的一种消息处理系统的结构示意图,如图所示,所述系统包括:
243.消息生成装置141,用于生成消息并将所述消息存储于消息中间件中,以及将所述消息的唯一标识符和业务版本号同步存储于redis缓存中,所述唯一标识符用于唯一确定所述消息,所述业务版本号用于标记所述消息的消费状态;
244.消息消费装置142,用于接收所述消息中间件推送的消息,生成对所述消息的消费
请求发送给消息幂等处理装置,所述消费请求包括所述唯一标识符和所述业务版本号;
245.消息幂等处理装置143,用于解析所述消费请求,根据解析得到的所述唯一标识符和所述业务版本号确定所述消息的消费状态并反馈给所述消息消费装置,以使所述消息消费装置在所述消费状态为未消费时,根据所述唯一标识符查询所述消息中间件获取并执行所述消息的业务代码以消费所述消息。
246.如图15所示,为本文实施例提供的一种计算机设备,所述计算机设备1502可以包括一个或多个处理器1504,诸如一个或多个中央处理单元(cpu),每个处理单元可以实现一个或多个硬件线程。计算机设备1502还可以包括任何存储器1506,其用于存储诸如代码、设置、数据等之类的任何种类的信息。非限制性的,比如,存储器1506可以包括以下任一项或多种组合:任何类型的ram,任何类型的rom,闪存设备,硬盘,光盘等。更一般地,任何存储器都可以使用任何技术来存储信息。进一步地,任何存储器可以提供信息的易失性或非易失性保留。进一步地,任何存储器可以表示计算机设备1502的固定或可移除部件。在一种情况下,当处理器1504执行被存储在任何存储器或存储器的组合中的相关联的指令时,计算机设备1502可以执行相关联指令的任一操作。计算机设备1502还包括用于与任何存储器交互的一个或多个驱动机构1508,诸如硬盘驱动机构、光盘驱动机构等。
247.计算机设备1502还可以包括输入/输出模块1510(i/o),其用于接收各种输入(经由输入设备1512)和用于提供各种输出(经由输出设备1514)。一个具体输出机构可以包括呈现设备1516和相关联的图形用户接口(gui)1518。在其他实施例中,还可以不包括输入/输出模块1510(i/o)、输入设备1512以及输出设备1514,仅作为网络中的一台计算机设备。计算机设备1502还可以包括一个或多个网络接口1520,其用于经由一个或多个通信链路1522与其他设备交换数据。一个或多个通信总线1524将上文所描述的部件耦合在一起。
248.通信链路1522可以以任何方式实现,例如,通过局域网、广域网(例如,因特网)、点对点连接等、或其任何组合。通信链路1522可以包括由任何协议或协议组合支配的硬连线链路、无线链路、路由器、网关功能、名称服务器等的任何组合。
249.对应于图1至图4、图6、图8至图10以及图12至图13中的方法,本文实施例还提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法的步骤。
250.本文实施例还提供一种计算机可读指令,其中当处理器执行所述指令时,其中的程序使得处理器执行如图1至图4、图6、图8至图10以及图12至图13所示的方法。
251.应理解,在本文的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本文实施例的实施过程构成任何限定。
252.还应理解,在本文实施例中,术语“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系。例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
253.本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专
业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本文的范围。
254.所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
255.在本文所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口、装置或单元的间接耦合或通信连接,也可以是电的,机械的或其它的形式连接。
256.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本文实施例方案的目的。
257.另外,在本文各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以是两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
258.所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本文的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本文各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
259.本文中应用了具体实施例对本文的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本文的方法及其核心思想;同时,对于本领域的一般技术人员,依据本文的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本文的限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1