一种集群保序处理队列消息的方法及装置与流程

文档序号:32310172发布日期:2022-11-23 11:19阅读:89来源:国知局
一种集群保序处理队列消息的方法及装置与流程

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.存储器,用于存储程序;
39.处理器,用于执行所述程序,所述程序具体用于实现上述中任一项所述的集群保序处理队列消息的方法。
40.相较于现有技术,本发明提供了一种集群保序处理队列消息的方法及装置,包括:创建一级分发节点;基于一级分发节点以及消息队列中每一消息的业务标识信息,将消息队列中的消息分发至若干个分发队列中,每一分发队列对应一个应用实例;创建二级分发节点;基于二级分发节点以及分发队列中每一消息的业务标识信息,将分发队列中的消息分发至若干个处理线程;基于各个处理线程对每一消息进行并行处理,得到处理结果。本发明实现了多实例多线程对消息进行处理,实现了业务消息保序处理,提升了服务器的处理效率。
附图说明
41.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据
提供的附图获得其他的附图。
42.图1为本发明实施例提供的一种集群保序处理队列消息的方法的流程示意图;
43.图2为本发明实施例提供的一种应用场景的示意图;
44.图3为本发明实施例提供的一种集群保序处理队列消息的装置的结构示意图。
具体实施方式
45.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
46.本发明的说明书和权利要求书及上述附图中的术语“第一”和“第二”等是用于区别不同的对象,而不是用于描述特定的顺序。此外术语“包括”和“具有”以及他们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有设定于已列出的步骤或单元,而是可包括没有列出的步骤或单元。
47.在本发明实施例中提供了一种集群保序处理队列消息的方法,该方法应用于对业务消息进行保序消费的场景中,其中,保序消费是指消息的处理必须按照一定的顺序执行。上游业务集群作为业务消息的生产端,下游消费集群作为业务消息的消费端对业务消息进行处理。
48.参见图1,为本发明实施例提供的一种集群保序处理队列消息的方法的流程示意图,该方法可以包括以下步骤:
49.s101、创建一级分发节点。
50.s102、基于一级分发节点以及消息队列中每一消息的业务标识信息,将消息队列中的消息分发至若干个分发队列中,每一分发队列对应一个应用实例。
51.通过分析当前业务集群中各个节点的特性,将能够满足消息分发特性的节点确定为一级分发节点,节点就是集群中能够执行服务的计算机设备。一级分发节点通过该多线程处理分发,不处理其他业务逻辑。
52.在本发明实施例的一种实施方式中,响应于接收到消息生成端产生的待处理消息;根据待处理消息的业务顺序,将待处理消息缓存至消息队列中,其中消息队列为基于消息中间件生成的。
53.首先,搭建消息中间件集群,并启动对消息进行缓存的服务。例如,可以搭建消息中间件rabbitmq集群。上游业务集群作为消息生产端,按照业务顺序向消息队列中推送业务消息。
54.其次,可以基于消息消费端的特征,生成分发队列,每一分发队列对应一个应用实例,实例为在集群中部署的应用服务,一个实例就是一个应用服务,多个实例组成集群。
55.对应的,可以建立消息队列的长连接,以监听上游业务集群下发队列,并获取消息队列中的消息,然后对消息队列中的每一消息对应的消息内容进行解析,获得业务标识信息,基于业务标识信息对消息队列中的消息进行分发,以保证同一业务标识的消息被分发到同一分发队列中,可以实现多线程分发。
56.在本发明实施例的一种实现方式中,所述基于所述一级分发节点以及消息队列中
每一消息的业务标识信息,将所述消息队列中的消息分发至若干个分发队列中,包括:
57.获取所述消息队列中每一消息的业务标识信息,并对所述业务标识信息进行哈希运算,得到哈希码;获得分发队列的数量值,基于所述队列值和所述哈希码进行处理,得到处理结果;控制所述一级分发节点基于所述处理结果,将所述消息队列中的消息分发至若干个分发队列中。
58.由于消息的业务标识可能是字符串,若是字符串需要进行哈希运算,以便能够根据哈希码进行消息分发,使得消息分发结果更加客观和准确。例如,通过公式(1)对业务标识(业务id)进行哈希运算,得到哈希码。
59.s[0]*31^(j-1)+s[1]*31^(j-2)+...+s[j-1](1)
[0060]
在公式(1)中,s[i]是字符串的第i个字符的ascii码,j是字符串的长度,^表示求幂。
[0061]
若分发队列为n个,可以对公式(1)计算得到的哈希值根据n进行取模运算,根据运算结果将业务消息分发到n个队列中。
[0062]
在基于一级分发节点对消息队列中的消息进行分发的过程中,还可以对每一分发队列进行监测,得到监测结果,即建立每一个分发队列对应的实例的消息队列长连接,监听对应的分发队列,已能够获得对应的分发结果。
[0063]
s103、创建二级分发节点。
[0064]
s104、基于二级分发节点以及分发队列中每一消息的业务标识信息,将分发队列中的消息分发至若干个处理线程。
[0065]
在集群中确定二级分发节点,该二级分发节点用于将分发队列中的消息分配到若干个不同的处理线程中进行处理,以保证同一业务标识信息永远被分配到同一处理线程进行处理。
[0066]
每一分发队列对应一个应用实例(为了便于描述,将应用实例简称为实例),每个实例建立二级分发节点,初始化线程池,并设置核心的处理线程数量可以为x。需要说明的是,若实例(即分发队列)的数量为n,则x一定不能是n的整倍数,否则会导致业务消息会一直分配给同一线程,无法实现单个实例资源的最大利用。
[0067]
在本发明实施例的一种实现方式中,所述基于所述二级分发节点以及所述分发队列中每一消息的业务标识信息,将所述分发队列中的消息分发至若干个处理线程,包括:
[0068]
确定与每一处理线程对应的分发队列;获得与当前处理线程对应的分发队列的每一消息的业务标识信息,并对所述业务标识信息进行哈希运算,得到哈希码;;基于处理线程的数量值和所述哈希值进行计算,得到计算结果;控制所述二级分发节点基于所述计算结果,将所述分发队列中的消息分发至若干个处理线程中。
[0069]
若有x个处理线程,每个处理线程任务配置一个任务队列,任务队列可以选择具有先进先出(如,fifo)特性的linkedlist(双向链表)集合。
[0070]
进一步可以采用while+pop建立循环机制,获取linkedlist的栈顶值,并删除,即获取到最早分配给该线程任务的业务消息,并在获取到值后删除。需要说明的是,该步骤中不能利用迭代器循环,否则会出现主线程将消息加到队列时,下标发生变化,从而导致循环异常。
[0071]
具体的,可以通过第二分发节点对应的主线程对业务标识信息再次进行哈希运
算,获得哈希码,然后重现对哈希值根据处理线程的数量(如,x)进行取模运算,根据运算结果将业务消息分配到x个任务中。
[0072]
s105、基于各个所述处理线程对每一消息进行并行处理,得到处理结果。
[0073]
各个处理线程执行与分配得到的消息对应的业务处理逻辑,得到处理结果。
[0074]
在本发明实施例中还包括:响应于处理线程对消息进行处理存在异常状态,将所述消息重新输入至与所述消息对应的分发队列中,以使得对所述分发队列中的所述消息进行重新分发。
[0075]
进一步地,若对所述消息重新处理的次数超过次数阈值,生成预警信息。
[0076]
即,在对消息进行处理的过程中,建立补偿机制,当线程任务执行业务逻辑出现异常的时候,将业务消息重新输入分发队列中,以便重新再分配并执行。上述过程称为重试过程,然后设置重试阈值,如果重试超过设定值,则终止执行并触发报警。
[0077]
经过上述处理,最终完成消息中间件对应的消息队列中各个消息的保序执行。
[0078]
本发明实施例提供了一种集群保序处理队列消息的方法,包括:创建一级分发节点;基于一级分发节点以及消息队列中每一消息的业务标识信息,将消息队列中的消息分发至若干个分发队列中,每一分发队列对应一个应用实例;创建二级分发节点;基于二级分发节点以及分发队列中每一消息的业务标识信息,将分发队列中的消息分发至若干个处理线程;基于各个处理线程对每一消息进行并行处理,得到处理结果。本发明实现了多实例多线程对消息进行处理,实现了业务消息保序处理,提升了服务器的处理效率。
[0079]
参见图2,为本发明实施例提供的一种应用场景示意图,下面以具体的应用场景对本发明实施例提供的集群保序处理队列消息的方法进行说明。
[0080]
首先对应用场景中的相关术语进行解释:
[0081]
mq:也称消息队列,指存储消息的中间件,发送方称为生产者,接收方称为消费者。
[0082]
实例:指的是部署在服务器上,并启动的应用程序。
[0083]
集群:在多个服务器上部署多个应用程序,每个应用程序就是一个实例,通过负载均衡将处理请求分配到实例上,实现服务的高可用,这些实例的集合就叫做集群。
[0084]
线程:进行处理器资源调度的最基本单位。
[0085]
部分业务场景下,消息的处理顺序是有要求的,比如某业务生产者依次共下发了“新增消息a”、“修改消息b”、“删除消息c”三个消息,这三个消息处理是有前提的,比如修改和删除消息处理的前提是必须要有业务数据,即在处理b或者c之前新增消息a已经被执行完成,现实中,如果只是单纯的在集群下开启多实例多线程处理mq消息,可能会因为每个消息的处理业务逻辑不一致,使得所需的处理时间也不一致,有可能生产者后发的消息反而先处理完成。从而可能出现“修改消息b”或者“删除消息c”被执行的时候,“新增消息a”尚未被执行完成,出现因为找不到业务数据,导致业务处理失败。
[0086]
为了解决集群多实例多线程消费mq消息场景下,实现业务消息保序处理,该方法具体实施步骤如下:
[0087]
201、搭建消息中间件rabbitmq集群,并启动服务。
[0088]
202、部署上游业务集群,并连接rabbitmq。
[0089]
203、上游业务集群做为生产者,按照业务顺序往rabbitmq推送业务消息。
[0090]
204、部署消费端集群,共n个实例,并连接rabbitmq。
[0091]
205、建立mq长连接,监听上游业务集群下发消息的队列,并获取队列中的消息。
[0092]
206、通过消费集群其中任一实例,建立一级分发节点。
[0093]
207、初始化分发线程池,并启动多线程任务。
[0094]
208、该分发节点通过多线程处理分发,不处理其他业务逻辑。
[0095]
209、解析消息内容,并获取业务id。
[0096]
210、对业务id进行哈希运算,获取到哈希码。
[0097]
211、对哈希值根据n进行取模运算,根据运算结果将业务消息发送到n个分发队列中。
[0098]
212、每个实例建立1个mq长连接,监听1个对应的分发队列。
[0099]
213、每个实例建立二级分发节点,初始化线程池,并设置核心线程数为x。需要说明的是,这里的x一定不能是n的整数倍,否则会导致业务消息会一直分配给同一个线程,无法实现单个实例资源的最大利用。
[0100]
214、初始化x个线程任务,并使用第13步创建的线程池执行线程任务。
[0101]
215、每个线程任务配置一个任务队列,任务队列选择具有fifo(先进先出)特性的linkedlist集合。
[0102]
216、采用while+pop建立循环机制,获取linkedlist的栈顶值,并删除,即获取到最早分配给该线程任务的业务消息,并在获取到值后删除。需要说明的是,这里不能使用迭代器循环,否则会出现主线程将消息加到队列时,下标发生变化,从而导致循环异常。
[0103]
217、主线程对业务id再次进行哈希运算,获取到哈希码。
[0104]
218、重新对哈希值根据x进行取模运算,根据运算结果将业务消息分配到x个任务中。
[0105]
219、线程任务执行业务处理逻辑。
[0106]
220、建立补偿机制,当线程任务执行业务逻辑出现异常的时候,将业务消息重新丢入分发队列中,重新再分配并执行。
[0107]
221、设置重试阈值,如果重试超过设定值,则终止执行并触发报警。
[0108]
222、最终完成消息中间件中的消息保序执行。
[0109]
在本发明的应用实例中,是在多实例多线程消费时,实现业务消息保序消费。解决需要保序处理的业务场景下,消费集群不用以牺牲服务性能的方式来保证业务要求,以最小的服务器成本实现集群的最大并发处理能力。
[0110]
对应的,在本发明实施例中还提供了一种集群保序处理消息队列的装置,参见图3,该装置可以包括:
[0111]
第一创建单元301,用于创建一级分发节点;
[0112]
第一分发单元302,用于基于所述一级分发节点以及消息队列中每一消息的业务标识信息,将所述消息队列中的消息分发至若干个分发队列中,每一分发队列对应一个应用实例;
[0113]
第二创建单元303,用于创建二级分发节点;
[0114]
第二分发单元304,用于基于所述二级分发节点以及所述分发队列中每一消息的业务标识信息,将所述分发队列中的消息分发至若干个处理线程;
[0115]
处理单元305,用于基于各个所述处理线程对每一消息进行并行处理,得到处理结
果。
[0116]
本发明实施例提供了一种集群保序处理队列消息的装置,包括:第一创建单元创建一级分发节点;第一分发单元基于一级分发节点以及消息队列中每一消息的业务标识信息,将消息队列中的消息分发至若干个分发队列中,每一分发队列对应一个应用实例;第二创建单元创建二级分发节点;第二分发单元基于二级分发节点以及分发队列中每一消息的业务标识信息,将分发队列中的消息分发至若干个处理线程;处理单元基于各个处理线程对每一消息进行并行处理,得到处理结果。本发明实现了多实例多线程对消息进行处理,实现了业务消息保序处理,提升了服务器的处理效率。
[0117]
在一种实施方式中,所述第一分发单元具体用于:
[0118]
获取所述消息队列中每一消息的业务标识信息,并对所述业务标识信息进行哈希运算,得到哈希码;
[0119]
获得分发队列的数量值,基于所述队列值和所述哈希码进行处理,得到处理结果;
[0120]
控制所述一级分发节点基于所述处理结果,将所述消息队列中的消息分发至若干个分发队列中。
[0121]
对应的,所述装置还包括:
[0122]
监测单元,用于对每一分发队列进行监测,得到监测结果。
[0123]
在一种实施方式中,所述第二分发单元包括:
[0124]
确定与每一处理线程对应的分发队列;
[0125]
获得与当前处理线程对应的分发队列的每一消息的业务标识信息,并对所述业务标识信息进行哈希运算,得到哈希码;;
[0126]
基于处理线程的数量值和所述哈希值进行计算,得到计算结果;
[0127]
控制所述二级分发节点基于所述计算结果,将所述分发队列中的消息分发至若干个处理线程中。
[0128]
可选地,所述装置还包括:
[0129]
重新分发单元,用于响应于处理线程对消息进行处理存在异常状态,将所述消息重新输入至与所述消息对应的分发队列中,以使得对所述分发队列中的所述消息进行重新分发。
[0130]
进一步地,所述装置还包括:
[0131]
生成单元,用于若对所述消息重新处理的次数超过次数阈值,生成预警信息。
[0132]
可选地,所述装置还包括:消息缓存单元,用于:
[0133]
响应于接收到消息生成端产生的待处理消息;
[0134]
根据所述待处理消息的业务顺序,将所述待处理消息缓存至所述消息队列中。
[0135]
可选地,所述装置还包括:
[0136]
队列分发单元,用于基于所述消息消费端集群的特征信息,生成分发队列。
[0137]
基于前述实施例,本技术的实施例提供一种计算机可读存储介质,计算机可读存储介质存储有一个或者多个程序,该一个或者多个程序可被一个或者多个处理器执行,以实现如上任一项的集群保序处理队列消息的方法的步骤。
[0138]
本发明实施例还提供了一种电子设备,包括
[0139]
存储器,用于存储程序;
[0140]
处理器,用于执行所述程序,所述程序具体用于实现如上任一项所述的集群保序处理队列消息的方法。
[0141]
需要说明的是,该处理器的具体执行过程请参见前述各个实施例,此处不再详述。
[0142]
需要说明的是,上述处理器或cpu可以为特定用途集成电路(application specific integrated circuit,asic)、数字信号处理器(digital signal processor,dsp)、数字信号处理装置(digital signal processing device,dspd)、可编程逻辑装置(programmable logic device,pld)、现场可编程门阵列(field programmable gate array,fpga)、中央处理器(central processing unit,cpu)、控制器、微控制器、微处理器中的至少一种。可以理解地,实现上述处理器功能的电子器件还可以为其它,本技术实施例不作具体限定。
[0143]
需要说明的是,上述计算机存储介质/存储器可以是只读存储器(read only memory,rom)、可编程只读存储器(programmable read-only memory,prom)、可擦除可编程只读存储器(erasable programmable read-only memory,eprom)、电可擦除可编程只读存储器(electrically erasable programmable read-only memory,eeprom)、磁性随机存取存储器(ferromagnetic random access memory,fram)、快闪存储器(flash memory)、磁表面存储器、光盘、或只读光盘(compact disc read-only memory,cd-rom)等存储器;也可以是包括上述存储器之一或任意组合的各种终端,如移动电话、计算机、平板设备、个人数字助理等。
[0144]
在本技术所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
[0145]
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
[0146]
另外,在本技术各实施例中的各功能单元可以全部集成在一个处理模块中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
[0147]
本技术所提供的几个方法实施例中所揭露的方法,在不冲突的情况下可以任意组合,得到新的方法实施例。
[0148]
本技术所提供的几个产品实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的产品实施例。
[0149]
本技术所提供的几个方法或设备实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的方法实施例或设备实施例。
[0150]
以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以所述权利要求的保护范围为准。
[0151]
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
[0152]
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1