消息处理方法及其装置、电子设备及计算机可读介质与流程

文档序号:22436474发布日期:2020-10-02 10:29阅读:105来源:国知局
消息处理方法及其装置、电子设备及计算机可读介质与流程

本公开涉及数据库领域,更具体地,涉及一种消息处理方法及其装置,电子设备及计算机可读介质。



背景技术:

引入消息中间件,可以实现机房之间异构数据库的数据同步。具体地,可以在a机房部署消息的生产者,在b机房部署消息的消费者。生产者把消息发送到消息中间件的消息代理(例如broker)或broker组暂存起来,消费者从broker中获取消息以执行相应的业务逻辑。数据库的日志消息有先后顺序,且先后顺序不能打乱,即要求日志消息严格按照顺序进行发送和消费,否则会导致最终结果不一致。

相关技术提供了一些消息中间件,可以实现严格顺序消息的功能。例如,采用单个消息主题的消息分区(以下简称partition)的开源消息中间件kafka,消息分区中的消息以先进先出的方式进行消费,保证了消息的执行顺序。采用主-从(master-slave)结构方式的消息中间件jmq,一个消息队列分配两组以上的broker组,每个broker组由master-slave组成,消息的生产者和消费者各自具有独立的链表数据来动态记录各自的broker组,当有broker组宕机时会从发送链表中移除,若异常broker组的消息被消费完成,则从消费链表的表头删除。

然而,在实现本公开构思的过程中,发明人发现相关技术中至少存在如下问题:只有在broker处于宕机状态的情况下,才执行broker的切换,实现消息的生产者的高可用,而其他影响高可用的情形,如broker假死、broker性能下降以及broker与发送者网络分区,则无法实现broker的切换。

针对相关技术中的上述问题,目前还未提出有效的解决方案。



技术实现要素:

有鉴于此,本公开提供了一种消息处理方法及其装置,计算机系统及计算机可读介质。

本公开的一个方面提供了一种消息处理方法,应用于消息发送端,包括:响应于向指定中间件发送待发送消息的发送请求,获取上述指定中间件的多个消息分区,其中,上述指定中间件包括多个消息代理,每个消息代理包括至少一个消息分区,针对上述多个消息分区,检测是否存在消息序列号区间以获得第一检测结果,以及基于上述第一检测结果,从上述多个消息分区中选择第一目标消息分区,以将上述待发送消息发送至上述指定中间件。

根据本公开的实施例,上述基于上述第一检测结果,从上述多个消息分区中选择第一目标消息分区包括:基于上述第一检测结果,从上述多个消息分区中选择第一拟定消息分区,发送上述待发送消息至上述第一拟定消息分区以获得第一发送结果,以及基于上述第一发送结果,从上述多个消息分区中选择上述第一目标消息分区。

根据本公开的实施例,上述基于上述第一发送结果,从上述多个消息分区中选择上述第一目标消息分区包括:在上述第一发送结果指示未成功发送上述待发送消息至上述第一拟定消息分区的情况下,确定上述第一拟定消息分区的第一消息代理,从上述多个消息分区中选择除上述第一拟定消息分区之外的第二拟定消息分区,直到第二发送结果指示成功发送上述待发送消息至上述第二拟定消息分区,其中,上述第二拟定消息分区对应第二消息代理,且上述第二消息代理不同于上述第一消息代理,以及将选择的上述第二拟定消息分区作为上述第一目标消息分区。

根据本公开的实施例,上述基于上述第一检测结果,从上述多个消息分区中选择第一拟定消息分区包括:在上述第一检测结果指示不存在上述消息序列号区间的情况下,从上述多个消息分区中随机选择上述第一拟定消息分区。

根据本公开的实施例,上述基于上述第一检测结果,从上述多个消息分区中选择第一拟定消息分区包括:在上述第一检测结果指示存在多个上述消息序列号区间的情况下,在多个上述消息序列号区间中查找最大消息序列号,以及将与上述最大消息序列号对应的消息分区作为上述第一拟定消息分区。

根据本公开的实施例,上述方法还包括:基于上述第一目标消息分区,确定上述待发送消息对应的消息序列号,以及向注册中心发送上述第一目标消息分区和上述待发送消息的消息序列号,以使上述注册中心更新上述第一目标消息分区对应的消息序列号区间。

本公开的另一个方面提供了一种消息处理方法,应用于消息消费端,包括:响应于从指定中间件接收待消费消息的接收请求,获取上述指定中间件的多个消息分区,其中,上述指定中间件包括多个消息代理,每个消息代理包括至少一个消息分区,针对上述多个消息分区,检测是否存在消息序列号区间以获得第二检测结果,以及基于上述第二检测结果,从上述多个消息分区中选择第二目标消息分区,以从上述指定中间件接收上述待消费消息。

根据本公开的实施例,上述基于上述第二检测结果,从上述多个消息分区中选择第二目标消息分区包括:获取前一次接收待消费消息对应的第一消息序列号,基于上述第二检测结果,从上述多个消息分区中选择第三拟定消息分区,以获取上述第三拟定消息分区对应的第二消息序列号,检测上述第二消息序列号是否与上述第一消息序列号连续以获得第三检测结果,以及基于上述第三检测结果,从上述多个消息分区中选择上述第二目标消息分区。

根据本公开的实施例,上述基于上述第三检测结果,从上述多个消息分区中选择上述第二目标消息分区包括:在上述第三检测结果指示上述第二消息序列号与上述第一消息序列号不连续的情况下,从上述多个消息分区中查找与上述第一消息序列号连续的第三消息序列号,以及从上述多个消息分区中选择与上述第三消息序列号对应的消息分区作为上述第二目标消息分区。

根据本公开的实施例,上述基于上述第二检测结果,从上述多个消息分区中选择第三拟定消息分区包括:在上述第二检测结果指示存在多个上述消息序列号区间的情况下,在多个上述消息序列号区间中查找最小消息序列号,以及从上述多个消息分区中选择与上述最小消息序列号对应的消息分区作为上述第三拟定消息分区。

本公开的另一个方面提供了一种消息处理装置,应用于消息发送端,包括:第一获取模块,被配置为响应于向指定中间件发送待发送消息的发送请求,获取上述指定中间件的多个消息分区,其中,上述指定中间件包括多个消息代理,每个消息代理包括至少一个消息分区,第二获取模块,被配置为针对上述多个消息分区,检测是否存在消息序列号区间以获得第一检测结果,以及第一选择模块,被配置为基于上述第一检测结果,从上述多个消息分区中选择第一目标消息分区,以将上述待发送消息发送至上述指定中间件。

根据本公开的实施例,上述第一选择模块,包括:第一选择子模块,被配置为基于上述第一检测结果,从上述多个消息分区中选择第一拟定消息分区,发送子模块,被配置为发送上述待发送消息至上述第一拟定消息分区以获得第一发送结果,以及第二选择子模块,被配置为基于上述第一发送结果,从上述多个消息分区中选择上述第一目标消息分区。

根据本公开的实施例,上述第二选择子模块包括:确定单元,被配置为在上述第一发送结果指示未成功发送上述待发送消息至上述第一拟定消息分区的情况下,确定上述第一拟定消息分区的第一消息代理,第一选择单元,被配置为从上述多个消息分区中选择除上述第一拟定消息分区之外的第二拟定消息分区,直到第二发送结果指示成功发送上述待发送消息至上述第二拟定消息分区,其中,上述第二拟定消息分区对应第二消息代理,且上述第二消息代理不同于上述第一消息代理,以及第一处理单元,被配置为将选择的上述第二拟定消息分区作为上述第一目标消息分区。

根据本公开的实施例,上述第一选择子模块,包括第二选择单元,被配置为在上述第一检测结果指示不存在上述消息序列号区间的情况下,从上述多个消息分区中随机选择上述第一拟定消息分区。

根据本公开的实施例,上述第一选择子模块,包括第一查找单元,被配置为在上述第一检测结果指示存在多个上述消息序列号区间的情况下,在多个上述消息序列号区间中查找最大消息序列号,以及第二处理单元,被配置为将与上述最大消息序列号对应的消息分区作为上述第一拟定消息分区。

根据本公开的实施例,上述装置除了包括上述第一获取模块、第二获取模块以及第一选择模块之外,还包括确定模块,被配置为基于上述第一目标消息分区,确定上述待发送消息对应的消息序列号,以及发送模块,被配置为向注册中心发送上述第一目标消息分区和上述待发送消息的消息序列号,以使上述注册中心更新上述第一目标消息分区对应的消息序列号区间。

本公开的另一个方面提供了一种消息处理装置,应用于消息接收端,包括:第三获取模块,被配置为响应于从指定中间件接收待消费消息的接收请求,获取上述指定中间件的多个消息分区,其中,上述指定中间件包括多个消息代理,每个消息代理包括至少一个消息分区,第四获取模块,被配置为针对上述多个消息分区,检测是否存在消息序列号区间以获得第二检测结果,以及第二选择模块,被配置为基于上述第二检测结果,从上述多个消息分区中选择第二目标消息分区,以从上述指定中间件接收上述待消费消息。

根据本公开的实施例,上述第二选择模块包括:获取子模块,被配置为获取前一次接收待消费消息对应的第一消息序列号,第三选择子模块,被配置为基于上述第二检测结果,从上述多个消息分区中选择第三拟定消息分区,以获取上述第三拟定消息分区对应的第二消息序列号,检测子模块,被配置为检测上述第二消息序列号是否与上述第一消息序列号连续以获得第三检测结果,以及第四选择子模块,被配置为基于上述第三检测结果,从上述多个消息分区中选择上述第二目标消息分区。

根据本公开的实施例,上述第四选择子模块包括:第二查找单元,被配置为在上述第三检测结果指示上述第二消息序列号与上述第一消息序列号不连续的情况下,从上述多个消息分区中查找与上述第一消息序列号连续的第三消息序列号,以及第三选择单元,被配置为从上述多个消息分区中选择与上述第三消息序列号对应的消息分区作为上述第二目标消息分区。

根据本公开的实施例,上述第三选择子模块包括:第三查找单元,被配置为在上述第二检测结果指示存在多个上述消息序列号区间的情况下,在多个上述消息序列号区间中查找最小消息序列号,以及第三处理单元,被配置为从上述多个消息分区中选择与上述最小消息序列号对应的消息分区作为上述第三拟定消息分区。

本公开的另一方面提供了一种计算机可读存储介质,存储有计算机可执行指令,所述指令在被执行时用于实现如上所述的方法。

本公开的另一方面提供了一种电子设备,包括:一个或多个处理器;存储器,用于存储一个或多个程序,其中,当上述一个或多个程序被上述一个或多个处理器执行时,使得上述一个或多个处理器实现上述任一项的方法。

通过本公开的实施例,在消息发送端,针对指定中间件包括的多个消息分区,检测是否存在消息序列号区间以获得第一检测结果,并基于第一检测结果,从多个消息分区中选择第一目标消息分区,以将待发送消息发送至指定中间件,可以基于所有消息分区对应的消息序列号区间这一全局消息顺序的层面,确定把待发送消息发送到指定中间件的哪一个消息分区中,避免只有在消息代理处于宕机状态的情况下,才执行消息代理的切换,可以在消息代理宕机、假死、性能下降、网络分区等情况出现时做容错的同时,还可以保证消息发送的严格有序,实现消息发送端的高可用。相应地,在消息接收端,针对指定中间件包括的多个消息分区,检测是否存在消息序列号区间以获得第二检测结果,并基于第二检测结果,从多个消息分区中选择第二目标消息分区,以从指定中间件接收待消费消息,实现消息接收端的高可用。

附图说明

通过以下参照附图对本公开实施例的描述,本公开的上述以及其他目的、特征和优点将更为清楚,在附图中:

图1示意性示出了根据本公开实施例的消息处理方法的应用场景;

图2示意性示出了根据本公开实施例的应用于消息发送端的消息处理方法的流程图;

图3a示意性示出了根据本公开另一实施例的应用于消息发送端的消息处理方法的流程图;

图3b示意性示出了根据本公开另一实施例的应用于消息发送端的消息处理方法的流程图;

图3c示意性示出了根据本公开另一实施例的应用于消息发送端的消息处理方法的流程图;

图3d示意性示出了根据本公开实施例的应用于消息接收端的消息处理方法的流程图;

图3e示意性示出了根据本公开另一实施例的应用于消息接收端的消息处理方法的流程图;

图3f示意性示出了根据本公开另一实施例的应用于消息接收端的消息处理方法的流程图;

图3g示意性示出了相关技术的消息处理方法的总流程图;

图3h示意性示出了本公开实施例的消息处理方法的总流程图;

图4示意性示出了根据本公开实施例的应用于消息发送端的消息处理装置的框图;

图5示意性示出了根据本公开实施例的应用于消息接收端的消息处理装置的框图;以及

图6示意性示出了根据本公开实施例的适于实现消息处理方法和装置的计算机系统的方框图。

具体实施方式

以下,将参照附图来描述本公开的实施例。但是应该理解,这些描述只是示例性的,而并非要限制本公开的范围。在下面的详细描述中,为便于解释,阐述了许多具体的细节以提供对本公开实施例的全面理解。然而,明显地,一个或多个实施例在没有这些具体细节的情况下也可以被实施。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本公开的概念。

在此使用的术语仅仅是为了描述具体实施例,而并非意在限制本公开。在此使用的术语“包括”、“包含”等表明了特征、步骤、操作和/或部件的存在,但是并不排除存在或添加一个或多个其他特征、步骤、操作或部件。

在此使用的所有术语(包括技术和科学术语)具有本领域技术人员通常所理解的含义,除非另外定义。应注意,这里使用的术语应解释为具有与本说明书的上下文相一致的含义,而不应以理想化或过于刻板的方式来解释。

在使用类似于“a、b和c等中至少一个”这样的表述的情况下,一般来说应该按照本领域技术人员通常理解该表述的含义来予以解释(例如,“具有a、b和c中至少一个的系统”应包括但不限于单独具有a、单独具有b、单独具有c、具有a和b、具有a和c、具有b和c、和/或具有a、b、c的系统等)。在使用类似于“a、b或c等中至少一个”这样的表述的情况下,一般来说应该按照本领域技术人员通常理解该表述的含义来予以解释(例如,“具有a、b或c中至少一个的系统”应包括但不限于单独具有a、单独具有b、单独具有c、具有a和b、具有a和c、具有b和c、和/或具有a、b、c的系统等)。

在此先对本公开的上下文中所涉及到的术语做简要说明。

消息中间件:作为消息发送端和消息接收端之间的中转站,负责存储消息发送端发送过来的消息,并将其存储以等待消息接收端从中拉取消息消费。

消息代理:做为消息处理的代理端,是用于接收、保存、分发消息的应用,例如broker。在本公开中,每个消息代理均采用主-从(简称master-slave)模式,同步写入消息(消息允许重复),master-slave中的消息在逻辑上保持一致。在master-slave模式中,对消息的接收端提供服务的master宕机后,原本只对master起备份作用,不对消息的接收端提供服务的master-slave模式中的slave,可以变换角色,成为新的master,对消息的接收端提供服务。

消息标识:用于标识消息的类型,可以包括但不限于消息主题(topic),是消息中间件系统中的核心概念。消息发送端向“消息标识”中发送消息,消息接收端从“消息标识”中接收消息。可以根据业务场景,创建消息标识,为了区分不同业务,消息中间件以消息标识为基本单位对不同业务对应的“消息标识”进行组织管理,使得不同“消息标识”之间的消息相互独立,消息标识可以用一串英文字符表示。例如,在电商业务场景中,分别创建针对订单消息的“order”和针对物流消息的“logistics”这两个消息主题,消息发送端将订单消息发送到“order”,将物流消息发送到“logistics”。消息接收端根据自己的需要,从“order”和/或“logistics”中消费,以执行相应的业务逻辑。

消息分区(partition):用于实现消息标识的分布式管理,物理上可以把消息标识切分成一个或多个partition,每个partition在物理上对应一个文件夹,存储有该partition的索引消息和索引文件。每个分区都是一个有序的,不可变更的记录序列。每个消息标识的各个消息分区之间的并行的。可以在创建消息标识时,指定partition的数量,也可以在创建消息标识后,修改partition的数量。

本公开提供了一种消息处理方法,应用于消息发送端,包括:响应于向指定中间件发送待发送消息的发送请求,首先,获取指定中间件的多个消息分区,该指定中间件包括多个消息代理,且每个消息代理包括至少一个消息分区。然后,针对多个消息分区,检测是否存在消息序列号区间以获得第一检测结果。最后,基于第一检测结果,从多个消息分区中选择第一目标消息分区,以将待发送消息发送至指定中间件。在本公开中,基于消息序列号区间的检测结果,从多个消息分区中选择一个目标消息分区,可以使消息中间件的服务始终处于高可用的状态。

应用本公开提供的消息处理方法,可以在多个机房之间实现异构数据库数据的同步。图1示意性示出了根据本公开实施例的消息处理方法的应用场景100。需要注意的是,图1所示仅为可以应用本公开实施例的应用场景的示例,以帮助本领域技术人员理解本公开的技术内容,但并不意味着本公开实施例不可以用于其他设备、系统、环境或场景。

如图1所示,该应用场景100包括消息发送端101,消息中间件102,消息接收端103以及注册中心104。

消息中间件102包括2个消息代理,分别是broker1和broker2。其中,broker1包括partition1,broker2包括partition2。

注册中心104负责维护消息主题与broker之间的路由信息、消息主题与partition的信息以及partition与消息序列号区间的信息。消息发送端101和消息接收端103连接到注册中心104,可以获取到消息主题与broker之间的路由信息、消息主题与partition的信息以及partition与消息序列号区间的信息。

需要说明的是,在如2所示的应用场景中,消息中间件的数目,消息中间件包括的消息代理的数目以及消息代理包括的消息分区的数目,仅是示例性的,并不是对消息中间件的数目,消息中间件包括的消息代理的数目以及消息代理包括的消息分区的数目的限定。本公开可以应用在包含任意数目的消息中间件,消息代理以及消息分区的业务场景中。

首先,从消息发送端一侧,阐述本公开的技术实现过程。

图2示意性示出了根据本公开实施例的应用于消息发送端的消息处理方法的流程图。

如图2所示,该方法包括操作s210~操作s230。

在操作s210,响应于向指定中间件发送待发送消息的发送请求,获取指定中间件的多个消息分区。

在操作s220,针对多个消息分区,检测是否存在消息序列号区间以获得第一检测结果。

在操作s230,基于第一检测结果,从多个消息分区中选择第一目标消息分区,以将待发送消息发送至指定中间件。

根据本公开的实施例,消息中间件为每个主题维护分布式的消息分区,至少包括针对待发送消息的消息主题的消息中间件为指定消息中间件。例如,主题为“order”的待发送消息,若消息中间件包括针对订单消息的主题“order”和针对物流消息的主题“logistics”,则该消息中间件为指定消息中间件,消息发送端可以将待发送的订单消息发送到“order”,将待发送的物流消息发送到“logistics”。

因此,在消息发送端启动之后,向指定消息中间件发送待发送消息之前,需要为待发送消息指定将其发送到哪个消息代理对应的哪个消息分区,即从多个消息分区中选择一目标消息分区,将待发送消息发送至指定中间件的该目标消息分区。

可以理解,由于指定消息中间件包括任意多个消息分区,而每个消息分区都是一个有序的,不可改变的记录序列。按照时间先后的顺序,消息分区中的每条消息,可以分配到一个对应的单调递增的顺序序号,即消息序列号,该消息序列号可以唯一定位该消息分区中的一条消息,且随着消息的不断发送,可以根据消息序列号得出该消息分区的消息序列号区间。因此,获得各消息分区的消息序列号区间,可以确定个消息分区对应的消息发送情况,例如发送顺序序号的起始序号、当前序号。进而基于各消息分区的消息序列号区间,全局层面上掌握指定消息中间件中消息的分布情况。

本公开从消息分区的消息序列号层面,为待发送消息确定一目标消息分区,以发送到该目标消息分区。具体地,消息发送端可以先连接到注册中心,然后获取到待发送消息的主题与各消息代理之间的路由信息以及主题与多个消息分区的信息。然后检测是否存在消息序列号区间,基于第一检测结果,从多个消息分区中选择第一目标消息分区。

通过本公开的实施例,基于所有消息分区对应的消息序列号区间,确定把待发送消息发送到指定中间件的哪一个消息分区,避免由于基于对消息中间件中各消息代理运行状态的监控,而只有在消息代理处于宕机状态的情况下,才执行消息代理的切换,可以在消息代理宕机、假死、性能下降、网络分区等情况出现时做容错的同时,还可以在消息发送的全局顺序上,保证消息发送的严格有序,实现消息发送端的高可用,维持消息处理流程的健康有序运行。图3a示意性示出了根据本公开另一实施例的应用于消息发送端的消息处理方法的流程图。

如图3a所示,该方法可以包括如图2所示的操作s210~操作s230,其中,前述操作s230(基于第一检测结果,从多个消息分区中选择第一目标消息分区)可以包括操作s311~操作s313。

首先,在操作s311,基于第一检测结果,从多个消息分区中选择第一拟定消息分区。

具体地,针对多个消息分区,消息序列号区间的第一检测结果可以有以下三种。

第一种检测结果:第一检测结果指示不存在消息序列号区间。

第二种检测结果:第一检测结果指示存在一个消息序列号区间。

第三种检测结果:第一检测结果指示存在多个消息序列号区间。

作为一种可选的实施例,针对上述第一种检测结果,在第一检测结果指示不存在消息序列号区间的情况下,表明本次发送是第一次发送,前述操作s311(基于第一检测结果,从多个消息分区中选择第一拟定消息分区)可以包括:从多个消息分区中随机选择一拟定消息分区。

作为一种可选的实施例,针对上述第二种检测结果,在第一检测结果指示存在一个消息序列号区间的情况下,表明本次发送不是第一次发送,前述操作s311(基于第一检测结果,从多个消息分区中选择第一拟定消息分区)可以包括:将该消息序列号区间对应的消息分区作为第一拟定消息分区。

作为一种可选的实施例,针对上述第三种检测结果,在第一检测结果指示存在多个消息序列号区间的情况下,表明本次发送不是第一次发送,前述操作s311(基于第一检测结果,从多个消息分区中选择第一拟定消息分区)可以包括:在多个消息序列号区间中查找最大消息序列号,并将与最大消息序列号对应的消息分区作为第一拟定消息分区。

例如,若检测到存在3个消息序列号区间,分别是[0,2]、[2,4]和[4,6],最大消息序列号为6。若消息分区1对应消息序列号区间[0,2],消息分区2对应消息序列号区间[2,4],消息分区3对应消息序列号区间[4,6],则可以将最大消息序列号6对应的消息分区3作为第一拟定消息分区。

在从多个消息分区中选择出第一拟定消息分区之后,还可以检测是否能够将待发送消息发送到第一拟定消息分区。

接着,在操作s312,发送待发送消息至第一拟定消息分区以获得第一发送结果。最后,在操作s313,基于第一发送结果,从多个消息分区中选择第一目标消息分区。

具体地,将待发送消息发送至第一拟定消息分区,可以获得以下两种第一发送结果。

第一种发送结果:未成功发送待发送消息至第一拟定消息分区。

第二种发送结果:已成功发送待发送消息至第一拟定消息分区。

针对第一种发送结果,图3b示意性示出了根据本公开另一实施例的应用于消息发送端的消息处理方法的流程图。

如图3b所示,在第一发送结果指示未成功发送待发送消息至第一拟定消息分区的情况下,前述操作s313可以包括操作s321~操作s323。

首先,在操作s321,确定第一拟定消息分区的第一消息代理。

其次,在操作s322,从多个消息分区中选择除第一拟定消息分区之外的第二拟定消息分区,直到第二发送结果指示成功发送待发送消息至第二拟定消息分区。其中,第二拟定消息分区对应第二消息代理,且第二消息代理不同于第一消息代理。

最后,在操作s323,将选择的第二拟定消息分区作为第一目标消息分区。

可以理解,若待发送消息发送至第一拟定消息分区的发送失败,则说明第一拟定消息分区所在的第一消息代理处于异常状态,是不可用的。为了维持消息发送端的高可用性,可以从处于正常可用状态的其他消息代理中选择消息分区,本公开提供以下两种选择方式。

第一种选择方式:可以在发送失败之后,立即直接向注册中心汇报该第一拟定消息分区与上一个消息序列号。并基于从注册中心重新获取到的消息主题与消息分区的信息,从与第一拟定消息分区对应的第一消息代理不同的第二消息代理中选择第二拟定消息分区,并尝试与重新选中的第二拟定消息分区所在的第二消息代理建立连接。若连接不成功,则可以在除第一消息代理和第二消息代理之外的其他消息代理中,选择其他拟定消息分区。再次尝试与其他拟定消息分区建立连接,在建立连接成功的时,检测是否可以将待发送消息发送成功,若成功,则可以将其他拟定消息分区作为目标消息分区。若不成功,则继续选择,直到选择出可以成功发送待发送消息的消息分区为止。

第二种选择方式:首先,尝试重新发送待发送消息一次或者重复发送多次,若重复发送的次数超过重试次数的上限时还是发送失败,再执行上述第一种选择方式。需要说明的是,在待发送消息未发送成功的情况下,本领域技术人员可以依据业务场景的实际需要自行选择第一种选择方式或第二种选择方式。

需要说明的是,待发送消息发送失败的原因可以包括但不限于消息代理端宕机、消息代理端假死、消息代理端性能下降、消息代理端与消息发送端网络分区等情况导致的发送超时。

针对第二种发送结果,若第一发送结果指示已成功发送待发送消息至第一拟定消息分区,则可以将第一拟定消息分区作为目标消息分区。

通过本公开的实施例,在待发送消息未发送成功至第一拟定消息分区的情况下,本公开提供两种选择方式,从多个消息分区中选择除第一拟定消息分区之外的第二消息分区,直到待发送消息成功发送至第二拟定消息分区为止,将第二拟定消息分区对应的第二消息代理作为目标消息分区,有助于消息服务处于高可用的状态。

需要说明的是,在选择出待发送消息发送的目标消息分区之后,为了维护消息发送的全局顺序,还可以为本次发送消息设置消息序列号。具体地,可以暂存目标消息分区对应的消息序列号的值为当前消息的消息序列号,在有消息发送任务的情况下,自增当前消息的消息序列号,可以得到本次消息发送任务所对应的消息序列号。

根据本公开的实施例,在待发送消息的发送阶段,消息发送端将与目标消息分区所在的消息代理建立连接,连接成功的情况下自增当前消息的消息序列号,可以得到本次消息发送任务所对应的消息序列号,将待发送消息发送到目标消息分区所在的消息代理。

图3c示意性示出了根据本公开另一实施例的应用于消息发送端的消息处理方法的流程图。

如图3c所示,该方法除了可以包括前述操作s210~操作s230之外,还可以包括操作s331和操作s332。

在操作s331,基于第一目标消息分区,确定待发送消息对应的消息序列号。

在操作s332,向注册中心发送第一目标消息分区和待发送消息的消息序列号,以使注册中心更新第一目标消息分区对应的消息序列号区间。

针对上述第一种检测结果,作为一种可选的实施例,在第一检测结果指示不存在消息序列号区间的情况下,表明本次是第一次发送消息,在从多个消息分区中随机选择一拟定消息分区的情况下,将待发送消息的消息序列号设置为0,并立即向注册中心汇报该消息序列号。

针对上述第二种检测结果,作为一种可选的实施例,在第一检测结果指示存在一个消息序列号区间的情况下,将该具有消息序列号区间的消息分区作为第一拟定消息分区,并获取消息序列号区间中的最大消息序列号,自增该最大消息序列号,为待发送消息设置对应的消息序列号。

例如,若检测到1个消息序列号区间[0,2],则获取最大消息序列号为2,自增可以得到待发送消息对应的消息序列号为3,并立即向注册中心汇报该消息序列号。

针对上述第三种检测结果,作为一种可选的实施例,在第一检测结果指示存在多个消息序列号区间的情况下,表明本次不是第一次发送消息,在将与最大消息序列号对应的消息分区作为第一拟定消息分区的情况下,自增该最大消息序列号,为待发送消息设置对应的消息序列号。

例如,若检测到3个消息序列号区间[0,2]、[2,4]和[4,6],则可以获取最大消息序列号为6,自增可以得到待发送消息对应的消息序列号为7,并立即向注册中心汇报该消息序列号。

通过本公开的实施例,在有消息发送任务时,将消息发送任务对应的消息序列号发送给注册中心,实时更新注册中心的维护信息,为消息发送端提供准确的数据支持,维护消息全局顺序,有利于支持故障容错的全局顺序消息实现方案。

接下来,从消息接收端一侧,阐述本公开的技术实现过程。

图3d示意性示出了根据本公开实施例的应用于消息接收端的消息处理方法的流程图。

如图3d所示,该方法可以包括操作s341~操作s343。

在操作s341,响应于从指定中间件接收待消费消息的接收请求,获取指定中间件的多个消息分区。

消息接收端可以先连接到注册中心,然后获取到消息的主题与各消息代理之间的路由信息、主题与多个消息分区的信息以及各消息分区与消息序列号区间的信息。

在操作s342,针对多个消息分区,检测是否存在消息序列号区间以获得第二检测结果。

在操作s343,基于第二检测结果,从多个消息分区中选择第二目标消息分区,以从指定中间件接收待消费消息。

具体地,在消息接收端,针对多个消息分区,消息序列号区间的第二检测结果可以有以下三种。

第一种检测结果:第二检测结果指示不存在消息序列号区间。

第二种检测结果:第二检测结果指示存在一个消息序列号区间。

第三种检测结果:第二检测结果指示存在多个消息序列号区间。

针对上述第一种检测结果,作为一种可选的实施例,在第二检测结果指示不存在消息序列号区间的情况下,表明指定消息中间件中不存在可以消费的消息,无法消费,导致本次消费失败。

针对上述第二种检测结果,作为一种可选的实施例,在第二检测结果指示存在一个消息序列号区间的情况下,表明指定消息中间件存在一条可以消费的消息,选择该消息序列号区间对应的消息分区作为第二目标消息分区,拉取第二目标消息分区中的消息,以从指定中间件接收待消费消息。

针对上述第三种检测结果,作为一种可选的实施例,在第二检测结果指示存在多个消息序列号区间的情况下,表明指定消息中间件存在多条可以消费的消息,提供以下方式从多个消息分区中选择第二目标消息分区。

通过本公开的实施例,在消息接收端一侧,针对指定中间件包括的多个消息分区,检测是否存在消息序列号区间以获得第二检测结果,并基于第二检测结果,从多个消息分区中选择第二目标消息分区,以从指定中间件接收待消费消息,可以实现在全局顺序上,实现消息消费的有序性。

图3e示意性示出了根据本公开另一实施例的应用于消息接收端的消息处理方法的流程图。

如图3e所示,前述操作s343(基于第二检测结果,从多个消息分区中选择第二目标消息分区)可以包括操作s351~操作s354。

在操作s351,获取前一次接收待消费消息对应的第一消息序列号。

在操作s352,基于第二检测结果,从多个消息分区中选择第三拟定消息分区,以获取第三拟定消息分区对应的第二消息序列号。

作为一种可选的实施例,前述操作s352(基于第二检测结果,从多个消息分区中选择第三拟定消息分区)可以包括:在第二检测结果指示存在多个消息序列号区间的情况下,在多个消息序列号区间中查找最小消息序列号,并从多个消息分区中选择与最小消息序列号对应的消息分区作为第三拟定消息分区。

为了保证消息消费的全局顺序性,可以在操作s353,检测第二消息序列号是否与第一消息序列号连续以获得第三检测结果。在操作s354,基于第三检测结果,从多个消息分区中选择第二目标消息分区。

具体地,在消息接收端,第一消息序列号和第二消息序列号是否连续的第三检测结果可以有以下两种。

第一种检测结果:两者连续。

第二种检测结果:两者不连续。

可以理解,在正常情况下,第二消息序列号与第一消息序列号是连续的。因此,针对第一种检测结果,将从第二消息序列号对应的第三拟定消息分区中拉取消息,将拉取到的消息派发给消费线程进行消费,消费成功则向消息中间件发送确认信息,如果消费失败则一直尝试消费此消息,直到消费成功。

针对第二种检测结果,图3f示意性示出了根据本公开另一实施例的应用于消息接收端的消息处理方法的流程图。

如图3f所示,在第三检测结果指示第二消息序列号与第一消息序列号不连续的情况下,前述操作s354(基于第三检测结果,从多个消息分区中选择第二目标消息分区)可以包括操作s361和操作s362。

在操作s361,从多个消息分区中查找与第一消息序列号连续的第三消息序列号。

在操作s362,从多个消息分区中选择与第三消息序列号对应的消息分区作为第二目标消息分区。

可以理解,在异常情况下,第二消息序列号与第一消息序列号是不连续的。因此,针对第二种检测结果,将断开当前与第三拟定消息分区所在的消息代理之间的连接,并连接到注册中心,从中获取消息分区与消息序列号区间的信息,从多个消息分区中查找与第一消息序列号连续的第三消息序列号,并连接第三消息序列号对应的消息分区作为第二目标消息分区,从第二目标消息分区对应的消息代理中拉取消息,将拉取到的消息派发给消费线程进行消费,消费成功则向消息中间件发送确认信息,循环持续执行上述从消息代理拉取消息分区的消费操作,直到消息接收端停止消费。

通过本公开的实施例,在消息接收端一侧,在消费出现异常(检测到获取的最小消息序列号和上一个消息序列号不连续)的情况下,从多个消息分区中查找与第一消息序列号连续的第三消息序列号,并连接第三消息序列号对应的消息分区所在的消息代理进行消息的消费,可以在全局顺序上,实现消息消费的有序性,维持消息处理系统的健康有序运行。

图3g示意性示出了相关技术的消息处理方法的总流程图。

如图3g所示,相关技术的消息处理方法采用master-slave结构方式,同步写入消息(消息允许重复),master-slave上的消息在逻辑上保持一致。slave在master宕机后不接受发送请求,但可以进行消费;一个消息队列分配两组以上的broker组(一个broker组由master-slave组成),broker组的集群信息在协调者上保存为一个单向的链表,消费者和发送者各有一份独立的链表数据。有消息的broker组按照受理发送请求的先后顺序保存在消费者对应的链表上,消费者只能从链表表头的broker组上消费,当broker组上的消息全部消费完,且不为当前受理发送请求的broker组则从消息链表中移除;没有积压消息的broker组才能被添加到发送链表的表尾,当有broker组发生故障时会从broker组中移除,移除的broker组必须保证没有积压消息后才能被添加回链表;只有发送链表表头的broker组才能接受发送请求,同时新切换为受理发送请求的broker组会添加到消费链表的表尾。

消息链表中各broker组的移除和添加遵循以下规则:当broker组有机器宕机时,则将宕机的broker组从发送链表中移除。当新broker组被挑选为当前发送者,则把该组broker添加到消费链表的表尾。当异常broker组的消息消费完成后,则从消费链表表头移除。当broker组机器都恢复正常,且没有可以消费的消息则添加到发送链表的表尾。

图3h示意性示出了本公开实施例的消息处理方法的总流程图。

如图3h所示,结合图1中消息主题配置的消息分区和消息中间件中部署的broker的对应关系可知,broker1配置有partition1,broker2配置有partition2,消息发送端严格按照先parttition1后partition2的顺序执行消息的发送。

在消息发送端,向broker1发送partition1失败,说明broker1处于异常状态,是不可用的,将执行上述操作s312,消息发送端将选择除partition1之外的partition2,向broker2发送partition2。同时通知注册中心更新partition1的序号区间,新增partition2序号区间。消息发送端将不断的向broker1或者向其他的broker发送partition1,直到消息主题的所有消息分区都发送成功为止。

在消息接收端,严格按照先partition1后partition2的顺序执行消息的消费。在消费完partition1之后,通知注册中心消费完partition1区间,并切换到partition2,以实现对partition2的消费。

通过本公开的实施例,在消息发送端一侧,在确定发送消息的内容以及当前消息的消息序号时,不是基于对消息中间件中各消息代理端运行状态的监控,以在某一消息代理端宕机时,切换到其他消息代理端,而是基于与消息主题相关的每个消息分区,从所有消息分区对应的发送状态这一全局消息的层面,设置当前发送的消息内容,从所有消息分区对应的消息序列号区间这一全局消息顺序的层面,设置当前消息的消息序号,可以在全局顺序上,实现消息发送的有序性,同时实现消息发送端的高可用,维持消息处理流程的健康有序运行。

在消息接收端一侧,在存在多个消息序列号区间的情况下,获取最小消息序列号以及最小消息序列号对应的第三消息分区,与第三消息分区所属的第三消息代理端建立连接并从中拉取第三消息分区,从所有消息序列号这一全局消息顺序的层面,确定拉取的消息内容,可以实现在全局顺序上,实现消息消费的有序性。

图4示意性示出了根据本公开实施例的应用于消息发送端的消息处理装置的框图。

如图4所示,该消息处理装置400包括第一获取模块410、第二获取模块420以及第一选择模块430。其中:

第一获取模块410,被配置为执行例如前述操作s210,响应于向指定中间件发送待发送消息的发送请求,获取指定中间件的多个消息分区。

第二获取模块420,被配置为执行例如前述操作s220,针对多个消息分区,检测是否存在消息序列号区间以获得第一检测结果。

第一选择模块430,被配置为执行例如前述操作s230,基于第一检测结果,从多个消息分区中选择第一目标消息分区,以将待发送消息发送至指定中间件。

根据本公开的实施例,上述第一选择模块,包括:第一选择子模块,被配置为基于上述第一检测结果,从上述多个消息分区中选择第一拟定消息分区,发送子模块,被配置为发送上述待发送消息至上述第一拟定消息分区以获得第一发送结果,以及第二选择子模块,被配置为基于上述第一发送结果,从上述多个消息分区中选择上述第一目标消息分区。

根据本公开的实施例,上述第二选择子模块包括:确定单元,被配置为在上述第一发送结果指示未成功发送上述待发送消息至上述第一拟定消息分区的情况下,确定上述第一拟定消息分区的第一消息代理,第一选择单元,被配置为从上述多个消息分区中选择除上述第一拟定消息分区之外的第二拟定消息分区,直到第二发送结果指示成功发送上述待发送消息至上述第二拟定消息分区,其中,上述第二拟定消息分区对应第二消息代理,且上述第二消息代理不同于上述第一消息代理,以及第一处理单元,被配置为将选择的上述第二拟定消息分区作为上述第一目标消息分区。

根据本公开的实施例,上述第一选择子模块,包括第二选择单元,被配置为在上述第一检测结果指示不存在上述消息序列号区间的情况下,从上述多个消息分区中随机选择上述第一拟定消息分区。

根据本公开的实施例,上述第一选择子模块,包括第一查找单元,被配置为在上述第一检测结果指示存在多个上述消息序列号区间的情况下,在多个上述消息序列号区间中查找最大消息序列号,以及第二处理单元,被配置为将与上述最大消息序列号对应的消息分区作为上述第一拟定消息分区。

根据本公开的实施例,上述装置除了包括上述第一获取模块、第二获取模块以及第一选择模块之外,还包括确定模块,被配置为基于上述第一目标消息分区,确定上述待发送消息对应的消息序列号,以及发送模块,被配置为向注册中心发送上述第一目标消息分区和上述待发送消息的消息序列号,以使上述注册中心更新上述第一目标消息分区对应的消息序列号区间。

图5示意性示出了根据本公开实施例的应用于消息接收端的消息处理装置的框图。

如图5所示,该消息处理装置500包括第三获取模块510、第四获取模块520以及第二选择模块530。其中:

第三获取模块510,被配置为执行例如前述操作s341,响应于从指定中间件接收待消费消息的接收请求,获取指定中间件的多个消息分区。

第四获取模块520,被配置为执行例如前述操作s342,针对多个消息分区,检测是否存在消息序列号区间以获得第二检测结果。

第二选择模块530,被配置为执行例如前述操作s343,基于第二检测结果,从多个消息分区中选择第二目标消息分区,以从指定中间件接收待消费消息。

根据本公开的实施例,上述第二选择模块包括:获取子模块,被配置为获取前一次接收待消费消息对应的第一消息序列号,第三选择子模块,被配置为基于上述第二检测结果,从上述多个消息分区中选择第三拟定消息分区,以获取上述第三拟定消息分区对应的第二消息序列号,检测子模块,被配置为检测上述第二消息序列号是否与上述第一消息序列号连续以获得第三检测结果,以及第四选择子模块,被配置为基于上述第三检测结果,从上述多个消息分区中选择上述第二目标消息分区。

根据本公开的实施例,上述第四选择子模块包括:第二查找单元,被配置为在上述第三检测结果指示上述第二消息序列号与上述第一消息序列号不连续的情况下,从上述多个消息分区中查找与上述第一消息序列号连续的第三消息序列号,以及第三选择单元,被配置为从上述多个消息分区中选择与上述第三消息序列号对应的消息分区作为上述第二目标消息分区。

根据本公开的实施例,上述第三选择子模块包括:第三查找单元,被配置为在上述第二检测结果指示存在多个上述消息序列号区间的情况下,在多个上述消息序列号区间中查找最小消息序列号,以及第三处理单元,被配置为从上述多个消息分区中选择与上述最小消息序列号对应的消息分区作为上述第三拟定消息分区。

根据本公开的实施例的模块、子模块、单元中的任意多个、或其中任意多个的至少部分功能可以在一个模块中实现。根据本公开实施例的模块、子模块、单元中的任意一个或多个可以被拆分成多个模块来实现。根据本公开实施例的模块、子模块、单元中的任意一个或多个可以至少被部分地实现为硬件电路,例如现场可编程门阵列(fpga)、可编程逻辑阵列(pla)、片上系统、基板上的系统、封装上的系统、专用集成电路(asic),或可以通过对电路进行集成或封装的任何其他的合理方式的硬件或固件来实现,或以软件、硬件以及固件三种实现方式中任意一种或以其中任意几种的适当组合来实现。或者,根据本公开实施例的模块、子模块、单元中的一个或多个可以至少被部分地实现为计算机程序模块,当该计算机程序模块被运行时,可以执行相应的功能。

例如,第一获取模块410、第二获取模块420、第一选择模块430、确定模块、发送模块、第一选择子模块、发送子模块、第二选择子模块、第二选择子模块、确定单元、第一选择单元、第一处理单元、第二选择单元、第一查找单元、第二处理单元中的任意多个可以合并在一个模块中实现,或者其中的任意一个模块可以被拆分成多个模块。或者,这些模块中的一个或多个模块的至少部分功能可以与其他模块的至少部分功能相结合,并在一个模块中实现。根据本公开的实施例,第一获取模块410、第二获取模块420、第一选择模块430、确定模块、发送模块、第一选择子模块、发送子模块、第二选择子模块、第二选择子模块、确定单元、第一选择单元、第一处理单元、第二选择单元、第一查找单元、第二处理单元中的至少一个可以至少被部分地实现为硬件电路,例如现场可编程门阵列(fpga)、可编程逻辑阵列(pla)、片上系统、基板上的系统、封装上的系统、专用集成电路(asic),或可以通过对电路进行集成或封装的任何其他的合理方式等硬件或固件来实现,或以软件、硬件以及固件三种实现方式中任意一种或以其中任意几种的适当组合来实现。或者,第一获取模块410、第二获取模块420、第一选择模块430、确定模块、发送模块、第一选择子模块、发送子模块、第二选择子模块、第二选择子模块、确定单元、第一选择单元、第一处理单元、第二选择单元、第一查找单元、第二处理单元中的至少一个可以至少被部分地实现为计算机程序模块,当该计算机程序模块被运行时,可以执行相应的功能。

图6示意性示出了根据本公开实施例的适于实现路径规划方法的计算机系统的方框图。图6示出的计算机系统仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。

如图6所示,根据本公开实施例的计算机系统600包括处理器601,其可以根据存储在只读存储器(rom)602中的程序或者从存储部分608加载到随机防问存储器(ram)603中的程序而执行各种适当的动作和处理。处理器601例如可以包括通用微处理器(例如cpu)、指令集处理器和/或相关芯片组和/或专用微处理器(例如,专用集成电路(asic)),等等。处理器601还可以包括用于缓存用途的板载存储器。处理器601可以包括用于执行根据本公开实施例的方法流程的不同动作的单一处理单元或者是多个处理单元。

在ram603中,存储有系统600操作所需的各种程序和数据。处理器601、rom602以及ram603通过总线604彼此相连。处理器601通过执行rom602和/或ram603中的程序来执行根据本公开实施例的方法流程的各种操作。需要注意,所述程序也可以存储在除rom602和ram603以外的一个或多个存储器中。处理器601也可以通过执行存储在所述一个或多个存储器中的程序来执行根据本公开实施例的方法流程的各种操作。

根据本公开的实施例,系统600还可以包括输入/输出(i/o)接口605,输入/输出(i/o)接口605也连接至总线604。系统600还可以包括连接至i/o接口605的以下部件中的一项或多项:包括键盘、鼠标等的输入部分606;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分607;包括硬盘等的存储部分608;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分609。通信部分609经由诸如因特网的网络执行通信处理。驱动器610也根据需要连接至i/o接口605。可拆卸介质611,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器610上,以便于从其上读出的计算机程序根据需要被安装入存储部分608。

根据本公开的实施例,根据本公开实施例的方法流程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读存储介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分609从网络上被下载和安装,和/或从可拆卸介质611被安装。在该计算机程序被处理器601执行时,执行本公开实施例的系统中限定的上述功能。根据本公开的实施例,上文描述的系统、设备、装置、模块、单元等可以通过计算机程序模块来实现。

本公开还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中描述的设备/装置/系统中所包含的;也可以是单独存在,而未装配入该设备/装置/系统中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或者多个程序被执行时,实现根据本公开实施例的方法。

根据本公开的实施例,计算机可读存储介质可以是非易失性的计算机可读存储介质,例如可以包括但不限于:便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。例如,根据本公开的实施例,计算机可读存储介质可以包括上文描述的rom602和/或ram603和/或rom602和ram603以外的一个或多个存储器。

附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

本领域技术人员可以理解,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合,即使这样的组合或结合没有明确记载于本公开中。特别地,在不脱离本公开精神和教导的情况下,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合。所有这些组合和/或结合均落入本公开的范围。

以上对本公开的实施例进行了描述。但是,这些实施例仅仅是为了说明的目的,而并非为了限制本公开的范围。尽管在以上分别描述了各实施例,但是这并不意味着各个实施例中的措施不能有利地结合使用。本公开的范围由所附权利要求及其等同物限定。不脱离本公开的范围,本领域技术人员可以做出多种替代和修改,这些替代和修改都应落在本公开的范围之内。

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