如何从ActiveMQ平滑迁移到Kafka?

2024-09-04 16:38
文章标签 kafka 迁移 activemq 平滑

本文主要是介绍如何从ActiveMQ平滑迁移到Kafka?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 
参考视频教程:  
 **python进阶训练营  **
如何从ActiveMQ平滑迁移到Kafka?_Kafka

直入主题,不讨论为什么迁移,直接谈迁移方案。

既然是从AMQ(AtiveMQ的简称)迁移到kafka,那么迁移过程中肯定需要做到平滑迁移:对于业务没有影响,对于上下游系统没有依赖。由于系统一般会和多个上游,多个下游通过MQ中间件保持依赖关系,迁移的过程中,肯定要做到各个系统上线没有任何依赖。打个比方订单系统发送topic,会员系统和积分系统都会接收这个topic(会员增加成长值,积分系统加积分)。改造后发布时,订单系统,会员系统,积分系统三个系统上线应该可以任意顺序,任意时间发布上线。

依赖关系

给出具体方案之前,先捋一下各个系统之间的依赖关系。再复杂的系统,和其他系统之间的依赖关系也就如下图所示,假设我们关注的是系统H。它会接受上游系统A和B发送的topic,以及给下游系统X,Y和Z发送topic(说明:下图是系统依赖关系图,而不是实例关系依赖图)。

如何从ActiveMQ平滑迁移到Kafka?_Kafka_02

根据这张架构图,我们将消息分为几个类型:

  • 生产型(1-1)–这种消息由本身系统H发送,下游系统X,Y,Z中任意且只有一个系统消费(AMQ中Queue的使用场景);

  • 生产型(1-N)–这种消息由本身系统H发送,下游系统X,Y,Z中任意多个系统消费(AMQ中VirtualTopic的使用场景);

  • 消费型–这种消息由上游系统例如A或者B发送,系统H负责消费;

  • 自产自消型–这种消息由本身系统H发送,本身系统H负责消费

VirtualTopic

生产型(1-N)消息,不能认为是Topic的使用场景,而应该是VirtualTopic的使用场景(至少大部分情况下)。两者的区别如下图所示(AMQ的VirtualTopic具体用法网上一大堆,这里就不累述了):

如何从ActiveMQ平滑迁移到Kafka?_Kafka_03

如上图所示,系统X有三个实例X-1,X-2,X-3;系统Y有三个实例Y-1,Y-2,Y-3。如果系统H发送一个VirtualTopic,假如名为:
登录后复制

VirtualTopic.PAY_SUCCESS_ORDER。

系统X和系统Y分别接收队列:
登录后复制

VConsumers.memberGroup.VirtualTopic.PAY_SUCCESS_ORDER


登录后复制

VConsumers.pointIssue.VirtualTopic.PAY_SUCCESS_ORDER。

那么系统X的三个实例只会有一个实例接收到
登录后复制

VConsumers.memberGroup.VirtualTopic.PAY_SUCCESS_ORDER,

系统Y的三个实例也只有一个实例接收到
登录后复制

VConsumers.pointIssue.VirtualTopic.PAY_SUCCESS_ORDER。

如果系统H发送一个Topic,假如名为
登录后复制

PAY_SUCCESS_ORDER

那么系统X的三个实例和系统Y的三个实例都会接收到这个Topic。

接下来我们分别讨论这几种消息如何做到平滑迁移(假定系统H就是我们要改造的系统)。

消费型

这类消息由于我们的系统H是消费者,即被动方,我们不确定上游系统A和B的发送方式什么时候从AMQ切换到kafka,另外我们无法预知我们订阅的AMQ存量消息什么时候消费完。所以对于这种类型的消息,系统H在改造时要保留原来的AMQ消息接收方式,同时需要新增kafka消息接收方式即可。

生产型(1-1)

这种场景就是AMQ中Queue的使用场景。这类消息由于我们的系统H是生产者,即主动方。且依赖关系比较简单,就是1对1。但是考虑到下游系统即消费者不确定什么时候加入kafka接收方式。所以,我们重构时AMQ发送方式要保留,kafka发送方式也要新增。但是需要在发送的地方增加一个开关,在两种发送方式之间切换。当下游系统即消费者引入kafka接收方式后,这个开关就可以切换到kafka发送。生产者的AMQ发送方式的代码和开关在下一个版本就可以删除了。同理,这个消费者的AMQ消费方式在下一个版本也可以删除。

生产型(1-N)

这种场景就是AMQ中VirtualTopic的使用场景。这类消息由于我们的系统H是生产者,即主动方。但是依赖关系相比Queue使用场景要复杂一点,因为消费者比较多。考虑到若干个下游系统即消费者不确定什么时候加入kafka接收方式。所以,我们重构时AMQ发送方式要保留,kafka发送方式也要新增。但是需要在发送的地方增加一个开关,在两种发送方式之间切换。当下游系统即消费者全部引入kafka接收方式后,这个开关就可以切换到kafka发送。生产者的AMQ发送方式的代码和开关在下一个版本就可以删除了。同理,若干个消费者的AMQ消费方式在下一个版本也可以删除。

自产自消型

这种类型的消息,即使消息的生产和消费都在我们的系统H中,整个过程我们能够完全掌控。如果不考虑多个实例之间部署的时间差,那么直接将AMQ的发送方式和接收方式全部更新为kafka发送方式和接收方式。例如本地缓存定时刷新这种场景。

如果考虑多个实例之间部署的时间差,那么就比较麻烦了。

1-1

如果自产自消是1-1类型消息,即系统H发送一个Queue,消费者也是系统H,且需要考虑多个实例之间部署的时间差。这个切换过程比较简单。直接将AMQ的发送方式和接收方式全部更新为kafka发送方式和接收方式,整个滚动部署过程如下:

  • 上线前
    重构上线前,所有系统都有AMQ发送方式和AMQ接收方式。自产自消。

如何从ActiveMQ平滑迁移到Kafka?_Kafka_04

  • 实例H1上线后
    实例H1上线后,实例H1是kafka发送方式和接收方式。如果消息是H1发送的,那么只能H1接收。如果消息是H2或者H3发送的,那么H2和H3都可以接收。

如何从ActiveMQ平滑迁移到Kafka?_Kafka_05

  • 实例H2上线后
    实例H2上线后,实例H1和H2是kafka发送方式和接收方式。如果消息是H1或者H2发送的,那么H1和H2都能接收。如果消息是H3发送的,那么H3可以接收。

如何从ActiveMQ平滑迁移到Kafka?_Kafka_06
* 实例H3上线后
实例H3即最后一个上线后,三个实例全部是kafka的发送方式和接收方式。

如何从ActiveMQ平滑迁移到Kafka?_Kafka_07

1-N

如果自产自消是1-N类型消息,即系统H发送一个Topic,消费者也是系统H,且需要考虑多个实例之间部署的时间差。这个切相对麻烦一点。

  1. 需要保留AMQ的接收方式,同时新增kafka接收方式,发布一个版本。

  2. 新增kafka发送方式,删除AMQ发送方式,滚动发布,直到所有实例部署完成。

总结

通过上面的方案设计,即使整个部门,或者整个公司相互之间通过MQ中间件依赖的系统有成百上千个,也可以做到从容不迫,一个系统一个系统慢慢迁移。完全不受其他项目组,不受其他部门的影响。整个过程真正做到平滑迁移。

-END-

近期热文:

*

系统优化总结—系统层面
——————————————————————————————————————————————————————————————————————————————–

*

NIO相关基础篇
—————————————————————————————————————————————————————————————————————————————

*

以Dubbo为例,聊聊如何为开源项目做贡献
—————————————————————————————————————————————————————————————————————————————————-

*

25个面试中最常问的问题和答案
———————————————————————————————————————————————————————————————————————————————–

*

如何使用Spring优雅地处理REST异常?
——————————————————————————————————————————————————————————————————————————————————

*

Spring Cloud Finchley版中Consul多实例注册的问题处理
———————————————————————————————————————————————————————————————————————————————————————–

*

超有趣的几个Linux小命令
———————————————————————————————————————————————————————————————————————————————-

*

JAVA拾遗 — JMH与8个代码陷阱
—————————————————————————————————————————————————————————————————————————————————–

关注我

如何从ActiveMQ平滑迁移到Kafka?_Kafka_08

这篇关于如何从ActiveMQ平滑迁移到Kafka?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136462

相关文章

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

Oracle迁移PostgreSQL隐式类型转换配置指南

《Oracle迁移PostgreSQL隐式类型转换配置指南》Oracle迁移PostgreSQL时因类型差异易引发错误,需通过显式/隐式类型转换、转换关系管理及冲突处理解决,并配合验证测试确保数据一致... 目录一、问题背景二、解决方案1. 显式类型转换2. 隐式转换配置三、维护操作1. 转换关系管理2.

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

一文详解kafka开启kerberos认证的完整步骤

《一文详解kafka开启kerberos认证的完整步骤》这篇文章主要为大家详细介绍了kafka开启kerberos认证的完整步骤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、kerberos安装部署二、准备机器三、Kerberos Server 安装1、配置krb5.con