从RabbitMQ平滑迁移到RocketMQ技术实战

大量业务使用消息中间件进行系统间的解耦、异步化、削峰填谷设计实现 。公司内部前期基于RabbitMQ实现了一套高可用的消息中间件平台 。随着业务的持续增长 , 消息体量随之增大 , 对消息中间件平台提出了更高的要求 , 此外在运维过程中也遇到了高可用难以保障 , 功能特性不足等诸多问题 。基于遇到的这些问题 , 决定引入RocketMQ进行替换 。本文将介绍基于RocketMQ建设消息中间件平台并实现在线业务无感知的平滑迁移 。
一、背景说明vivo互联网中间件团队于2016年开始基于开源RabbitMQ向业务提供高可用消息中间件平台服务 。
为解决好业务流量快速增长的问题 , 我们通过合理的业务集群拆分和动态调整 , 较好的交付了业务对消息中间件平台的平台能力需求 。
但是随着业务长周期的迅猛发展 , 消息体量也越来越大 , 在高并发、大流量场景下RabbitMQ的系统架构设计存在着一定的限制 , 主要有以下问题:
1.1 高可用能力不足架构设计存在脑裂风险 , 并且默认脑裂后无法自动恢复 , 人工介入恢复存在数据丢失的风险 。
为解决脑裂问题 , 可以选择将网络异常后的处理调整为pause_minority模式 , 但是也带来了可能微小的网络抖动也会导致集群故障无法恢复的问题 。
1.2. 性能不足业务消息发送后通过exchange路由到对应的queue中 , 每一个queue由集群中的某个节点实际承载流量 , 高流量下集群中的某个节点可能会成为瓶颈 。
【从RabbitMQ平滑迁移到RocketMQ技术实战】queue由某个节点承载流量后无法快速迁移 , 强制迁移到其它低负载节点可能会导致queue不可用 , 这也导致了向集群中添加节点并无法快速提升集群的流量承载能力 。
集群性能较低 , 经测试使用三台机器组成集群 , 可承载大概数万tps左右 , 并且由于queue是由集群中某个节点实际承载的 , 也无法继续提升某个queue的性能 , 这样就无法支撑大流量业务 。
消息堆积到千万或更多后会导致集群性能下降 , 甚至海量堆积后如果消费请求tps特别高 , 可能会因为磁盘的性能损耗导致发送性能下降 , 并且在消息堆积太多时恢复时间长甚至无法恢复 。
1.3 功能特性不足RabbitMQ 默认情况下消费异常会执行立即重新投递 , 少量的异常消息也可能导致业务无法消费后续消息 。
功能特性上未支持事务消息、顺序消息功能 。
虽可自行实现消息轨迹逻辑 , 但是会对集群产生非常大的性能损耗 , 在正式环境中实际无法基于RabbitMQ原生的能力实现消息轨迹功能 。
二、消息中间件平台的项目目标基于以上问题 , 中间件团队于2020年Q4开始进行了下一代消息中间件平台方案的调研 , 为保证下一代消息中间件平台符合业务新的需求 , 我们首先明确了消息中间件平台的建设目标 , 主要包含两部分:

  • 业务需求
  • 平台需求
2.1 业务需求分析
  • 高性能:可支撑极高的tps , 并且支持水平扩展 , 可快速满足业务的流量增长需求 , 消息中间件不应成为业务请求链路性能提升的瓶颈点 。
  • 高可用:极高的平台可用性(>99.99%) , 极高的数据可靠性(>99.99999999%) 。
  • 丰富的功能特性:支持集群、广播消费;支持事务消息、顺序消息、延时消息、死信消息;支持消息轨迹 。
2.2 平台运维需求分析