TPS提升10倍,RabbitMQ到RocketMQ不停机平滑迁移实战
大量业务使用消息中间件进行系统间的解耦、异步化、削峰填谷设计实现。 公司内部前期基于RabbitMQ实现了一套高可用的消息中间件平台。 随着业务的持续增长,消息体量随之增大,对消息中间件平台提出了更高的要求,此外在运维过程中也遇到了高可用难以保障,功能特性不足等诸多问题。 基于遇到的这些问题,决定引入RocketMQ进行替换。 本文将介绍基于RocketMQ建设消息中间件平台并实现在线业务无感知的平滑迁移。
一、背景说明
1、高可用能力不足
2、性能不足
3、功能特性不足
二、消息中间件平台的项目目标
-
业务需求 -
平台需求
1、业务需求分析
-
高性能
-
高可用
-
丰富的功能特性
2、平台运维需求分析
-
可运维: 业务使用权限校验;业务生产消费流量限制;业务流量隔离与快速迁移能力。
-
可观测: 丰富的性能指标观察集群的运行情况。
-
可掌握: 可基于开源组件快速进行二次开发,丰富平台功能特性和进行相关问题修复。
-
云原生: 后续可基于容器化提供云原生消息中间件,提供更高的弹性和可伸缩能力。
三、开源组件选型调研
1、高可用能力分析对比
1)高可用架构与负载均衡能力对比
Pu lsar部署架构(来源: Pulsar社区)
RocketMQ部署架构(来源:
RocketMQ社区)
-
采用计算与存储分离架构设计,可以实现海量数据存储,并且支持冷热数据分离存储。
-
基于ZK和Manager节点控制Broker的故障切换以实现高可用。
-
Zookeeper采用分层分片存储设计,天然支持负载均衡。
-
采用存算一体架构设计,主从模式部署,master节点异常不影响消息读取,Topic采用分片设计。
-
需要二次开发支持主从切换实现高可用。
-
未实现Broker的自动负载均衡,可以将top n流量Topic分布到不同的Broker中实现简单的负载均衡。
-
Broker与BooKeeper独立扩缩容,并且扩缩容后会完成自动负载均衡。
-
Broker节点无状态,故障后承载Topic会自动转移到其它Broker节点,完成故障秒级恢复。
-
BooKeeper由自动恢复服务进行ledger数据对齐,并恢复到设置的QW份。
-
故障期间已ack消息不会丢失,未ack消息需要客户端重发。
-
Broker扩缩容后需要人工介入完成Topic流量均衡,可开发自动负载均衡组件结合Topic的读写权限控制自动化完成扩缩容后的负载均衡。
-
基于主从切换实现高可用,由于客户端定期30秒从NameSrv更新路由,因此故障恢复时间在30~60秒,可以结合客户端降级策略让客户端主动剔除异常Broker节点,实现更快故障恢复。
-
采用同步复制异步刷盘部署架构,在极端情况下会造成少量消息丢失,采用同步复制同步刷盘,已写入消息不会丢失。
-
可支撑百万Topic数量,实际受到ZK存储元数据限制。
-
根据内部压测1KB消息可支撑TPS达数十万。
-
逻辑上可支撑百万Topic,实际在达到数万时Broker与NameSrv传输心跳包可能超时,建议单集群不超过5万。
-
根据压测可支撑1KB消息体TPS达10万+。
2、功能特性对比
3、总结
四、平滑迁移建设
1、消息网关独立部署与嵌入式部署差异对比
2、元数据定义映射与维护
3、互不干扰的高性能消息推送
-
每个queue采用独立的线程,保证互不干扰和时效性,缺点是无法支撑海量queue的消息推送。
-
基于信号量、阻塞队列等,在感知到有可推送消息和可消费服务端时按需进行消息的推送,这样可使用少量的线程即可完成高效的消息推送。
4、消费启停与消费限流能力实现
5、平台架构
-
最终形成了以上的平台架构。新建设了一个AMQP-proxy消息网关服务实现AMQP消息转换到RocketMQ,支持业务的消息生产消费。
-
建设了mq-meta服务维护集群的元数据信息。
-
通过mq-controller控制集群的主从切换,实现集群的高可用,同时增加了集群监控,负载均衡模块保障集群的高可用。
五、平台建设进展与迁移收益
1、业务使用收益
-
统一的消息过期时间;
-
消费异常消息将按照梯度延时重投递;
-
直接支持广播消费模式;
-
全环境按需提供消息轨迹功能;
-
支持消费重置到以前的某个位点。
-
消息将 不再无限期保留, 默认 保留3~7天 (实际保留时间根据集群配置决定);
-
消费异常将不再立即重投递,将按照一定的 梯度延时重投递, 多次异常后将变为死信消息;
-
直接支持 广播消费, 注意广播消费模式消费无异常重投递,每个消息每个节点只消费一次;
-
业务生产消费性能可支持水平扩展;
-
不支持 消费优先级 功能;
-
默认 消费超时时间15分钟, 消费超时后消息重新投递,消费超时时间可按需调整;
-
支持 消费启停 (全局或限制部分节点消费);
-
支持 全局消费限流 ;
-
限制消息体大小, 当前限制为256KB,超过将直接返回失败,后续将进行流量治理,限制发送大消息体业务流量。
2、平台运维收益
六、未来展望
-
基于消息网关能力丰富现有平台功能特性,进行业务消息治理。
-
过去五年中间件团队基于开源RabbitMQ进行了RabbitMQ的高可用建设,发现直接让业务方使用基于开源组件的SDK接入会带来SDK升级困难,与后端消息中间件类型绑定的问题,未来我们计划基于GPRC和消息网关,实现消息队列引擎服务化,业务无需关心底层具体使用的开源消息中间件选型。
-
调研RocketMQ5.0计算与存储分离构架,进行消息中间件架构的再升级。