消息中间件消息获取方法、装置和系统与流程

文档序号:16978421发布日期:2019-02-26 19:14阅读:229来源:国知局
消息中间件消息获取方法、装置和系统与流程

本发明涉及数据处理技术领域,特别涉及一种消息中间件消息获取方法、装置和系统。



背景技术:

消息中间件是指支持与保障分布式应用程序之间收发消息数据的中间层,消息发送方和处理方之间的连接完全是松耦合的,通信是非阻塞的。常见的产品有rabbitmq(mq的全称为messagequeue,消息队列)、rocketmq等。

消息中间件的基本工作原理为:消息数据存储于服务端的消息队列中,消息处理端从消息队列中拉取消息进行处理。

图1为现有消息中间件消息获取方法的示意图。如图1所示,为现有消息中间件消息获取方法中:

1、消息处理端批量从服务端拉取消息,服务端存储消息队列的处理进度。

2、消息的处理结果和状态都存储于各个消息处理端中。

3、倘若在消息处理未完成时消息处理端出现异常错误或者由于业务需要重试处理消息时,向服务端的批量拉取很可能获取到已经处理完成的消息,导致重复处理。

4、中间件配套的管理查询系统中很难高效地获取消息实时的处理状态。

现有的消息中间件为了保证消息处理的性能,通常通过批量方式从消息队列中顺序获取消息,然后把消息的处理状态存储在处理端。但是当该批消息中有个别消息处理失败或者由于业务需要重试处理时,处理端的批量操作也会对目标消息在消息队列中邻近的已处理完成的消息进行不必要的重复获取。



技术实现要素:

鉴于以上技术问题,本发明提供了一种消息中间件消息获取方法、装置和系统,在处理阶段完成时更新消息的状态,避免了消息处理端进行不必要的消息获取。

根据本发明的一个方面,提供一种消息中间件消息获取方法,包括:

接收消息处理端发送的消息拉取请求,其中,所述消息拉取请求中包括目标消息位置;

获取消息队列的处理进度,其中,所述处理进度为当前操作之前消息队列的游标位置,处理进度之后的消息从未被获取过;

比较目标消息位置和处理进度;

若目标消息位置处于处理进度之后,则生成目标消息的消息处理状态信息,并将所述消息处理状态信息存储在消息处理状态缓存中;

将目标消息推送给消息处理端。

在本发明的一个实施例中,所述方法还包括:

在目标消息推送成功的情况下,将目标消息的消息处理状态信息修改为已拉取,并将目标消息的消息处理状态更新到消息处理状态信息缓存;

和/或,

在消息处理端处理成功、返回处理结果的情况下,将消息处理状态缓存中目标消息的消息处理状态信息删除。

在本发明的一个实施例中,所述目标消息位置处于签收进度之后,其中,消息队列的签收进度之后的消息为消息队列中尚未收到消息处理端返回处理成功结果的消息。

在本发明的一个实施例中,所述方法还包括:

若目标消息位置处于处理进度位置或处于处理进度之前,则判断消息处理状态缓存中是否存在目标消息的消息处理状态信息;

若消息处理状态缓存中不存在目标消息的消息处理状态信息,则将目标消息后的下一个消息作为新目标消息,针对新目标消息执行所述比较目标消息位置和处理进度的步骤。

在本发明的一个实施例中,所述方法还包括:

若消息处理状态缓存中存在目标消息的消息处理状态信息,则根据目标消息的消息处理状态信息对目标消息进行相应操作。

在本发明的一个实施例中,所述根据目标消息的消息处理状态信息对目标消息进行相应操作包括:

若目标消息的消息处理状态信息为未处理,则执行所述将目标消息推送给消息处理端的步骤;

若目标消息的消息处理状态信息为已拉取,则指示消息处理端对所述目标消息进行处理,并对目标消息后的下一个消息执行所述比较目标消息位置和处理进度的步骤。

根据本发明的另一方面,提供一种消息调度处理器,包括:

拉取请求接收模块,用于接收消息处理端发送的消息拉取请求,其中,所述消息拉取请求中包括目标消息位置;

处理进度获取模块,用于获取消息队列的处理进度,其中,所述处理进度为当前操作之前消息队列的游标位置,处理进度之后的消息从未被获取过;

比较模块,用于比较目标消息位置和处理进度;

状态消息生成模块,用于在目标消息位置处于处理进度之后的情况下,生成目标消息的消息处理状态信息,并将所述消息处理状态信息存储在消息处理状态缓存中;

消息推送模块,用于将目标消息推送给消息处理端。

在本发明的一个实施例中,所述消息调度处理器还包括:

状态消息修改模块,用于在目标消息推送成功的情况下,将目标消息的消息处理状态信息修改为已拉取,并将目标消息的消息处理状态更新到消息处理状态信息缓存;在消息处理端处理成功、返回处理结果的情况下,将消息处理状态缓存中目标消息的消息处理状态信息删除。

在本发明的一个实施例中,所述目标消息位置处于签收进度之后,其中,消息队列的签收进度之后的消息为消息队列中尚未收到消息处理端返回处理成功结果的消息。

在本发明的一个实施例中,所述消息调度处理器还包括:

状态消息查询模块,用于在目标消息位置处于处理进度位置或处于处理进度之前的情况下,判断消息处理状态缓存中是否存在目标消息的消息处理状态信息;在消息处理状态缓存中不存在目标消息的消息处理状态信息的情况下,将目标消息后的下一个消息作为新目标消息,指示比较模块针对新目标消息执行所述比较目标消息位置和处理进度的操作。

在本发明的一个实施例中,所述消息调度处理器还包括:

消息处理模块,用于在消息处理状态缓存中存在目标消息的消息处理状态信息的情况下,根据目标消息的消息处理状态信息对目标消息进行相应操作。

在本发明的一个实施例中,消息处理模块用于在目标消息的消息处理状态信息为未处理的情况下,指示消息推送模块执行所述将目标消息推送给消息处理端的操作;在目标消息的消息处理状态信息为已拉取的情况下,指示消息处理端对所述目标消息进行处理,并指示比较模块对目标消息后的下一个消息执行所述比较目标消息位置和处理进度的操作。

根据本发明的另一方面,提供一种消息中间件服务端,包括消息队列、消息处理状态缓存、以及如上述任一实施例所述的消息调度处理器。

根据本发明的另一方面,提供一种消息中间件消息获取系统,包括消息发送端、消息处理端、以及如上述任一实施例所述的消息中间件服务端。

在本发明的一个实施例中,所述消息中间件消息获取系统还包括:

管理查询系统,用于从所述消息中间件服务端查询目标消息的消息处理状态信息。

本发明通过在处理阶段完成时更新消息的状态,查询消息处理状态缓存中的消息处理状态,将处理状态符合的消息推送给对应消息处理端,避免了消息处理端进行不必要的消息获取。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为现有消息中间件消息获取方法的示意图。

图2为本发明消息中间件消息获取系统一个实施例的示意图。

图3为本发明消息中间件消息获取方法第二实施例的示意图。

图4为本发明消息中间件消息获取方法第三实施例的示意图。

图5为本发明消息中间件消息获取方法第四实施例的示意图。

图6为本发明消息调度处理器第一实施例的示意图。

图7为本发明消息调度处理器第二实施例的示意图。

图8为本发明一个实施例中消息队列的示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。以下对至少一个示例性实施例的描述实际上仅仅是说明性的,决不作为对本发明及其应用或使用的任何限制。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

除非另外具体说明,否则在这些实施例中阐述的部件和步骤的相对布置、数字表达式和数值不限制本发明的范围。

同时,应当明白,为了便于描述,附图中所示出的各个部分的尺寸并不是按照实际的比例关系绘制的。

对于相关领域普通技术人员已知的技术、方法和设备可能不作详细讨论,但在适当情况下,所述技术、方法和设备应当被视为授权说明书的一部分。

在这里示出和讨论的所有示例中,任何具体值应被解释为仅仅是示例性的,而不是作为限制。因此,示例性实施例的其它示例可以具有不同的值。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步讨论。

图2为本发明消息中间件消息获取系统一个实施例的示意图。如图2所示,所述消息中间件消息获取系统可以包括消息发送端100、消息处理端200和消息中间件服务端300,其中:

消息中间件服务端300可以包括消息队列310、消息处理状态缓存320、以及消息调度处理器330。

消息队列310,用于存储消息体。

在本发明一个实施例中,消息队列包括存储偏移量、处理进度和签收进度,其中,所述存储偏移量表示消息队列的长度;所述处理进度为当前操作之前消息队列的游标位置,处理进度表示已拉取消息的位置,处理进度之后的消息从未被获取过;签收进度表示已签收消息的位置,消息队列的签收进度之后的消息为消息队列中尚未收到消息处理端返回处理成功结果的消息。

图8为本发明一个实施例中消息队列的示意图。如图8所示的实施例中,所述消息队列的存储偏移量(storeoffset)为7,可以存储0、1、…、7共8个消息体。

如图8所示,所述消息队列的当前处理进度(pulloffset,拉取偏移量)为4,表示当前消息队列中0-4的消息体已经被拉取,即0-4的消息体已经成功推送到消息处理端;所述消息队列的当前签收进度(commitoffset,签收偏移量)为1,表示当前消息队列中0-1的消息体已经被消息处理端签收,即0-1的消息体已经被消息处理端成功处理,并且消息调度处理器已经收到消息处理端返回的处理结构。

消息处理状态缓存320,用于存储消息处理状态消息,其中消息处理状态信息以消息队列进行分组,以消息体的存储偏移量(即该消息的位置)为第一主键,附加以消息当前处理状态、消息获取时间戳、重试次数和下次处理时间戳等与消息处理相关信息,都以键值对的方式写入消息处理状态缓存320中。

在本发明一个实施例中,消息处理状态缓存320可以为高性能nosql(非关系型数据库)数据库。

消息调度处理器330,用于在消息处理端向服务端请求消息时,消息调度处理器生成消息处理状态信息,将消息处理相关的必要信息,以键值对的形式写入消息处理状态缓存;在消息处理端处理成功并返回结果后,将消息处理状态缓存中对应该消息的信息删除;在得到处理端拉取消息的请求时,消息调度处理器330判断消息的处理状态,将符合条件的消息投递给消息处理端200。

基于本发明上述实施例提供的消息中间件消息获取系统和消息中间件服务端,针对原有消息中间件将消息状态存储在各个处理端的问题,将消息处理状态存储在服务端上,状态和消息体分离开来;在处理阶段完成时更新消息的状态,同时在处理完成后将消息状态从消息处理状态缓存中删除,从而避免了消息处理端进行不必要的消息获取。

在本发明的一个实施例中,如图2所示,所述消息中间件消息获取系统还可以包括管理查询系统400:

管理查询系统400,用于从所述消息中间件服务端300的消息处理状态缓存320查询目标消息的消息处理状态信息。

本发明上述实施例通过将消息处理状态存储于高性能nosql数据库中,可以方便业务处理和运维人员对消息数据进行统计,方便掌控消息中间件当前的状态细节。

图2还给出了本发明消息中间件消息获取方法第一实施例的示意图。优选的,本实施例可由本发明消息中间件消息获取系统执行。该方法包括以下步骤:

步骤0,接收消息处理端发送的消息拉取请求,其中,所述消息拉取请求中包括目标消息位置;获取消息队列的处理进度,其中,所述处理进度为当前操作之前消息队列的游标位置,处理进度之后的消息从未被获取过;根据目标消息位置和消息队列的处理进度判断目标消息是否被处理过。若目标消息之前未被处理过,则执行步骤1;若目标消息之前被处理过,则执行步骤2。

步骤1,生成目标消息的消息处理状态信息,并将所述消息处理状态信息存储在消息处理状态缓存中;之后执行步骤3。

在本发明的一个实施例中,消息处理状态信息以消息队列进行分组,以消息体的存储偏移量为第一主键,附加以消息当前处理状态、消息获取时间戳、重试次数和下次处理时间戳等与消息处理相关信息,都以键值对的方式写入消息处理状态缓存320中。

步骤2,消息调度处理器从消息处理状态缓存获取目标消息相应的消息处理状态信息。

步骤3,消息调度处理器根据目标消息相应的消息处理状态信息,将符合条件的消息投递给消息处理端。

步骤4,消息处理端将处理结果返回给消息调度处理器。

步骤5,消息调度处理器根据所述处理结果,对目标消息相应的消息处理状态信息进行更新。

在本发明的一个实施例中,步骤5可以包括:在消息处理端处理成功并返回结果后,消息调度处理器将消息处理状态缓存中对应该消息的信息删除。

基于本发明上述实施例提供的消息中间件消息获取方法,针对原有消息中间件将消息状态存储在各个处理端的问题,将消息处理状态存储在服务端上,状态和消息体分离开来;在处理阶段完成时更新消息的状态,同时在处理完成后将消息状态从消息处理状态缓存中删除,从而避免了消息处理端进行不必要的消息获取。

本发明上述实施例通过将消息处理状态存储于高性能nosql数据库中,可以方便业务处理和运维人员对消息数据进行统计,方便掌控消息中间件当前的状态细节。

图3为本发明消息中间件消息获取方法第二实施例的示意图。优选的,本实施例可由本发明消息调度处理器执行。该方法包括以下步骤:

步骤301,接收消息处理端200发送的消息拉取请求,其中,所述消息拉取请求中包括目标消息位置。

步骤302,获取消息队列310的处理进度,其中,所述处理进度为当前操作之前消息队列310的游标位置,处理进度之后的消息从未被获取过。

步骤303,比较目标消息位置和处理进度。

步骤304,若目标消息位置处于处理进度之后,即,目标消息之前未被处理过,则生成目标消息的消息处理状态信息,并将所述消息处理状态信息存储在消息处理状态缓存320中。

步骤305,将目标消息推送给消息处理端200。

在本发明的一个实施例中,步骤305之后,所述方法还可以包括:在目标消息推送成功的情况下,将目标消息的消息处理状态信息修改为已拉取,并将目标消息的消息处理状态更新到消息处理状态信息缓存;和/或,在消息处理端200处理成功、返回处理结果的情况下,将消息处理状态缓存320中目标消息的消息处理状态信息删除。

本发明上述实施例将消息处理状态存储在中间件服务端上,处理状态和消息体分离开来;在处理阶段完成时更新消息的状态,同时在处理完成后将消息状态从消息处理状态缓存中删除,从而避免了消息处理端进行不必要的消息获取。

图4为本发明消息中间件消息获取方法第三实施例的示意图。优选的,本实施例可由本发明消息调度处理器执行。该方法包括以下步骤:

步骤401,消息调度处理器接收消息处理端200发送的消息拉取请求,其中,所述消息拉取请求中包括目标消息位置。

步骤402,消息调度处理器获取消息队列310的处理进度,其中,所述处理进度为当前操作之前消息队列310的游标位置,处理进度之后的消息从未被获取过。

步骤403,消息调度处理器比较目标消息位置和处理进度。若目标消息位置处于处理进度之后,即,目标消息之前未被处理过,则执行步骤404;否则,若目标消息位置处于处理进度位置或处于处理进度之前,即,目标消息之前被处理过,则执行步骤408。

在本发明的一个实施例中,所述目标消息位置处于签收进度之后,其中,消息队列的签收进度之后的消息为消息队列中尚未收到消息处理端返回处理成功结果的消息(即尚未被消息处理端成功签收的消息)。

步骤404,消息调度处理器生成目标消息的消息处理状态信息,并将所述消息处理状态信息存储在消息处理状态缓存320中。

步骤405,消息调度处理器将目标消息推送给消息处理端200。

步骤406,消息调度处理器接收消息处理端返回的处理结果。

步骤407,消息调度处理器根据所述处理结果,对目标消息相应的消息处理状态信息进行更新。

在本发明的一个实施例中,步骤407可以包括:在目标消息推送成功的情况下,将目标消息的消息处理状态信息修改为已拉取,并将目标消息的消息处理状态更新到消息处理状态信息缓存;和/或,在消息处理端200处理成功、返回处理结果的情况下,将消息处理状态缓存320中目标消息的消息处理状态信息删除。

步骤408,消息调度处理器判断消息处理状态缓存320中是否存在目标消息的消息处理状态信息。若消息处理状态缓存320中不存在目标消息的消息处理状态信息,则执行步骤409;否则,若消息处理状态缓存320中存在目标消息的消息处理状态信息,则执行步骤410。

步骤409,消息调度处理器跳过该目标消息,将该目标消息后的下一个消息作为新的目标消息,执行步骤403。

执行步骤410,消息调度处理器根据目标消息的消息处理状态信息对目标消息进行相应操作。

在本发明的一个实施例中,步骤410可以包括:若目标消息的消息处理状态信息为未处理,则执行步骤405;若目标消息的消息处理状态信息为已拉取,则指示消息处理端200对所述目标消息进行处理,之后执行步骤409。

本发明上述实施例将消息处理状态存储在中间件服务端上,处理状态和消息体分离开来;在处理阶段完成时更新消息的状态,同时在处理完成后将消息状态从消息处理状态缓存中删除,从而避免了消息处理端进行不必要的消息获取。

本发明上述实施例通过将消息处理状态存储于高性能nosql数据库中,可以方便业务处理和运维人员对消息数据进行统计,从而方便用户掌控消息中间件当前的状态细节。

图5为本发明消息中间件消息获取方法第四实施例的示意图。优选的,本实施例可由本发明消息调度处理器执行。该方法包括以下步骤:

步骤501,当消息需要重新处理时,消息调度处理器记录下重试操作前消息队列的游标位置,记为处理进度,处理进度之后的消息从未被获取过。

在本发明的一个实施例中,所述需要重新处理的消息指的是如图8所示的签收进度和处理进度之间的消息体,即已拉取但未签收的消息体。

步骤502,将消息队列游标重置至重试消息位置,以该位置为起始点进行消息批量获取,并且查询消息处理状态缓存中的消息处理状态。

步骤503,如若消息处理状态缓存中有对应状态信息,将其推送给对应消息处理端。

步骤504,如若没有在缓存中找到该消息处理状态信息,对比消息在消息队列中的位置和处理进度。

步骤505,如果比处理进度小则说明该消息已成功处理,消息调度处理器跳过该消息,避免了消息不必要的重复获取。

例如:当前处理进度为位置110,而之前的位置100处的消息未处理完毕,则重新处理时,需要从位置100处的消息开始,重新处理;判断位置100-109中每个消息是否有消息处理状态信息,若有,则对该消息进行相应处理;若没有,则掉过该消息,从而避免了该消息不必要的重复获取。

下面通过具体实施例对本发明上述实施例中消息调度处理器330的结构和功能进行进一步说明。

图6为本发明消息调度处理器第一实施例的示意图。如图6所示,图2实施例中的消息调度处理器330可以包括拉取请求接收模块331、处理进度获取模块332、比较模块333、状态消息生成模块334和消息推送模块335,其中:

拉取请求接收模块331,用于接收消息处理端200发送的消息拉取请求,其中,所述消息拉取请求中包括目标消息位置。

处理进度获取模块332,用于获取消息队列310的处理进度,其中,所述处理进度为当前操作之前消息队列310的游标位置,处理进度之后的消息从未被获取过。

比较模块333,用于比较目标消息位置和处理进度。

状态消息生成模块334,用于在比较模块333确定目标消息位置处于处理进度之后的情况下,生成目标消息的消息处理状态信息,并将所述消息处理状态信息存储在消息处理状态缓存320中。

在本发明的一个实施例中,消息处理状态信息以消息队列进行分组,以消息体的存储偏移量为第一主键,附加以消息当前处理状态、消息获取时间戳、重试次数和下次处理时间戳等与消息处理相关信息,都以键值对的方式写入消息处理状态缓存320中。

消息推送模块335,用于将目标消息推送给消息处理端200。

图7为本发明消息调度处理器第二实施例的示意图。与图6实施例相比,在图7实施例中,所述消息调度处理器还可以包括状态消息修改模块336,其中:

状态消息修改模块336,用于在目标消息推送成功的情况下,将目标消息的消息处理状态信息修改为已拉取,并将目标消息的消息处理状态更新到消息处理状态信息缓存;在消息处理端200处理成功、返回处理结果的情况下,将消息处理状态缓存320中目标消息的消息处理状态信息删除。

在本发明的一个实施例中,如图7所示,所述消息调度处理器330还可以包括状态消息查询模块337,其中:

状态消息查询模块337,用于在比较模块333确定目标消息位置处于处理进度位置或处于处理进度之前的情况下,判断消息处理状态缓存320中是否存在目标消息的消息处理状态信息;在消息处理状态缓存320中不存在目标消息的消息处理状态信息的情况下,将目标消息后的下一个消息作为新目标消息,指示比较模块333针对新目标消息执行所述比较目标消息位置和处理进度的操作。

在本发明的一个实施例中,所述目标消息位置处于签收进度之后,其中,消息队列的签收进度之后的消息为消息队列中尚未收到消息处理端返回处理成功结果的消息(即尚未被消息处理端成功签收的消息)。

在本发明的一个实施例中,如图7所示,所述消息调度处理器330还可以包括消息处理模块338,其中:

消息处理模块338,用于在消息处理状态缓存320中存在目标消息的消息处理状态信息的情况下,根据目标消息的消息处理状态信息对目标消息进行相应操作。

在本发明的一个实施例中,消息处理模块338具体可以用于在目标消息的消息处理状态信息为未处理的情况下,指示消息推送模块335执行所述将目标消息推送给消息处理端200的操作;在目标消息的消息处理状态信息为已拉取的情况下,指示消息处理端200对所述目标消息进行处理,并指示比较模块333对目标消息后的下一个消息执行所述比较目标消息位置和处理进度的操作。

基于本发明上述实施例提供的消息调度处理器,针对原有消息中间件将消息状态存储在各个处理端的问题,将消息处理状态存储在服务端上,状态和消息体分离开来;在处理阶段完成时更新消息的状态,同时在处理完成后将消息状态从消息处理状态缓存中删除,从而避免了消息处理端进行不必要的消息获取。

本发明上述实施例通过将消息处理状态存储于高性能nosql数据库中,可以方便业务处理和运维人员对消息数据进行统计,方便掌控消息中间件当前的状态细节。

在上面所描述的消息中间件服务端300和管理查询系统400可以实现为用于执行本申请所描述功能的通用处理器、可编程逻辑控制器(plc)、数字信号处理器(dsp)、专用集成电路(asic)、现场可编程门阵列(fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件或者其任意适当组合。

至此,已经详细描述了本发明。为了避免遮蔽本发明的构思,没有描述本领域所公知的一些细节。本领域技术人员根据上面的描述,完全可以明白如何实施这里公开的技术方案。

本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。

本发明的描述是为了示例和描述起见而给出的,而并不是无遗漏的或者将本发明限于所公开的形式。很多修改和变化对于本领域的普通技术人员而言是显然的。选择和描述实施例是为了更好说明本发明的原理和实际应用,并且使本领域的普通技术人员能够理解本发明从而设计适于特定用途的带有各种修改的各种实施例。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1