来源:[全能大飞神]的简书:https://www.jianshu.com/p/1c50bf048724

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

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


依赖关系

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

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

  • 生产型(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具体用法网上一大堆,这里就不累述了):

如上图所示,系统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接收方式。自产自消。

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

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

  • 实例H3上线后
    实例H3即最后一个上线后,三个实例全部是kafka的发送方式和接收方式。

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?相关推荐

  1. rabbitMQ、activeMQ、zeroMQ、Kafka、Redis 比较

    Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的 ...

  2. 今天说说OPPO——OPPO 实时数仓揭秘:从顶层设计实现离线与实时的平滑迁移

    摘要:单日总数据处理量超 10 万亿,峰值大概超过每秒 3 亿,OPPO 大数据平台研发负责人张俊揭秘 OPPO 基于 Apache Flink 构建实时数仓的实践,内容分为以下四个方面: 建设背景 ...

  3. OPPO实时数仓揭秘:从顶层设计实现离线与实时的平滑迁移

    一.建设背景 关于 OPPO 移动互联网业务 大家都认为 OPPO 是一家手机公司,但大家可能并不清楚,其实 OPPO 也会做与移动互联网相关的业务.在 2019 年 12 月,OPPO 发布了自己定 ...

  4. 58 集团大规模 Storm 任务平滑迁移至 Flink 的秘密

    Flink-Storm 是 Flink 官方提供的用于 Flink 兼容 Storm 程序 beta 工具,并且在 Release 1.8 之后去掉相关代码.本文主要讲述 58 实时计算平台如何优化 ...

  5. 消息中间件合集:MQ(ActiveMQ/RabbitMQ/RocketMQ)+Kafka+笔记

    最近有好多朋友都去投岗秋招提前批,面完回来跟我说碰到消息中间件一类的问题就挂了.额,有点不知所措,于是乎小编就想着做一次消息中间件的专题,归类整理了MQ(ActiveMQ/RabbitMQ/Rocke ...

  6. 惊了 消息中间件合集:MQ(ActiveMQ/RabbitMQ/RocketMQ)+Kafka+笔记

    最近有好多朋友都去投岗秋招提前批,面完回来跟我说碰到消息中间件一类的问题就挂了. 附面试思维导图: 额,有点不知所措,于是乎小编就想着做一次消息中间件的专题,归类整理了MQ( ActiveMQ/Rab ...

  7. mongodb3 分片集群平滑迁移

    分片集群平滑迁移实验(成功) 过程概述: 为每个分片添加多个从节点,然后自动同步.同步完后,切换主节点到新服务器节点. 导出原来的config 数据库,并导入到新服务器的config数据库 停掉整个集 ...

  8. 平滑迁移 Dubbo 服务的思考

    前言 近日,有报道称在 HashCorp 的商业软件试用协议上发现,旗下所有商业产品禁止在中国境内使用.部署.安装,这其中就包含了 Terraform, Consul, Vagrant 等众多知名软件 ...

  9. oracle tns 代理配置_OGG实现Oracle到MySQL数据平滑迁移

    技术分享 | 使用OGG实现Oracle到MySQL数据平滑迁移 - 爱可生开源社区​opensource.actionsky.com 一.OGG概述 OGG全称为Oracle GoldenGate, ...

最新文章

  1. UA MATH636 信息论1 熵
  2. 嵌入式ARM Linux开发板自启动,跳过输入root用户名和密码
  3. html倒计时timer,JavaScript定时器设置、使用与倒计时案例详解
  4. 【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度...
  5. 来自爸妈的敷衍问候!| 今日最佳
  6. 【2016年第5期】位置大数据在车辆保险风险管理中的应用
  7. 【报告分享】2021新中产人群洞察报告.pdf(附下载链接)
  8. iPhone开发知识和项目
  9. net configuration assistant 没反应_@尾款人:错过这条推送,7000多块就没了……
  10. 深挖那些隐藏在Linux中的炫酷主题
  11. 共探机遇 2018中国产业互联网化纤创新者大会华丽启幕...
  12. 70个城市房价上涨,令人忐忑
  13. PPPOE拨号691的问题
  14. Mac使用技巧:轻松自定义设置系统键盘
  15. JPA中的@Embedded和@Embeddable注释的使用
  16. Axure绘制页面框架
  17. golang常见面试题总结
  18. python名片制作代码_教你做一张能运行 Python 的名片,成本只要20元!
  19. 【t101】小明搬家
  20. Elasticsearch(ES)的基本使用

热门文章

  1. CDN 内容分发网络 简介
  2. linux 文本 查看 搜索
  3. python3 socket shutdown 简介
  4. SpiderMonkey-让你的C++程序支持JavaScript脚本
  5. Android开发--图形图像与动画(二)--Animation实现图像的 渐变、缩放、位移、旋转
  6. Android 利用方向传感器获得手机的相对角度
  7. TCP/IP详解--学习笔记(7)-广播和多播,IGMP协议
  8. SMB文件共享及用户权限使用配置
  9. 树莓派 linux0.12,12 个可替代树莓派的单板机
  10. 微软sql服务器关闭了会怎样,sql server 服务启动后 自动关闭 求