工程实践 · 2021年9月4日 · 3 分钟

消息队列选型指南:RabbitMQ vs Kafka vs RocketMQ

三者特性对比与实际选型心路——合适的场景选合适的 MQ,别为了炫技加维护负担。

团队最近在做系统拆分,需要引入消息队列。一开始同事提了一句"用 Kafka 吧",我问他为什么,他说"大家都用啊"。于是花时间把主流的几个 MQ 过了一遍,记录一下选型的心路历程。

消息队列是什么

说白了就是把"同步调用"变成"异步发送"。以前是 A 调 B,B 返回结果 A 才继续——同步、耦合、B 挂了 A 也废。加一层 MQ 之后:A 发消息到队列,B 什么时候消费是 B 的事,A 不用等。

这就带来了三大好处:解耦削峰异步

三个选手

项目里主要考察的是 RabbitMQ、Kafka 和 RocketMQ。各有各的脾气。

消息可靠性高 ──────────────── 吞吐量大
     │                          │
  RabbitMQ                Kafka/RocketMQ
     │                          │
 适合业务消息              适合大数据/日志

RabbitMQ — Erlang 写的,社区最老牌,功能很齐全。它的核心概念是 Exchange 和 Queue,消息先到 Exchange,Exchange 根据路由规则投递给 Queue。

延迟消息要装插件(rabbitmq_delayed_message_exchange),这个有点烦,不过大部分场景够用了。我本地装了个试了下,管理界面挺直观,能看到每秒消息量、队列积压情况。就是事务消息不支持,要自己实现。

Kafka — 天生就是为高吞吐设计的。消息存在文件里,顺序写磁盘,速度比想象中快很多。给所有消息编号(offset),消费者自己维护消费到哪了,想回头读也能重读。

Kafka 的设计思路是"不要把消息当宝贝,适当丢点没事",所以传统业务系统用它做核心链路要三思。延时消息也不自带,要绕一下。另外它依赖 ZooKeeper(新版逐步去掉了),部署运维相对重。

RocketMQ — 阿里开源,Java 写的。如果你团队是 Java 技术栈而且消息可靠性要求很高,这个可能是最合适的。事务消息原生支持,延迟消息也自带,这些在电商场景很实用。

缺点嘛——生态比 Kafka 小,社区活跃度一般,碰到问题搜出来的讨论不太多。还有它的网管面板有点简陋,比 RabbitMQ 的管理界面差不少。

怎么选

场景 推荐
业务解耦,消息不能丢 RabbitMQ 或 RocketMQ
实时数据管道,海量日志 Kafka
Java 团队,事务消息需求 RocketMQ
小团队,运维成本敏感 RabbitMQ

我们最后选了 RabbitMQ,因为团队人不多,部署简单,而且消息量增长速度可预见——一年内每天撑死几十万条。Kafka 是屠龙刀,但我们眼下的需求切菜刀就够了。

总结

选型最怕的就是"别人都这么用"。没有一个 MQ 是万能药,合适的场景选合适的工具,别为了炫技给自己加维护负担。

继续阅读

评论