掌桥专利:专业的专利平台
掌桥专利
首页

消息集群平滑迁移的方法及系统

文献发布时间:2023-06-19 12:14:58


消息集群平滑迁移的方法及系统

技术领域

本发明涉及互联网技术领域,尤其涉及一种消息集群平滑迁移的方法及系统。

背景技术

消息系统集群的迁移过程通常包括元数据重建、数据迁移以及客户端连接的切换。对于同构的消息系统集群,如Kafka集群来说,官方虽然提供可Kafka MirrorMaker服务辅助迁移,但由于官方文档长久未更新,因此新版Kafka为MirrorMaker增加的一些参数、特性等在文档上往往找不到,需要翻阅源码深入研究,因此迁移使用方式不够灵活,且没能提供客户端连接切换的功能;在RocketMQ集群中更是没有提供相关的集群迁移配套组件;而在RabbitMQ中,虽然有提供类似Federation和Shovel等插件协助实施集群迁移,但更多的是侧重元数据及消息数据迁移,而且实施中通常存在消息丢失的问题,另外,由于做集群迁移多半是由于原RabbitMQ集群面临比较严重的性能问题,而这些插件需要停机安装并重启,不仅影响业务的连续性而且会给当前集群增加资源负担,往往雪上加霜。对于异构的消息系统集群来说,现有技术中也极少有相关的迁移方案,一般都是由工程师直接修改系统代码做离线迁移,并对两种不同种类的消息集群做好特性的兼容。

可见,现有技术中的消息系统集群迁移方案,不仅操作复杂,而且不能实现客户端连接的平滑切换,用户体验不佳。

发明内容

本发明的目的在于提供一种消息集群平滑迁移的方法及系统,解决了集群迁移过程中客户端连接不能平滑切换的问题。

为了实现上述目的,本发明的第一方面提供一种消息集群平滑迁移的方法,包括:

获取消费者应用和生产者应用迁移前所连接的原始集群以及迁移后所连接的目标集群;

由消费者应用根据目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程并与目标集群连接,且生产者应用从向原始集群生产消息切换为向目标集群生产消息;

当消费者应用监测到原始集群无消息堆积且无新消息进入时切换至目标集群消费消息。

优选地,在获取消费者应用和生产者应用迁移前所连接的原始集群以及迁移后所连接的目标集群之前还包括:

消费者应用根据原始集群中消费者线程的开关状态建立与原始集群一一对应的原始消费者线程并连接原始集群。

优选地,由消费者应用根据目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程并与目标集群连接的方法包括:

消费者应用从上线文环境中读取目标集群中消费者应用开关状态;

当消费者应用开关状态为打开且加载了目标集群的配置项时,消费者应用基于目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程;

将每个目标消费者线程一一对应的与目标集群链接。

较佳地,所述消费者应用和所述生产者应用均集成了原始集群和目标集群对应的SDK插件,所述SDK插件具有对原始集群和/或目标集群的单读或多读功能;

所述单读或多读的功能依赖于原始集群或目标集群中消费者应用开关状态。

进一步地,生产者应用从向原始集群生产消息切换为向目标集群生产消息的方法包括:

当消费者应用建立了目标消费者线程并与目标集群一一对应连接成功的同时,将原始集群中生产者应用开关的状态切换为关闭,以及将目标集群中生产者应用开关的状态切换为开启;

生产者应用断开与原始集群的连接切换至与目标集群连接。

优选地,当消费者应用监测到原始集群无消息堆积且无新消息进入时切换至目标集群消费消息的方法包括:

通过消费者应用实时监测原始集群的消息堆积情况以及新消息进入情况,当原始集群无消息堆积且无新消息进入时,将原始集群中消费者应用开关的状态切换为关闭,且继续保持目标集群中消费者应用开关的状态为开启。

示例性地,所述原始集群为Kafka、RocketMQ、RabbitMQ中的一个或多个,所述目标集群为Kafka、RocketMQ、RabbitMQ中的一个或多个。

与现有技术相比,本发明提供的消息集群平滑迁移方法具有以下有益效果:

本发明提供的消息集群平滑迁移方法中,首先获取消费者应用和生产者应用迁移前所连接的原始集群以及迁移后所连接的目标集群,然后由消费者应用根据目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程并与目标集群连接,同时生产者应用从向原始集群生产消息切换为向目标集群生产消息,直到当消费者应用监测到原始集群无消息堆积且无新消息进入时切换至目标集群消费消息。

可见,本发明不仅能够直接完成消息元数据和集群消息的迁移,通过目标消费者线程的建立还能实现客户端在原始集群和目标集群间的平滑切换,整个迁移过程无需停机重启,且由于未使用辅助插件也不会给当前集群增加性能负担,较大程度的提升了集群迁移的用户体验。

本发明的第二方面提供一种消息集群平滑迁移系统,应用于上述技术方案所述的消息集群平滑迁移方法中,所述系统包括:

迁移采集单元,用于获取消费者应用和生产者应用迁移前所连接的原始集群以及迁移后所连接的目标集群;

生产切换单元,用于由消费者应用根据目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程并与目标集群连接,且生产者应用从向原始集群生产消息切换为向目标集群生产消息;

目标切换单元,用于当消费者应用监测到原始集群无消息堆积且无新消息进入时切换至目标集群消费消息。

优选地,所述生产切换单元包括:

读取模块,用于消费者应用从上线文环境中读取目标集群中消费者应用开关状态;

线程新建模块,用于当消费者应用开关状态为打开且加载了目标集群的配置项时,消费者应用基于目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程;

接入模块,用于将每个目标消费者线程一一对应的与目标集群链接。

与现有技术相比,本发明提供的消息集群平滑迁移系统的有益效果与上述技术方案提供的消息集群平滑迁移方法的有益效果相同,在此不做赘述。

本发明的第三方面提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器运行时执行上述消息集群平滑迁移方法的步骤。

与现有技术相比,本发明提供的计算机可读存储介质的有益效果与上述技术方案提供的消息集群平滑迁移方法的有益效果相同,在此不做赘述。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本发明的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1为本发明实施例中消息集群平滑迁移方法的流程示意图;

图2为本发明实施例中消费者应用双读原始集群和目标集群的示意图;

图3为本发明实施例中消费者应用单读目标集群的示意图;

图4为本发明实施例中生产者应用双读原始集群和目标集群的示意图;

图5为本发明实施例中生产者应用从原始集群切换至目标集群的过程示意图;

图6为本发明实施例中生产者应用单读目标集群的示意图。

具体实施方式

为使本发明的上述目的、特征和优点能够更加明显易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其它实施例,均属于本发明保护的范围。

实施例一

请参阅图1,本实施例提供一种消息集群平滑迁移的方法,包括:

获取消费者应用和生产者应用迁移前所连接的原始集群以及迁移后所连接的目标集群;由消费者应用根据目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程并与目标集群连接,且生产者应用从向原始集群生产消息切换为向目标集群生产消息;当消费者应用监测到原始集群无消息堆积且无新消息进入时切换至目标集群消费消息。

本实施例提供的消息集群平滑迁移方法中,首先获取消费者应用和生产者应用迁移前所连接的原始集群以及迁移后所连接的目标集群,然后由消费者应用根据目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程并与目标集群连接,同时生产者应用从向原始集群生产消息切换为向目标集群生产消息,直到当消费者应用监测到原始集群无消息堆积且无新消息进入时切换至目标集群消费消息。

可见,本实施例不仅能够直接完成消息元数据和集群消息的迁移,通过目标消费者线程的建立还能实现客户端在原始集群和目标集群间的平滑切换,整个迁移过程无需停机重启,且由于未使用辅助插件也不会给当前集群增加性能负担,较大程度的提升了集群迁移的用户体验。

上述实施例,在获取消费者应用和生产者应用迁移前所连接的原始集群以及迁移后所连接的目标集群之前还包括:

消费者应用根据原始集群中消费者线程的开关状态建立与原始集群一一对应的原始消费者线程并连接原始集群。

具体实施时,消费者应用在迁移前已经通过原始消费者线程建立了与原始集群的连接关系,可以理解的是,原始消费者线程的数量与所连接原始集群的数量相等,且为一一对应的关系,各原始消费者线程分别从对应的原始集群获取消费信息。为便于理解,本实施例通过下述示例进行说明:

请参阅图2和图3,原始集群的数量为3个,分别对应于RabbitMQ-01、RabbitMQ-02和RabbitMQ-03,消费者应用中原始消费者线程的数量也为3个,分别对应于Consumer01、Consumer02和Consumer03,使得Consumer01消费RabbitMQ-01的消息,Consumer02消费RabbitMQ-02的消息,Consumer03消费RabbitMQ-03的消息,目标集群的数量为1个,可以为Kafka、RocketMQ、RabbitMQ中的任一个。

上述实施例中,由消费者应用根据目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程并与目标集群连接的方法包括:

消费者应用从上线文环境中读取目标集群中消费者应用开关状态;当消费者应用开关状态为打开且加载了目标集群的配置项时,消费者应用基于目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程;将每个目标消费者线程一一对应的与目标集群链接。

上述实施例中,消费者应用和生产者应用均集成了原始集群和目标集群对应的SDK插件,SDK插件具有对原始集群和/或目标集群的单读或多读功能;单读或多读的功能依赖于原始集群或目标集群中消费者应用开关状态。

请参阅图2,具体实施时,消费者应用和生产者应用均集成了包括原始集群和目标集群对应类型的SDK插件,在统一的消息中间件框架内,消费者应用能够从Environment上线文环境中读取目标集群中消费者应用开关状态,当目标集群收到迁移指令时消费者应用的开关打开且自动加载目标集群的配置项,解析消费者应用配置的XML节点,并创建相关消费者对象实例A,同时创建一个相同相同的配置的对象实例A’,对象实例A对应于原始消费者线程Consumer01、Consumer02和Consumer03,对象实例A’对应于目标消费者线程Consumer01’、Consumer02’和Consumer03’,原始消费者线程分别与原始集群一一对应连接,目标消费者线程分别与目标集群连接,图中所述的目标集群为1个新MQ,如果关闭某个集群的消费者应用开关,则消费者线程自动断开与对应集群的连接,如图3所示,关闭了原始集群的RabbitMQ-01、RabbitMQ-02和RabbitMQ-03后,则断开了Consumer01、Consumer02和Consumer03的连接关系,此时只有Consumer01’、Consumer02’和Consumer03’分别与新MQ保持连接。

可以理解的是,消费者应用/生产者应用的单读是指仅连接一个原始集群或者一个目标集群,消费者应用/生产者应用的多读,如双读是指连接一个原始集群和一个目标集群。该实施例中,在三套RabbitMQ原始集群迁移到新MQ目标集群的方案中,通过改造SDK插件中ListenerContainerParser的解析过程来实现对新MQ和一个或者多个RabbitMQ的双读或多读功能。

上述实施例中,生产者应用从向原始集群生产消息切换为向目标集群生产消息的方法包括:

当消费者应用建立了目标消费者线程并与目标集群一一对应连接成功的同时,将原始集群中生产者应用开关的状态切换为关闭,以及将目标集群中生产者应用开关的状态切换为开启;生产者应用断开与原始集群的连接切换至与目标集群连接。

如图4-图6所示,具体实施时,将原始集群中生产者应用开关的状态切换为关闭,则对应的生产者应用将不能继续为原始集群生产消息,同理,将目标集群中生产者应用开关的状态切换为开启,则对应的生产者应用将可以为目标集群生产消息,此时生产者应用即可断开与原始集群的连接并且切换至与目标集群连接。示例性地,生产者应用开关或消费者应用开关可以为阿里云的AMPQ消费开关。

可以理解的是,上述生产者应用开关或消费者应用开关的开关控制以及目标消费者线程的新建可通过开发的增强装置得以实现,将增强装置分别集成在生产者应用或者消费者应用即可实现上述实施例中所提的功能。

上述实施例中,当消费者应用监测到原始集群无消息堆积且无新消息进入时切换至目标集群消费消息的方法包括:

通过消费者应用实时监测原始集群的消息堆积情况以及新消息进入情况,当原始集群无消息堆积且无新消息进入时,将原始集群中消费者应用开关的状态切换为关闭,且继续保持目标集群中消费者应用开关的状态为开启。

具体实施性,通过消费者应用监控原始集群的消息堆积情况以及新消息进入情况,能够实现消费者应用在消费完原始集群中的消息后接着消费目标集群的消息,进而可在不停机的情况下实现客户端在原始集群和目标集群间的平滑切换。

综上,上述实施例的迁移过程可理解为分如下三步:

第一步:消费者应用双读,即消费者应用同时消费目标集群及原始集群中的消息;

第二步:生产者应用从向原始集群生产消息切换为向目标集群生产消息;

第三步:待原始集群无消息堆积且无新消息进入时,将消费者应用切换为目标集群单读。

1、本实施例解决了现有技术中消息中间件产品在使用中,有关消息迁移配套装置缺失的问题,如RocketMQ、MNS、SQS和Kinesis等。

2、本实施例解决了现有技术中消息中间件产品在使用中,做消息迁移时,由于消息量巨大,面临消息服务器集群压力大且不能中断服务的问题,如使用RabbitMQ集群时,单集群达到了瓶颈之后,很难通过集群节点的增加而到达提升服务性能,此时的集群迁移,如果使用现有的Federation和Shovel组件的话,不仅需要重启RabbitMQ服务器,还会因为引入这两个组件而增加了RabbitMQ集群的资源压力,这类消息集群的迁移,必须在集群不停机且不增加其资源负担的前提下进行。

3、本实施例支持异构消息中间件集群的迁移实施,如Kafka和RabbitMQ之间、RocketMQ和RabbitMQ之间、Kafka和RocketMQ之间等,通过统一的接口抽象,屏蔽了不同消息服务中间件的差异,如消息中间件服务的技术架构差异等。

实施例二

本实施例提供一种消息集群平滑迁移的系统,包括:

迁移采集单元,用于获取消费者应用和生产者应用迁移前所连接的原始集群以及迁移后所连接的目标集群;

生产切换单元,用于由消费者应用根据目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程并与目标集群连接,且生产者应用从向原始集群生产消息切换为向目标集群生产消息;

目标切换单元,用于当消费者应用监测到原始集群无消息堆积且无新消息进入时切换至目标集群消费消息。

优选地,所述生产切换单元包括:

读取模块,用于消费者应用从上线文环境中读取目标集群中消费者应用开关状态;

线程新建模块,用于当消费者应用开关状态为打开且加载了目标集群的配置项时,消费者应用基于目标集群的配置项建立与原始消费者线程一一对应的目标消费者线程;

接入模块,用于将每个目标消费者线程一一对应的与目标集群链接。

与现有技术相比,本发明实施例提供的消息集群平滑迁移系统的有益效果与上述实施例一提供的消息集群平滑迁移方法的有益效果相同,在此不做赘述。

实施例三

本实施例提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器运行时执行上述消息集群平滑迁移方法的步骤。

与现有技术相比,本实施例提供的计算机可读存储介质的有益效果与上述技术方案提供的消息集群平滑迁移方法的有益效果相同,在此不做赘述。

本领域普通技术人员可以理解,实现上述发明方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,上述程序可以存储于计算机可读取存储介质中,该程序在执行时,包括上述实施例方法的各步骤,而的存储介质可以是:ROM/RAM、磁碟、光盘、存储卡等。

以上,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

相关技术
  • 消息集群平滑迁移的方法及系统
  • 跨集群服务发现实现集群迁移的方法、系统及计算机设备
技术分类

06120113228840