发明内容
有鉴于此,本公开提供一种基于消息队列系统的消息处理方法和装置,以加快消息整体的处理速度,降低消息延迟时间。
具体地,本公开是通过如下技术方案实现的:
第一方面,提供一种基于消息队列系统的消息处理方法,所述消息队列系统包括消息队列服务端和消息队列客户端,所述消息队列服务端包括属于同一消息主题的多个队列分组;所述方法包括:
一个队列分组接收作为生产者的消息队列客户端发送的消息;
所述队列分组判断当前的队列长度是否达到阈值,若达到阈值,则向所述作为生产者的消息队列客户端返回队列满指令,并且返回推荐切换的目标队列分组;
所述作为生产者的消息队列客户端根据所述队列满指令,将生产的消息转发至所述目标队列分组;
所述队列分组接收作为消费者的消息队列客户端拉取消息的请求,所述作为消费者的消息队列客户端用于订阅所述消息主题并处理所述消息主题下的队列分组中发布的消息;
所述队列分组判断当前的队列长度是否达到阈值,若达到阈值,则向所述消费者的消息队列客户端返回队列满指令,并且返回推荐切换的目标队列分组;
所述作为消费者的消息队列客户端根据所述队列满指令,将由所述队列分组拉取的消息转发至所述目标队列分组,以由所述目标队列分组对应的消费者的消息队列客户端进行处理。
第二方面,提供一种消息队列系统,所述系统包括:消息队列服务端和消息队列客户端,所述消息队列服务端包括属于同一消息主题的多个队列分组,所述消息队列客户端包括作为生产者的消息队列客户端和作为消费者的消息队列客户端;
所述消息队列服务端的其中一个队列分组,用于在接收到所述作为生产者的消息队列客户端发送的消息时,或者在接收到作为消费者的消息队列客户端拉取消息的请求时,判断当前的队列长度是否达到阈值,若达到阈值,则向所述消息队列客户端返回队列满指令,并且返回推荐切换的目标队列分组;
所述作为生产者的消息队列客户端,用于根据所述队列满指令,将向所述队列分组发送的消息转发至所述目标队列分组;
所述作为消费者的消息队列客户端,用于根据所述队列满指令,将由所述队列分组拉取的消息转发至所述目标队列分组。
第三方面,提供一种计算机可读存储介质,所述介质上存储有计算机指令,该指令被处理器执行时,用于实现消息队列系统,所述消息队列系统包括消息队列服务端和消息队列客户端,所述消息队列服务端包括属于同一消息主题的多个队列分组;所述消息队列系统执行以下步骤:
一个队列分组接收作为生产者的消息队列客户端发送的消息;
所述队列分组判断当前的队列长度是否达到阈值,若达到阈值,则向所述作为生产者的消息队列客户端返回队列满指令,并且返回推荐切换的目标队列分组;
所述作为生产者的消息队列客户端根据所述队列满指令,将生产的消息转发至所述目标队列分组;
所述队列分组接收作为消费者的消息队列客户端拉取消息的请求,所述作为消费者的消息队列客户端用于订阅所述消息主题并处理所述消息主题下的队列分组中发布的消息;
所述队列分组判断当前的队列长度是否达到阈值,若达到阈值,则向所述消费者的消息队列客户端返回队列满指令,并且返回推荐切换的目标队列分组;
所述作为消费者的消息队列客户端根据所述队列满指令,将由所述队列分组拉取的消息转发至所述目标队列分组,以由所述目标队列分组对应的消费者的消息队列客户端进行处理。
第四方面,提供一种消息处理设备,所述设备包括存储器、处理器,以及存储在存储器上并可在处理器上运行的计算机指令,所述处理器执行所述指令时实现消息队列系统,所述消息队列系统包括消息队列服务端和消息队列客户端,所述消息队列服务端包括属于同一消息主题的多个队列分组;所述消息队列系统执行以下步骤:
一个队列分组接收作为生产者的消息队列客户端发送的消息;
所述队列分组判断当前的队列长度是否达到阈值,若达到阈值,则向作为生产者的所述消息队列客户端返回队列满指令,并且返回推荐切换的目标队列分组;
所述作为生产者的消息队列客户端根据所述队列满指令,将生产的消息转发至所述目标队列分组;
所述队列分组接收作为消费者的消息队列客户端拉取消息的请求,所述作为消费者的消息队列客户端用于订阅所述消息主题并处理所述消息主题下的队列分组中发布的消息;
所述队列分组判断当前的队列长度是否达到阈值,若达到阈值,则向所述消费者的消息队列客户端返回队列满指令,并且返回推荐切换的目标队列分组;
所述作为消费者的消息队列客户端根据所述队列满指令,将由所述队列分组拉取的消息转发至所述目标队列分组,以由所述目标队列分组对应的消费者的消息队列客户端进行处理。
本公开的基于消息队列系统的消息处理方法和装置,通过由消息队列服务端的Partition来判断是否出现消息积压,并在积压产生时向客户端返回队列满指令,使得客户端可以根据Partition推荐的队列来转移消息,从而加快消息整体的处理速度,降低消息处理的延迟时间。
具体实施方式
图1示例了一个消息队列系统的系统架构图,如图1所示,一个消息队列系统可以包括三个部分:Producer11、消息队列(Message Queue)12、Consumer13。其中,Producer11作为消息的生产者(传输的数据即为消息,例如,各种类型的数据文件,或者,一个应用向其他应用发送的处理请求等),可以将生产的一个个消息14发送至消息队列12,Consumer13可以由消息队列12拉取消息进行消费(例如,根据拉取的消息发送邮件)。本公开的例子中,上述的消息队列12可以称为消息队列服务端,Producer11和Consumer13可以称为消息队列客户端;并且,Producer11是作为消息生产者的消息队列客户端,Consumer13是作为消息消费者的消息队列客户端。
在消息队列系统的实际应用中,可以有多个Producer11,也可以有多个Consumer13,而且消息队列12也可以包括多个消息主题Topic的队列,一个Topic还可以包括多个队列分组Partition,Consumer可以订阅Topic并处理该Topic下的各个队列分组中发布的消息。如图2所示,示例了一个消息队列系统的应用架构。如图2所示,Partition1至Partition3可以属于同一个Topic,ProducerA可以向Partition1和Partition2发送消息,对应的消息分别由ConsumerA和ConsumerB进行消费,Partition3用于ProducerB和ConsumerC之间的消息传输。
由于各个Consumer的机器负载之间存在差异性,对Partition中消息的消费速度是不一致的,有可能造成某个Partition中的消息积压,从而影响消息的及时消费处理。本公开例子提供的消息处理方法,可以用于解决上述问题,以尽量避免队列中的消息积压造成数据处理延迟。
如下以图2所示的应用架构为例,描述本公开例子的消息处理方法:
本例子的消息处理方法,主要思路是将处理速度较慢的消息队列Partition的消息转移到处理速度较快的Partition中,以减少处理速度较慢的Partition中的消息积压。例如,假设图2中由于ConsumerB的机器负载较高,导致Partition2出现了消息积压,而Partition1和Partition3尚未出现积压,为了避免加剧Partition2的积压状况,可以由如下两个方面改善:
一方面,可以在ProducerA向Partition2发送消息时,使得ProducerA调整至将该消息转移到其他未积压的Partition(例如,Partition1或者Partition3,属于同一Topic的Partition即可),从Partition2的源头上减少消息的进入。
另一方面,还可以是当ConsumerB由Partition2拉取消息时,由于ConsumerB的机器负载较高,可以使得ConsumerB不再处理该消息,而是在消息拉取后将该消息转移至Partition1(ConsumerB转换为Partition1的消息生产者的角色),由对应Partition1的ConsumerA消费,从Partition2的出口加快消息的离开。
上述两方面的转移,在消息队列系统中至少实施其中一个,都可以减轻Partition2的消息积压。如下结合图3至图5,说明如何实现上述的消息转移。
图3中在Producer A和Partition2之间,实施了由Partition2转移至Partition1的消息发送转移,相当于消息的重发,图4对应描述这一过程:
在步骤401中,作为生产者的消息队列客户端向队列分组Partition发送生产的消息。
例如,图3中的Producer A根据预先配置好的对应关系,向对应的Partition2发送生产的消息,即图3中示例的消息重发过程中的“1”标识的虚线箭头线,表示Producer A向Partition2发送消息,请求Partition2接受并存储该消息。
在步骤402中,当前的Partition判断当前的队列长度是否达到阈值。
例如,当前的Partition即Partition2,该Partition2可以判断队列长度是否大于或等于预定的长度阈值,比如,长度阈值可以是存储n个消息,n为自然数。该队列长度的阈值可以是根据Partition所属服务器的硬件资源和承载能力,结合所接收消息的量级、消息的大小等因素综合确定;通常,属于同一个Topic的各个Partition的队列长度阈值可以设定为相同。
本步骤的判断结果若是未达到阈值,说明该Partition尚未达到其最大承载能力,还能继续接收消息,如图4所示,可以继续执行步骤403和步骤404;否则,若达到阈值,则说明该Partition已经出现了消息积压,继续执行步骤405。
在步骤403中,当前的Partition接收并存储消息。
例如,Partition可以将Producer发送的消息放入自己的消息队列中。
在步骤404中,当前的Partition向生产者的消息队列客户端返回处理完成指令,使得Producer得知其发送的消息已经被放入消息队列中。
上述的步骤403和步骤404均为正常处理生产者的消息处理请求,将生产者发送的消息放入Partition的消息队列存储。而在步骤405中,由于Partition已经产生了消息积压,所以Partition向生产者的消息队列客户端返回队列满指令,并且返回推荐切换的目标Partition。
例如,Partition2在产生消息积压时,可以向Producer A返回队列满指令,使得Producer A据此获知Partition2的消息处理速度较慢,可以根据Partition2返回的目标Partition,将原来向Partition2发送的消息进行重发,重发至所述目标Partition,即调整了消息的发送队列。如图3所示,在消息重发过程中的“2”标识的虚线箭头线,表示Partition 2向Producer A返回队列满指令和目标Partition,例如,本例子中目标Partition即为图3中的Partition 1。
其中,Partition 2返回推荐切换的目标Partition的过程,可以参见图5的示例。如图5所示,消息队列服务端还可以包括队列管理器51,Partition 2可以向该队列管理器51请求推荐切换的目标Partition。队列管理器51中可以存储位于同一Topic下的各个Partition的队列负载状态,例如,可以包括同属于TopicA的Partition 1、Partition 2和Partition 3的负载状态,比如,Partition 1的当前队列长度是3000消息,Partition 2的当前队列长度是3901个消息,Partition 3的当前队列长度是3600个消息。假设预定的负载最大阈值是3900个消息,即一个Partition中的消息达到3900时就出现积压,那么队列管理器51据此可以由Partition 1和Partition 3选择一个,例如可以选择Partition 1作为目标Partition,推荐至Partition2,Partition2再将该目标Partition返回给Producer A。
在步骤406中,作为生产者的消息队列客户端根据队列满指令,将生产的消息转发至目标Partition。
例如,Producer A接收到Partition2返回的队列满指令后,可以将消息转发至Partition2推荐的Partition 1。如图3所示,在消息重发过程中的“3”标识的虚线箭头线,表示Producer A向Partition 1发送消息。Partition 1在接收到该消息后,可以同样如Partition2那样,判断当前的队列长度是否达到阈值,本例子中,Partition 1将确定未达到阈值,则接受并存储该消息,并向Producer A返回处理完成指令。图3中的消息重发过程的“4”标识的虚线箭头线,表示Partition 1向Producer A返回处理完成指令。
本例子的消息处理方法,通过由消息队列服务端的Partition在消息积压时,向生产者的消息队列客户端返回队列满指令以及推荐的目标Partition,可以触发生产者的消息队列客户端将原本发送至积压Partition的消息重发至该目标Partition,从而达到了转移数据减少积压的效果。
图3中在Partition和Consumer之间,实施了由Consumer将产生积压的Partition2的消息转移至Partition1,相当于消息的转发,图6对应描述这一过程:
在步骤601中,作为消费者的消息队列客户端向队列分组Partition拉取消息。例如,图3中的Consumer B根据预先配置好的对应关系,向对应的Partition2拉取消息,即图3中示例的消息转发过程中的“1”标识的虚线箭头线,表示Consumer B由Partition2拉取消息。
在步骤602中,当前的Partition判断当前的队列长度是否达到阈值。
例如,当前的Partition即Partition2,该Partition2可以判断队列长度是否大于或等于预定的长度阈值。本步骤的判断结果若是未达到阈值,说明该Partition尚未出现消息积压,可以继续执行步骤603;否则,若达到阈值,则说明该Partition已经出现了消息积压,消息的处理速度较慢,继续执行步骤604。
在步骤603中,作为消费者的消息队列客户端正常处理消息。
在步骤604中,当前的Partition向消费者的消息队列客户端返回队列满指令,并且返回推荐切换的目标Partition。
例如,Partition2在产生消息积压时,可以向Consumer B返回队列满指令,使得Consumer B据此获知Partition2的消息处理速度较慢,可以根据Partition2返回的目标Partition,将拉取的消息转发至目标Partition。其中,目标Partition的推荐过程可以如图5的示例,不再详述。如图3所示,在消息转发过程中的“1”标识的虚线箭头线,表示Partition 2向Consumer B返回队列满指令和目标Partition,例如,本例子中目标Partition即为图3中的Partition 1。
在步骤605中,作为消费者的消息队列客户端根据队列满指令,将拉取的消息转发至目标Partition。
本步骤中,Partition2的消息积压可能是由于Consumer B的机器负载高或者机器本身硬件配置差造成,Consumer B对消息的消费速度较慢,因此可以通过本例子的方法,使得Consumer B在拉取消息后,不再自己消费处理,而是将消息转发至尚未积压的目标Partition,由目标Partition对应的Consumer来消费处理。这一过程中,Consumer B由消费者转变为消息生产者的角色,将消息转发到了积压少的队列中。如图3所示,在消息转发过程中的“2”标识的虚线箭头线,表示Consumer B将拉取的消息向Partition 1转发。
Partition 1在接收到该消息后,后续该消息将被Consumer A拉取,即图3中的消息转发过程的“3”标识的虚线箭头线,表示Consumer A由Partition 1拉取消息。Partition1可以同样如Partition2那样,判断当前的队列长度是否达到阈值,本例子中,Partition 1将确定未达到阈值,则不向Consumer A返回队列满指令,Consumer A可以正常消费处理该消息。
本例子的消息处理方法,通过由消息队列服务端的Partition在消息积压时,向拉取消息的作为消费者的消息队列客户端返回队列满指令以及推荐的目标Partition,可以触发消费者的消息队列客户端将由积压Partition拉取的消息转发至目标Partition,从而达到了转移数据减少积压的效果。
由上述例子的描述可以看到,本公开的消息处理方法是由消息队列服务端的Partition来判断是否出现消息积压,并在积压产生时向客户端返回队列满指令,使得客户端能够感知到服务端队列的消息处理速度和状态,并可以根据Partition推荐的队列来转移消息,减轻Partition的积压。如图7所示:
在步骤701中,一个队列分组Partition接收所述消息队列客户端发送的消息处理请求。
例如,该消息队列客户端发送的消息处理请求可以是生产者端的发送消息,或者还可以是消费者端的拉取消息。
在步骤702中,所述队列分组Partition判断当前的队列长度是否达到阈值,若达到阈值,则向所述消息队列客户端返回队列满指令,并且返回推荐切换的目标Partition。
例如,不论Partition接收到的消息处理请求是拉取消息还是发送消息,都可以执行本步骤的判断,并在队列长度达到阈值时返回队列满指令和推荐的目标Partition。
在步骤703中,所述消息队列客户端根据所述队列满指令,向所述目标Partition转发消息。
例如,本步骤的向目标Partition转发消息,可以是生产者的客户端将发送的消息重发至目标Partition,减少了产生积压的Partition的消息进入;或者也可以是作为消费者的客户端将拉取的消息转发至目标Partition,转由目标Partition对应的Consumer消费,从而加快产生积压的Partition的消息流出。
本例子的基于消息队列系统的消息处理方法,通过由消息队列服务端的Partition来判断是否出现消息积压,并在积压产生时向客户端返回队列满指令,使得客户端可以根据Partition推荐的队列来转移消息,从而加快消息整体的处理速度,降低消息处理的延迟时间。
上述实施例阐明的装置或模块,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本公开时可以把各模块的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本公开的实施例可提供为方法、系统、或计算机程序产品。因此,本公开可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本公开可采用在一个或多个其中包含有计算机指令的计算机可读存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。例如,所述计算机指令被设备中的处理器执行时可以实现以下步骤:一个队列分组Partition接收所述消息队列客户端发送的消息处理请求;所述队列分组Partition判断当前的队列长度是否达到阈值,若达到阈值,则向所述消息队列客户端返回队列满指令,并且返回推荐切换的目标Partition;所述消息队列客户端根据所述队列满指令,向所述目标Partition转发消息。
在一个例子中,本公开还可以提供一种消息处理设备,该设备可以包括存储器、一个或多个处理器(CPU)、输入/输出接口、网络接口和内存,以及存储在存储器上并可在处理器上运行的计算机指令。所述处理器执行所述指令时实现以下步骤:一个队列分组Partition接收所述消息队列客户端发送的消息处理请求;所述队列分组Partition判断当前的队列长度是否达到阈值,若达到阈值,则向所述消息队列客户端返回队列满指令,并且返回推荐切换的目标Partition;所述消息队列客户端根据所述队列满指令,向所述目标Partition转发消息。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
以上所述仅为本公开的较佳实施例而已,并不用以限制本公开,凡在本公开的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本公开保护的范围之内。