消息处理方法、装置、设备、存储介质及计算机程序产品与流程

文档序号:30583867发布日期:2022-06-29 14:20阅读:111来源:国知局
消息处理方法、装置、设备、存储介质及计算机程序产品与流程

1.本技术涉及数据处理技术领域,尤其涉及一种消息处理方法、一种消息处理装置、一种业务处理设备、一种计算机可读存储介质以及一种计算机程序产品。


背景技术:

2.随着移动通信技术的快速发展,用户各种消息的传递在微服务架构的盛行环境下需要保持有序性处理的需求也越来越多。有序消息是指在消息的处理过程中需要按照消息指定的顺序进行消费,例如电商场景下:用户购买商品的订单各种状态的处理需要进行有序处理,生成订单》订单待支付》订单支付成功》订单待发货》订单待收货》订单完成,如果还有售后情况可能还有订单退款处理中》订单退款完成等,订单的这些状态必须是严格按状态序处理。但在微服务高可用场景下(多服务节点)并发时,对订单的操作可能会不同状态由不同的服务节点处理,造成系统异常及状态数据处理混乱,导致时序乱掉。


技术实现要素:

3.本技术提供了一种消息处理方法、装置、设备、存储介质及计算机程序产品,以确保对消息的顺序性处理,避免数据树立混乱。
4.根据本技术的一方面,提供了一种消息处理方法,应用于消息消费者服务中,所述消息消费者服务与消息生产者服务通过分布式存储集群进行关联,所述分布式存储集群中存储有有序列表以及各业务对象对应的有序消息队列,所述有序列表用于记录多个待处理的业务对象及其最近操作时间戳信息,所述有序消息队列用于记录其对应的业务对象中待处理的操作消息以及所述操作消息的唯一消息标识;
5.所述方法包括:
6.从所述有序列表中确定待处理的目标业务对象;
7.基于所述目标业务对象的最近时间戳信息,判断所述目标业务对象是否到达设定的处理时机;
8.当所述目标业务对象到达设定的处理时机,则对所述目标业务对象设置分布式锁;
9.在所述分布式存储集群中获取所述目标业务对象对应的目标有序消息队列;
10.确定获得所述分布式锁的目标线程,并采用所述目标线程按序对所述目标有序消息队列中的操作消息进行处理。
11.根据本技术的另一方面,提供了一种消息处理方法,应用于消息生产者服务中,所述消息生产者服务与消息消费者服务通过分布式存储集群进行关联,所述分布式存储集群中存储有有序列表以及各业务对象对应的有序消息队列,所述有序列表用于记录多个待处理的业务对象及其最近操作时间戳信息,所述有序消息队列用于记录其对应的业务对象中待处理的操作消息以及所述操作消息的唯一消息标识;
12.所述方法包括:
13.响应于业务实例对业务对象发起的操作,生成操作消息,并基于单点发号机制为所述操作消息生成唯一消息标识;
14.获取发起所述操作的操作时间戳信息,并将所述业务对象的标识以及所述操作时间戳信息记录在所述分布式存储集群的有序列表中;
15.在所述分布式存储集群中获取所述业务对象对应的有序消息队列,并将所述操作消息以及所述唯一消息标识写入所述有序消息队列中。
16.根据本技术的另一方面,提供了一种消息处理装置,应用于消息消费者服务中,所述消息消费者服务与消息生产者服务通过分布式存储集群进行关联,所述分布式存储集群中存储有有序列表以及各业务对象对应的有序消息队列,所述有序列表用于记录多个待处理的业务对象及其最近操作时间戳信息,所述有序消息队列用于记录其对应的业务对象中待处理的操作消息以及所述操作消息的唯一消息标识;
17.所述装置包括:
18.目标业务对象确定模块,用于从所述有序列表中确定待处理的目标业务对象;
19.处理时机判断模块,用于基于所述目标业务对象的最近时间戳信息,判断所述目标业务对象是否到达设定的处理时机;
20.分布式锁添加模块,用于当所述目标业务对象到达设定的处理时机,则对所述目标业务对象设置分布式锁;
21.目标有序消息队列获取模块,用于在所述分布式存储集群中获取所述目标业务对象对应的目标有序消息队列;
22.消息处理模块,用于确定获得所述分布式锁的目标线程,并采用所述目标线程按序对所述目标有序消息队列中的操作消息进行处理。
23.根据本技术的另一方面,提供了一种消息处理装置,应用于消息生产者服务中,所述消息生产者服务与消息消费者服务通过分布式存储集群进行关联,所述分布式存储集群中存储有有序列表以及各业务对象对应的有序消息队列,所述有序列表用于记录多个待处理的业务对象及其最近操作时间戳信息,所述有序消息队列用于记录其对应的业务对象中待处理的操作消息以及所述操作消息的唯一消息标识;
24.所述装置包括:
25.操作消息生成模块,用于响应于业务实例对业务对象发起的操作,生成操作消息;
26.消息标识生成模块,用于基于单点发号机制为所述操作消息生成唯一消息标识;
27.业务对象写入模块,用于获取发起所述操作的操作时间戳信息,并将所述业务对象的标识以及所述操作时间戳信息记录在所述分布式存储集群的有序列表中;
28.操作消息写入模块,用于在所述分布式存储集群中获取所述业务对象对应的有序消息队列,并将所述操作消息以及所述唯一消息标识写入所述有序消息队列中。
29.根据本技术的另一方面,提供了一种业务处理设备,所述业务处理设备包括:
30.至少一个处理器;以及
31.与所述至少一个处理器通信连接的存储器;其中,
32.所述存储器存储有可被所述至少一个处理器执行的计算机程序,所述计算机程序被所述至少一个处理器执行,以使所述至少一个处理器能够执行本技术任一实施例所述的一种消息处理方法。
33.根据本技术的又一方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使处理器执行时实现本技术任一实施例所述的一种消息处理方法。
34.根据本技术的又一方面,提供了一种计算机程序产品,所述计算机程序产品包括计算机可执行指令,所述计算机可执行指令在被执行时用于实现本技术任一实施例所述的一种消息处理方法。
35.在本实施例中,在消息生产者服务响应于业务实例对业务对象发起的操作生成操作消息时,采用单点序号生成器为操作消息生成唯一消息标识,避免多客户端多服务端时钟不一致导致生成的时间戳乱序的情况发生。然后在写入该操作消息时,通过存储在分布式存储集群的有序列表以及有序消息队列这两个核心存储结构来进行消息记录,将业务对象的标识以及当前操作的操作时间戳信息记录在有序列表中,并将操作消息以及其唯一消息标识记录在有序消息队列中,从而实现单点序列化存储,避免多客户端多服务端时钟不一致的影响。
36.通过分布式存储集群,可以实现消息生产者服务与消息消费者服务的解耦,使得当消息发送失败重试时,重试期间的其他消息生产不影响消息顺序性的处理;或者在网络传输不稳定时,消息先发(或顺序优先)但是后到,不影响消息顺序性的处理。同时便于消息生产者服务以及消息消费者服务的升级或扩容,且在升级或扩容时不影响消息顺序性的处理。
附图说明
37.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
38.图1是本技术实施例一提供的一种消息处理方法的流程图;
39.图2是本技术实施例一提供的一种消息处理系统架构图;
40.图3本技术实施例二提供了一种消息处理方法的流程图;
41.图4是本技术实施例提供的一种纸条消息有序处理的流程示意图;
42.图5是本技术实施例三提供的一种消息处理装置的结构示意图;
43.图6是本技术实施例四提供的一种消息处理装置的结构示意图;
44.图7是实现本技术实施例的一种消息处理方法的业务处理设备的结构示意图。
具体实施方式
45.为了使本技术领域的人员更好地理解本技术方案,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分的实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本技术保护的范围。
46.需要说明的是,本技术的说明书和权利要求书及上述附图中的术语“第一”、“第
二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本技术的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
47.实施例一
48.图1为本技术实施例一提供了一种消息处理方法的流程图,可以应用于消息生产者服务中。如图2示出的消息处理系统架构图所示,该消息生产者服务与消息消费者服务通过分布式存储集群进行关联。其中,
49.消息生产者服务为系统前端入口,是一种服务于前端用户、提供用户可操作的各种功能的服务。消息生产者服务可以有多个,组成消息生产者服务集群,通过快速扩容提高消息生产的速度。
50.在一种实施例中,该分布式存储集群可以包括codis集群,codis集群是存储消息的中间件,基于内存,读写快。其中,codis是一个分布式redis(高性能的key-value数据库)解决方案,对于上层的应用来说,连接到codis proxy(codis proxy提供连接集群redis服务的入口,是客户端连接的redis代理服务,codis proxy是单个节点的)和连接原生的redis server(服务器)没有明显的区别,上层应用可以像使用单机的redis一样使用,codis底层会处理请求的转发、不停机的数据迁移等工作,所有后边的一切事情对于前面的客户端来说是透明的,可以简单的认为codis后边连接的是一个内存无限大的redis服务。
51.消息消费者服务用于从分布式存储集群中获取数据并按照业务逻辑进行处理。消息消费者服务可以有多个,组成消息消费者服务集群,通过快速扩容提高消息消费的速度。
52.如图1所示,本实施例可以包括如下步骤:
53.步骤110,响应于业务实例对业务对象发起的操作,生成操作消息,并基于单点发号机制为所述操作消息生成唯一消息标识。
54.具体的,当业务实例对业务对象发起操作时,调用消息生产者服务,则消息生产者服务可以针对该操作生成对应的操作消息,并为该操作消息生成对应的唯一消息标识。
55.其中,针对不同的业务场景,其业务实例、业务对象、操作等都可以是不一样的,本实施例对此不作限定。例如,在电子商务场景中,业务对象可以为商品,操作可以为对商品的下单、支付、发货等操作;又如,在短视频或直播领域中,业务对象可以为短视频或者直播领域中的某种视频对象,操作可以为点击、发布、关注等操作;或者,业务对象还可以是某种玩法对象,操作可以为对玩法对象的创建、查看等。
56.在一种实施例中,若分布式存储集群为codis集群,则步骤110中为操作消息生成唯一消息标识的步骤,进一步可以包括如下步骤:
57.采用基于codis集群的incr指令作为序号生成器,为所述操作消息生成唯一消息标识。
58.在该实施例中,为了避免消息生成的乱序,以codis-union为时钟标尺,采用基于codis集群的incr指令作为序号生成器,以业务对象的标识作为key(键)进行自增的方式得到当前操作消息的唯一消息标识。其中,incr指令用于对存储在指定key的数值执行原子的
加1操作。如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0。如果指定的key中存储的值不是字符串类型或者存储的字符串类型不能表示为一个整数,那么执行这个命令时服务器会返回一个错误代码。通过使用codis做序号发号器,消息消费者服务重启不会影响顺序消费。
59.在其他实施例中,还可以采用mysql数据库存储发号、zookeeper注册中心发号等发号机制来实现信息单点发号。但相比于使用codis union集群基于内存,同时根据业务对象的标识为key哈希到具体redis节点,codis union集群在性能上优于其他替代方式,可以支持更高的qps(query per second,每秒查询率)上限。
60.在进一步的实施例中,在为当前操作消息生成唯一消息标识时,还可以首先确定目标排序维度,并为操作消息生成与该目标排序维度相关的唯一消息标识,从而支持不同维度的排序需求。
61.其中,目标排序维度可以为与业务场景相关的预设排序维度,不同的业务场景可以设定不同的排序维度,例如,目标排序维度可以包括时间顺序维度、状态顺序维度等。
62.在确定目标排序维度以后,则当前操作消息的唯一消息标识是与其目标排序维度相关联的。例如,若目标排序维度为时间顺序维度,为了避免多客户端多服务端的时钟不一致、导致由不同服务节点处理的消息生成的时间戳乱序,通过使用codis集群的incr自增作为序号发号器,各消息生产者服务节点接收到客户端请求,对以当前业务对象的标识为key做自增得到当前操作消息的序号,该序号的顺序和消息生产的时间绝对有序,排除时钟不一致的影响。在实现时,可以以seq序号为序号发号器返回的序号。又如,若目标排序维度为状态顺序维度,比如用户购买商品的订单的各种状态的处理需要进行有序处理,需要严格按照生成订单》订单待支付》订单支付成功》订单待发货》订单待收货》订单完成等顺序流转,如果还有售后情况可能还包括订单退款处理中》订单退款完成等流程,在这种场景下可以设定状态映射有序的序号,则seq序号为该状态的序号。
63.在实际应用中,在生产消息的过程中,用户还可以中途变更目标排序维度,则后续可以根据变更后的目标排序维度生成seq序号,按照变更后目标排序维度生成的seq序号不仅满足业务需求进行排序,还兼容现存数据。例如,按照时间顺序维度生成的seq序号是时间戳1648189672,业务用时间顺序维度跑了一段时间之后想改成状态顺序维度的,可以修改seq序号的生成规则,比如为(状态+时间戳),即,在时间戳1648189672最前面几位定义为状态的值,状态值占几个位就补几个位,比如状态11,时间戳补上状态后的seq序号就是111648189672。按照新的排序维度生成的seq序号直接记录在原来的有序消息队列中即可。
64.步骤120,获取发起所述操作的操作时间戳信息,并将所述业务对象的标识以及所述操作时间戳信息记录在所述分布式存储集群的有序列表中。
65.在本实施例的codis集群中包含的其中一种核心存储结构为有序列表,用于记录多个待处理的业务对象及其最近操作时间戳信息。具体的,有序列表用于存储有变更的业务对象列表,其member(成员)为业务对象的标识,score(值)为发起当前操作的操作时间戳信息(用于表示当前业务对象的最后的更新时间戳)。因此,针对每次操作,消息生产者服务可以获取发起当前操作的操作时间戳信息,然后将该操作时间戳信息与当前业务对象的标识写入有序列表中。由于有序队列存储在codis集群中,这样在后续读取数据的时候,可以避免各服务节点时钟不一致的影响。
66.在一种实现中,可以通过使用time函数来获得当前操作的操作时间戳信息。
67.步骤130,在所述分布式存储集群中获取所述业务对象对应的有序消息队列,并将所述操作消息以及所述唯一消息标识写入所述有序消息队列中。
68.在本实施例的codis集群中包含的另一种核心存储结构为有序消息队列,每个业务对象都具有对应的有序消息队列,用于记录其对应的业务对象中待处理的操作消息以及各操作消息的唯一消息标识。具体的,有序消息队列用于存储每个业务对象的具体消息内容和其排序维度,该结构保证同一个业务对象的消息串行被处理。在有序消息队列中,其member(成员)为当前操作消息的消息体,score(值)为当前操作消息的唯一消息标识(即seq序号)。
69.在本实施例中,在消息生产者服务响应于业务实例对业务对象发起的操作生成操作消息时,采用单点序号生成器为操作消息生成唯一消息标识,避免多客户端多服务端时钟不一致导致生成的时间戳乱序的情况发生。然后在写入该操作消息时,通过存储在分布式存储集群的有序列表以及有序消息队列这两个核心存储结构来进行消息记录,将业务对象的标识以及当前操作的操作时间戳信息记录在有序列表中,并将操作消息以及其唯一消息标识记录在有序消息队列中,从而实现单点序列化存储,避免多客户端多服务端时钟不一致的影响。
70.通过分布式存储集群,可以实现消息生产者服务与消息消费者服务的解耦,使得当消息发送失败重试时,重试期间的其他消息生产不影响消息顺序性的处理;或者在网络传输不稳定时,消息先发(或顺序优先)但是后到,不影响消息顺序性的处理。同时便于消息生产者服务以及消息消费者服务的升级或扩容,且在升级或扩容时不影响消息顺序性的处理。
71.实施例二
72.图3为本技术实施例二提供了一种消息处理方法的流程图,本实施例可以应用于消息消费者服务中,该消息消费者服务与消息生产者服务通过分布式存储集群进行关联,该分布式存储集群中存储有有序列表以及各业务对象对应的有序消息队列,该有序列表用于记录多个待处理的业务对象及其最近操作时间戳信息,该有序消息队列用于记录其对应的业务对象中待处理的操作消息以及各操作消息的唯一消息标识。如图3所示,本实施例可以包括如下步骤:
73.步骤210,从所述有序列表中确定待处理的目标业务对象。
74.在该步骤中,当有序列表中有多个未被处理的业务对象时,则按照设定策略从中选择目标业务对象进行处理。
75.在一种实施例中,步骤210进一步可以包括如下步骤:
76.选取最近操作时间戳信息最早的业务对象作为待处理的目标业务对象。
77.其中,最近操作时间戳信息最早是指最近操作时间戳信息距离当前时间的时间差最长的时间戳信息。在实现时,可以比较有序列表中各个记录的最近操作时间戳信息,从而查找出最早的最近操作时间戳信息。然后将最近操作时间戳信息最早的业务对象作为待处理的目标业务对象,此时可以得到目标业务对象的标识以及最近操作时间戳信息。
78.步骤220,基于所述目标业务对象的最近时间戳信息,判断所述目标业务对象进行有序性校验是否到达设定的处理时机。
79.在该步骤中,设定的处理时机与系统能容忍的消息失败重发的耗时有关,在处理时机内则允许消息重发,确保重发的消息能够到达有序消息队列中;到达处理时则不再允许消息重发,并开始进行业务对象的消息处理。在一种实施例中,步骤220进一步可以包括如下步骤:
80.计算当前时间与所述目标业务对象的最近操作时间戳信息的时间差;若所述时间差大于或等于预设延迟处理时间阈值,则判定目标业务对象到达设定的处理时机;若所述时间差小于预设延迟处理时间阈值,则判定目标业务对象没有到达设定的处理时机。
81.需要说明的是,延迟处理时间阈值为系统能容忍的消息失败重试的最大耗时时间。延迟处理时间阈值可以根据不同的业务需求设定不同的阈值,本实施例对此不作限定。
82.如果当前时间与目标业务对象的最近操作时间戳信息的时间差超过预设延迟处理时间阈值,则表示不再允许目标业务对象进行失败重试,此时目标业务对象到达处理时机,则可以进一步执行步骤230。如果当前时间与目标业务对象的最近操作时间戳信息的时间差不超过预设延迟处理时间阈值,则表示在该阈值时间内允许目标业务对象继续进行失败重试,此时无需对目标业务对象进行处理,等到预设延迟处理时间阈值到达。从而保证同一业务对象在网络不稳定以及消息失败重发时消息内容都已到达有序消息队列中,避免因网络不稳定抖动或失败重试导致在序消息还未达到立即被消费导致乱序的问题,保证消息顺序消费。
83.在实际中,若对有序性严格要求完全一致性,可在重试失败n次后告警人工对目标业务对象进行干预处理,或在消息消费时做前置状态校验。
84.步骤230,当所述目标业务对象到达设定的处理时机,则对所述目标业务对象设置分布式锁。
85.当需要对当前目标业务对象进行消费时,则通过为目标业务对象设置分布式锁,保证同一业务对象的消息只有一个线程进行串行化处理,从而保证消息处理的有序性。
86.同时,当需要对目标业务对象进行消费时,还可以从有序列表中删除该目标业务对象对应的记录。
87.步骤240,在所述分布式存储集群中获取所述目标业务对象对应的目标有序消息队列。
88.当开始对目标业务对象进行消费时,则可以在codis集群中查找该目标业务对象对应的目标有序消息队列,其中,该目标有序消息队列用于存储目标业务对象的多个待处理的操作消息以及各操作消息对应的唯一消息标识。该唯一消息标识可以为根据codis集群的单点发号机制、按照设定的排序维度生成的序号。
89.步骤250,确定获得所述分布式锁的目标线程,并采用所述目标线程按序对所述目标有序消息队列中的操作消息进行处理。
90.在一种实现中,该目标线程可以为用于处理当前目标业务对象的线程。根据各线程的业务请求,可以将分布式锁的权限分配给其中一个线程,则该线程为目标线程,此时目标线程可以对目标业务对象的各操作消息按序进行串行处理。例如,目标线程可以按照seq序号从小到大的次序,从有序消息队列中取出消息进行处理。
91.当对目标业务对象的所有操作消息都处理完成以后,则可以删除目标业务对象的分布式锁。
92.在本实施例中,在进行消息消费时,首先从有序列表中确定目标业务对象,然后对目标业务对象进行有序性校验,当该有序性校验通过以后,则通过为目标业务对象设置分布式锁来保证同一业务对象的消息只有一个线程进行串行化处理,从而保证消息处理的有序性。在开始进行消息消费时,则获取目标业务对象的目标有序消息队列,并根据目标有序消息队列中各操作消息的唯一消息标识按序进行消息处理,以进一步保证消息的按序处理。
93.另外,codis集群有利于消息消费服务可以无限扩容消费,而不局限于分区数量。
94.为了使得本领域技术人员能够更好地理解本技术,以下通过一个具体的应用场景实例对本技术进行示例性说明:
95.本应用场景实例以直播应用场景为例进行说明,假设某直播平台提供了一种纸条玩法,玩法包括投放纸条、抽取纸条以及对抽取的纸条进行留言。当用户需要投放纸条时,可以点击主页的“投放纸条”按钮并在弹出的投放纸条页面中填写相关信息来投放纸条。当用户需要抽取纸条时,可以点击主页的“抽取纸条”按钮来抽取纸条,抽取纸条成功系统会通知纸条投放者纸条被抽取的消息,同时更新纸条被抽取数。当用户对抽取的纸条留言时,系统会通知纸条投放者纸条被留言的消息,同时更新纸条的被留言数。一个纸条可以被多个人抽取或留言,每个纸条会有对应的被抽取数和留言数。
96.产品需求需要对一个纸条的抽取消息和留言消息顺序性处理,并为此设计了三个模块,包括:纸条服务、codis集群以及消息处理服务。其中,
97.纸条服务:即消息生产者的角色,相当于消息生产者服务,服务于前端用户,提供用户投放、抽取、留言等功能,为系统前端入口。当用户抽取纸条以及对纸条留言,纸条服务处理这些事件,生成对应的消息写入codis集群,该模块可以快速扩容提高消息生产的速度。在该实例中,纸条相当于本技术的业务对象;对纸条执行的投放、抽取、留言等相当于对业务对象发起的操作。
98.codis集群:用于存储消息的中间件,基于内存,读写快。包含两种核心存储结构:纸条变更列表(note-change-list,为sorted set有序集合结构)以及纸条消息队列(note-message-sequence,为sorted set有序集合结构)。其中,note-change-list用于存储有变更的纸条列表,member为纸条id,score为该纸条id最后的更新时间戳。note-message-sequence用于存储每个纸条的具体消息内容和其排序维度(时间或者状态等多场景维度),该结构保证同一个纸条的消息串行被处理。
99.消息处理服务:即消息消费者的角色,相当于消息消费者服务。从codis集群中获取数据,取出有变更的纸条,然后对该纸条的消息做有序性的校验判断处理,按序处理消息执行业务逻辑,该模块可以快速扩容提高消息消费的速度。
100.参考图4示出了纸条消息有序处理的流程示意图,包括如下消息生产流程以及消息消费流程:
101.纸条服务的消息生产流程如下:
102.1.用户进行抽取或留言等对纸条的操作时,调用纸条服务集群(包括note service 1、note service 2、
……
、note service n)中的纸条服务;
103.2.纸条服务生成纸条消息,并采用基于codis-union集群的序号生成器(seq-generate)生成该纸条消息的seq序号。生成的seq序号与排序维度相关,该排序维度包括时
间顺序维度以及其他顺序维度,其中,
104.1)时间顺序维度
105.避免多客户端多服务端的时钟不一致导致由不同服务节点处理的消息生成的时间戳乱序,使用codis集群的incr自增作为序号发号器。各纸条服务节点接收到客户端请求,对以纸条id为key做自增得到当前消息的seq序号,该序号的顺序和消息生产的时间绝对有序,排除时钟不一致的影响。seq序号为序号发号器返回的序号。
106.2)其他顺序维度
107.如状态维度,订单状态需要严格按照订单待支付》订单支付成功》订单待发货》订单待收货》订单等次序完成流转,设定状态映射有序的序号,seq序号为该状态的序号。
108.3.写入纸条变更记录
109.将纸条操作的变更信息写入codis中note-change-list(sorted set有序集合),member为纸条id(如图4中的note1-note7),score为该纸条id最后的更新时间戳(即最近操作时间戳信息time)。避免各服务节点时钟不一致的影响。在实现时通过codis使用time获取当前时间戳信息。
110.4.将对应字条的消息写入纸条消息的有序队列
111.每个纸条维护一个有序消息队列note-message-sequence,将消息写入note-message-sequence(sorted set有序集合),其中member为消息体(如图4中的msg1-msg2),score为第2步生成的seq序号(,如图4中的seq,代表排序维度的顺序)。
112.消息处理服务的消息消费流程如下:
113.5.消息处理服务从codis集群中的note-change-list取出纸条变更信息;
114.6.由取出纸条的线程有序处理note-message-sequence中的消息内容。
115.上述两个消费过程的具体过程如下:
116.1)消息处理服务从codis集群中的note-change-list取出时间最小的纸条信息。
117.2)从时间最小的纸条信息中解析出纸条id(noteid)和该纸条最后的更新时间戳信息(time)。
118.3)检查当前时间减去time是否大于延迟处理时间阈值(各场景可配),保证同一纸条在网络不稳定和消息失败重发时,消息都已到达note-message-sequence的有序集合,避免网络消息不稳定和消息失败重发导致乱序的影响。如果当前时间减去time大于延迟处理时间阈值继续处理,否则不处理并重复步骤1)。
119.4)对该纸条id的消息处理加分布式锁。
120.5)从note-change-list删除该纸条id,确保该纸条id的消息只会被同一个线程串行化处理,保证消息处理的有序性。
121.6)获得分布式锁的线程取出该纸条id的消息集合note-message-sequence,然后按seq序号处理消息。
122.7)删除该纸条id的消息处理的分布式锁。
123.本实例通过codis-union集群作为对每个纸条的消息做单点序号发号器,sorted-set的结构存储保证单点序列化,以及延迟处理阈值校验、分布式锁保证同一条纸条的消息只有一个线程串性化处理,达到消息顺序性的高吞吐处理的目的。
124.实施例三
125.图5为本技术实施例三提供的一种消息处理装置的结构示意图,应用于消息消费者服务中,所述消息消费者服务与消息生产者服务通过分布式存储集群进行关联,所述分布式存储集群中存储有有序列表以及各业务对象对应的有序消息队列,所述有序列表用于记录多个待处理的业务对象及其最近操作时间戳信息,所述有序消息队列用于记录其对应的业务对象中待处理的操作消息以及所述操作消息的唯一消息标识。
126.如图5所示,本实施例可以包括如下模块:
127.目标业务对象确定模块310,用于从所述有序列表中确定待处理的目标业务对象;
128.处理时机判断模块320,用于基于所述目标业务对象的最近时间戳信息,判断所述目标业务对象是否到达设定的处理时机;
129.分布式锁添加模块330,用于当所述目标业务对象到达设定的处理时机,则对所述目标业务对象设置分布式锁;
130.目标有序消息队列获取模块340,用于在所述分布式存储集群中获取所述目标业务对象对应的目标有序消息队列;
131.消息处理模块350,用于确定获得所述分布式锁的目标线程,并采用所述目标线程按序对所述目标有序消息队列中的操作消息进行处理。
132.在一种实施例中,目标业务对象确定模块310具体用于:
133.选取最近操作时间戳信息最早的业务对象作为待处理的目标业务对象。
134.在一种实施例中,处理时机判断模块320具体用于:
135.计算当前时间与所述目标业务对象的最近操作时间戳信息的时间差;
136.若所述时间差大于或等于预设延迟处理时间阈值,则判定所述目标业务对象到达设定的处理时机;
137.若所述时间差小于预设延迟处理时间阈值,则判定所述目标业务对象没有到达设定的处理时机。
138.在一种实施例中,所述装置还可以包括如下模块:
139.分布式锁删除模块,用于当所述目标业务对象的所有操作消息都处理完成以后,删除所述分布式锁。
140.在一种实施例中,消息处理模块350具体用于:
141.采用所述目标线程按照所述唯一消息标识从小到大的次序,从所述有序消息队列中取出消息进行处理。
142.在一种实施例中,所述分布式存储集群包括codis集群,所述唯一消息标识为根据所述codis集群的单点发号机制、按照设定的排序维度生成的序号。
143.在一种实施例中,所述装置还可以包括如下模块:
144.业务对象删除模块,用于在所述对所述目标业务对象设置分布式锁之后,在所述有序列表中删除所述目标业务对象对应的记录。
145.本技术实施例所提供的一种消息处理装置可执行本技术任意实施例所提供的一种消息处理方法,具备执行方法相应的功能模块和有益效果。
146.实施例四
147.图6为本技术实施例四提供的一种消息处理装置的结构示意图,应用于消息生产者服务中,所述消息生产者服务与消息消费者服务通过分布式存储集群进行关联,所述分
布式存储集群中存储有有序列表以及各业务对象对应的有序消息队列,所述有序列表用于记录多个待处理的业务对象及其最近操作时间戳信息,所述有序消息队列用于记录其对应的业务对象中待处理的操作消息以及所述操作消息的唯一消息标识。
148.如图6所示,本实施例可以包括如下模块:
149.操作消息生成模块410,用于响应于业务实例对业务对象发起的操作,生成操作消息;
150.消息标识生成模块420,用于基于单点发号机制为所述操作消息生成唯一消息标识;
151.业务对象写入模块430,用于获取发起所述操作的操作时间戳信息,并将所述业务对象的标识以及所述操作时间戳信息记录在所述分布式存储集群的有序列表中;
152.操作消息写入模块440,用于在所述分布式存储集群中获取所述业务对象对应的有序消息队列,并将所述操作消息以及所述唯一消息标识写入所述有序消息队列中。
153.在一种实施例中,所述分布式存储集群包括codis集群,所述消息标识生成模块420具体用于:
154.采用基于codis集群的incr指令作为序号生成器,为所述操作消息生成唯一消息标识。
155.在一种进一步的实施例中,所述消息标识生成模块420具体用于:
156.确定目标排序维度;
157.为所述操作消息生成与所述目标排序维度相关的唯一消息标识。
158.本技术实施例所提供的一种消息处理装置可执行本技术任意实施例所提供的一种消息处理方法,具备执行方法相应的功能模块和有益效果。
159.实施例五
160.图7示出了可以用来实施本技术的方法实施例的业务处理设备10的结构示意图。如图7所示,业务处理设备10包括至少一个处理器11,以及与至少一个处理器11通信连接的存储装置,如只读存储器(rom)12、随机访问存储器(ram)13等,其中,存储装置存储有可被至少一个处理器执行的一个或多个计算机程序,处理器11可以根据存储在只读存储器(rom)12中的计算机程序或者从存储单元18加载到随机访问存储器(ram)13中的计算机程序,来执行各种适当的动作和处理。在ram 13中,还可存储业务处理设备10操作所需的各种程序和数据。
161.业务处理设备10中的多个部件连接至i/o接口15,包括:输入单元16,例如键盘、鼠标等;输出单元17,例如各种类型的显示器、扬声器等;存储单元18,例如磁盘、光盘等;以及通信单元19,例如网卡、调制解调器、无线通信收发机等。
162.处理器11可以是各种具有处理和计算能力的通用和/或专用处理组件,用于执行上文所描述的各个方法和处理,例如一种消息处理方法。
163.在一些实施例中,一种消息处理方法可被实现为计算机程序,其被有形地包含于计算机可读存储介质,例如存储单元18。在一些实施例中,计算机程序的部分或者全部可以经由rom 12和/或通信单元19而被载入和/或安装到业务处理设备10上。当计算机程序加载到ram 13并由处理器11执行时,可以执行上文描述的一种消息处理方法的一个或多个步骤。
164.在一些实施例中,一种消息处理方法可被实现为计算机程序产品,该计算机程序产品包括计算机可执行指令,该计算机可执行指令在被执行时用于执行上文描述的一种消息处理方法的一个或多个步骤。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1