作者:vivo 互联网中间件团队- Liu Runyun
大量业务应用消息中间件进行零碎间的解耦、异步化、削峰填谷设计实现。公司外部后期基于RabbitMQ实现了一套高可用的消息中间件平台。随着业务的持续增长,音讯体量随之增大,对消息中间件平台提出了更高的要求,此外在运维过程中也遇到了高可用难以保障,性能个性有余等诸多问题。基于遇到的这些问题,决定引入RocketMQ进行替换。本文将介绍基于RocketMQ建设消息中间件平台并实现在线业务无感知的平滑迁徙。
一、背景阐明
vivo互联网中间件团队于2016年开始基于开源RabbitMQ向业务提供高可用消息中间件平台服务。
为解决好业务流量快速增长的问题,咱们通过正当的业务集群拆分和动静调整,较好的交付了业务对消息中间件平台的平台能力需要。
然而随着业务长周期的迅猛发展,音讯体量也越来越大,在高并发、大流量场景下RabbitMQ的零碎架构设计存在着肯定的限度,次要有以下问题:
1.1 高可用能力有余
架构设计存在脑裂危险,并且默认脑裂后无奈主动复原,人工染指复原存在数据失落的危险。
为解决脑裂问题,能够抉择将网络异样后的解决调整为pause_minority模式,然而也带来了可能渺小的网络抖动也会导致集群故障无奈复原的问题。
1.2. 性能有余
业务音讯发送后通过exchange路由到对应的queue中,每一个queue由集群中的某个节点理论承载流量,高流量下集群中的某个节点可能会成为瓶颈。
queue由某个节点承载流量后无奈疾速迁徙,强制迁徙到其它低负载节点可能会导致queue不可用,这也导致了向集群中增加节点并无奈疾速晋升集群的流量承载能力。
集群性能较低,经测试应用三台机器组成集群,可承载大略数万tps左右,并且因为queue是由集群中某个节点理论承载的,也无奈持续晋升某个queue的性能,这样就无奈撑持大流量业务。
音讯沉积到千万或更多后会导致集群性能降落,甚至海量沉积后如果生产申请tps特地高,可能会因为磁盘的性能损耗导致发送性能降落,并且在音讯沉积太多时复原工夫长甚至无奈复原。
1.3 性能个性有余
RabbitMQ 默认状况下生产异样会执行立刻从新投递,大量的异样音讯也可能导致业务无奈生产后续音讯。
性能个性上未反对事务音讯、程序音讯性能。
虽可自行实现音讯轨迹逻辑,然而会对集群产生十分大的性能损耗,在正式环境中理论无奈基于RabbitMQ原生的能力实现音讯轨迹性能。
二、消息中间件平台的我的项目指标
基于以上问题,中间件团队于2020年Q4开始进行了下一代消息中间件平台计划的调研,为保障下一代消息中间件平台合乎业务新的需要,咱们首先明确了消息中间件平台的建设指标,次要蕴含两局部:
- 业务需要
- 平台需要
2.1 业务需要剖析
高性能:可撑持极高的tps,并且反对程度扩大,可疾速满足业务的流量增长需要,消息中间件不应成为业务申请链路性能晋升的瓶颈点。
高可用:极高的平台可用性(>99.99%),极高的数据可靠性(>99.99999999%)。
丰盛的性能个性:反对集群、播送生产;反对事务音讯、程序音讯、延时音讯、死信音讯;反对音讯轨迹。
2.2 平台运维需要剖析
- 可运维:业务应用权限校验;业务生产生产流量限度;业务流量隔离与疾速迁徙能力。
- 可观测:丰盛的性能指标察看集群的运行状况。
- 可把握:可基于开源组件疾速进行二次开发,丰盛平台性能个性和进行相干问题修复。
- 云原生:后续可基于容器化提供云原生消息中间件,提供更高的弹性和可伸缩能力。
- 总结:须要建设高性能、高牢靠的下一代消息中间件,具备极高的数据可靠性,丰盛的性能个性,并且须要完满兼容以后的RabbitMQ平台,帮忙业务疾速迁徙到新消息中间件平台,缩小业务迁徙老本。
三、开源组件选型调研
基于以后RabbitMQ平台的问题和对下一代消息中间件平台的我的项目需要,咱们发展了针对以后较风行的两款消息中间件:RocketMQ、Pulsar的调研。
调研过程中次要针对以下两方面进行比照:
3.1 高可用能力剖析比照
3.1.1 高可用架构与负载平衡能力比照
Pulsar部署架构(起源:Pulsar社区)
RocketMQ部署架构(起源:RocketMQ社区)
- Pulsar:
- 采纳计算与存储拆散架构设计,能够实现海量数据存储,并且反对冷热数据拆散存储。
- 基于ZK和Manager节点管制Broker的故障切换以实现高可用。
- Zookeeper采纳分层分片存储设计,人造反对负载平衡。
- RocketMQ:
- 采纳存算一体架构设计,主从模式部署,master节点异样不影响音讯读取,Topic采纳分片设计。
- 须要二次开发反对主从切换实现高可用。
- 未实现Broker的主动负载平衡,能够将top n流量Topic散布到不同的Broker中实现简略的负载平衡。
3.1.2 扩缩容与故障复原比照
- Pulsar
- Broker与BooKeeper独立扩缩容,并且扩缩容后会实现主动负载平衡。
- Broker节点无状态,故障后承载Topic会主动转移到其它Broker节点,实现故障秒级复原。
- BooKeeper由主动复原服务进行ledger数据对齐,并复原到设置的QW份。
- 故障期间已ack音讯不会失落,未ack音讯须要客户端重发。
- RocketMQ
- Broker扩缩容后须要人工染指实现Topic流量平衡,可开发主动负载平衡组件联合Topic的读写权限管制自动化实现扩缩容后的负载平衡。
- 基于主从切换实现高可用,因为客户端定期30秒从NameSrv更新路由,因而故障复原工夫在30~60秒,能够联合客户端降级策略让客户端被动剔除异样Broker节点,实现更快故障复原。
- 采纳同步复制异步刷盘部署架构,在极其状况下会造成大量音讯失落,采纳同步复制同步刷盘,已写入音讯不会失落。
3.1.3 性能比照
- Pulsar
- 可撑持百万Topic数量,理论受到ZK存储元数据限度。
- 依据外部压测1KB音讯可撑持TPS达数十万。
- RocketMQ
- 逻辑上可撑持百万Topic,理论在达到数万时Broker与NameSrv传输心跳包可能超时,倡议单集群不超过5万。
- 依据压测可撑持1KB音讯体TPS达10万+。
3.2 性能个性比照
3.3 总结
从高可用架构剖析,Pulsar基于Bookeeper组件实现了架构的计算与存储拆散,能够实现故障的疾速复原;RocketMQ采纳了主从复制的架构,故障复原依赖主从切换。
从性能个性剖析,Pulsar反对了丰盛的过期策略,反对了音讯去重,能够反对实时计算中音讯只生产一次的语义;RocketMQ在事务音讯、音讯轨迹、生产模式等个性对在线业务有更好的反对。
从这两方面比照,最终抉择了RocketMQ构建咱们下一代的消息中间件平台。
四、平滑迁徙建设
通过技术调研,确定了基于RocketMQ建设下一代消息中间件平台。
为了实现业务从RabbitMQ平滑迁徙到RocketMQ,就须要建设音讯网关实现音讯从AMQP协定转换到RocketMQ;RabbitMQ与RocketMQ的元数据语义与存储存在差别,须要实现元数据语义的映射与元数据的独立存储。
次要有以下四个事项须要实现:
4.1 音讯网关独立部署与嵌入式部署差别比照
4.2 元数据定义映射与保护
4.3 互不烦扰的高性能音讯推送
RabbitMQ采纳推模式进行音讯生产,尽管RocketMQ也反对音讯推送生产,然而因为AMQP协定中通过prefetch参数限度了客户端缓存音讯数量以保障不会因缓存太多音讯导致客户端内存异样,因而在音讯网关实现音讯推送时也须要满足AMQP协定的语义。
同时每个音讯网关都须要数千甚至数万的queue的音讯推送,每个queue音讯生产速率存在差别,并且每个队列可能随时有音讯须要推送到客户端进行生产,要保障不同queue之间的推送互不烦扰且及时。
为了实现高效的、互不烦扰的音讯推送,有以下策略:
- 每个queue采纳独立的线程,保障互不烦扰和时效性,毛病是无奈撑持海量queue的音讯推送。
- 基于信号量、阻塞队列等,在感知到有可推送音讯和可生产服务端时按需进行音讯的推送,这样可应用大量的线程即可实现高效的音讯推送。
最终抉择了第2种计划,数据流转图如下图所示:
一个音讯生产过程:客户端在启动连贯到音讯网关后,在音讯网关中会构建RocketMQ推送生产客户端实例,并且注入自定义的ConsumeMessageService实例,同时应用一个信号量保留客户端容许推送的音讯数量。
当音讯从集群侧推送到音讯网关时,将音讯依照推送的批次封装为一个工作保留在ConsumeMessageService实例的BlockingQueue中,同时推送线程会轮询所有的ConsumeMessageService实例,如果发现本地缓存有待生产的音讯并且有可生产音讯的业务客户端,将工作提交到线程池中实现音讯的推送。
为了保障不会因为大量生产速率特地高的queue导致其它queue的音讯推送时效性升高,会限度每一个ConsumeMessageService只容许推送肯定数量的音讯即转到推送其它queue的音讯,以此即可保障所有queue的音讯推送的互不烦扰和时效性。
在客户端生产ack/uack后再次通过信号量告诉下一次推送,这样也保障了应用大量的线程资源即可实现海量音讯的推送需要。
4.4 生产启停与生产限流能力实现
基于音讯网关,能够在音讯推送逻辑中减少生产启停和生产限流逻辑。
生产启停能够帮忙业务疾速实现生产的暂停或是局部异样节点进行音讯生产。
生产限流能够帮忙业务管制音讯生产速率,防止对底层依赖产生太大压力。
4.5 平台架构
- 最终造成了以上的平台架构。新建设了一个AMQP-proxy音讯网关服务实现AMQP音讯转换到RocketMQ,反对业务的音讯生产生产。
- 建设了mq-meta服务保护集群的元数据信息。
- 通过mq-controller管制集群的主从切换,实现集群的高可用,同时减少了集群监控,负载平衡模块保障集群的高可用。
五、平台建设停顿与迁徙收益
5.1 业务应用收益
5.1.1 更高、更稳固的音讯发送性能
原生RabbitMQ集群业务压测性能
应用音讯网关后业务压测性能
5.1.2 更丰盛的性能个性
- 对立的音讯过期工夫
- 生产异样音讯将依照梯度延时重投递
- 间接反对播送生产模式
- 全环境按需提供音讯轨迹性能
- 反对生产重置到以前的某个位点
5.1.3 业务应用个性变动
- 音讯将不再无限期保留,默认保留3~7天(理论保留工夫依据集群配置决定)
- 生产异样将不再立刻重投递,将依照肯定的梯度延时重投递,屡次异样后将变为死信音讯
- 间接反对播送生产,留神播送生产模式生产无异样重投递,每个音讯每个节点只生产一次
- 业务生产生产性能可反对程度扩大
- 不反对生产优先级性能
- 默认生产超时工夫15分钟,生产超时后音讯从新投递,生产超时工夫可按需调整
- 反对生产启停(全局或限度局部节点生产)
- 反对全局生产限流
- 限度音讯体大小,以后限度为256KB,超过将间接返回失败,后续将进行流量治理,限度发送大音讯体业务流量
5.2 平台运维收益
业务从RabbitMQ迁徙到RocketMQ后,可撑持业务流量从万TPS级别晋升到十万TPS级别,可撑持业务容量从数亿晋升至百亿级别。耗用机器资源降落50%以上,运维难度和老本均大大降低,同时能够基于音讯网关实现更加丰盛的性能个性。
六、将来瞻望
将来,中间件团队打算在三个方面对消息中间件进行迭代演进:
- 基于音讯网关能力丰盛现有平台性能个性,进行业务音讯治理。
- 过来五年中间件团队基于开源RabbitMQ进行了RabbitMQ的高可用建设,发现间接让业务方应用基于开源组件的SDK接入会带来SDK降级艰难,与后端消息中间件类型绑定的问题,将来咱们打算基于GPRC和音讯网关,实现音讯队列引擎服务化,业务无需关怀底层具体应用的开源消息中间件选型。
- 调研RocketMQ5.0计算与存储拆散构架,进行消息中间件架构的再降级。