每隔一段时间,团队群里就会冒出同样的问题:项目要上消息队列了,到底选 Kafka、RabbitMQ 还是 RocketMQ?我见过太多人在这个选型上反复开会、争论半天,最后选了个“名气大”的,结果用起来处处别扭。其实这问题本身就不该这么问,因为消息队列这三大件,虽然都叫“队列”,但从诞生背景、设计目标到数据模型,完全是三个物种。我做中间件运维和架构好几年,三个队列都在生产环境深度用过,也踩过不少坑,这篇就从一个实际做选型的人的角度,把三者从架构模型、功能特性、性能运维三个维度摊开来横评,最后附上可以直接照着做的决策清单。
1. 先说结论:这三者根本不是同一个“队列”
1.1 消息队列的三大作用,先对齐底层认知
聊选型之前,得先明确消息队列到底在系统里承担什么角色。大多数人张口就来的“三大作用”是:异步解耦、削峰填谷、数据分发。这六个字不只是面试答案,而是选型时判断“我到底需不需要消息队列”的三把尺子。
异步解耦好理解,比如用户下单后要发短信、发邮件、加积分,如果同步调三个服务,接口耗时直接翻倍,任何一个下游挂了订单就失败。中间加个队列,订单服务只管写消息,下游各自订阅就行。
削峰填谷则是应对流量毛刺。比如秒杀场景,瞬间十万请求打过来,订单数据库扛不住,前面加队列把请求先存下来,后端按自己的消费能力慢慢处理。这时候你对队列的要求是“能扛住瞬时写入高峰”。
数据分发则是把一份消息复制给多个下游。典型就是订单数据同时给到大数据平台、搜索服务、推荐服务。消息队列天然支持发布订阅,比业务方挨个去调接口优雅得多。
把这三件事想清楚之后,再回头看三个产品,你会发现它们的侧重点完全不一样:Kafka 是冲着海量吞吐去的,RabbitMQ 是冲着灵活可靠的路由去的,RocketMQ 则是为了在电商大流量和事务一致性之间找平衡点。
1.2 出身不同,导致性格不同
我特别喜欢从出身看产品,因为早期设计者面对的痛点,往往决定了这个系统最擅长什么。
Kafka 是 LinkedIn 当年为了解决日志收集问题开发的,那时他们的日志量巨大,要求的是顺序写盘、高吞吐、可回溯。这个背景决定了 Kafka 的设计核心是“日志即存储”,分区追加写、offset 记录消费位置、消息不因消费而删除。所以它天生适合做数据管道、日志归集、流计算,而不是精打细算的业务消息流转。
RabbitMQ 出身于金融业务场景,用的是 Erlang 语言,最初基于 AMQP 协议设计,核心是 Exchange、Binding、Queue 这一套路由体系。它讲究的是消息怎么被灵活地路由到不同队列,怎么保证投递可靠、消费确认可靠。所以它更适合业务系统内部复杂的消息路由和模块解耦,吞吐量不是它的强项。
RocketMQ 则是阿里为了解决电商业务“既要高吞吐,又要消息可靠,还要支持事务和延迟消息”这种复合需求做的。它借鉴了一些 Kafka 的思想,但保留了大量面向业务的特性:延迟消息、事务消息、重试队列、消息轨迹。可以说它是站在 Kafka 的肩膀上,往“业务友好”方向走了很远的产物。
1.3 选型的第一条原则:匹配问题,而不是崇拜明星
很多团队选型失败,不是技术不过关,而是把选型变成了“信仰之争”。因为在后端圈子里,Kafka 自带“大数据”、“高并发”的光环,RabbitMQ 看起来老派,RocketMQ 则是阿里背书。但实际做架构决策的人最清楚:没有最好的队列,只有最匹配当前业务形态和团队能力的队列。后面的内容我不给你背口诀,而是把架构、功能、运维这三块的真实差异讲透,你自己就能得出结论。
2. 维度一:架构模型与数据存储方式,决定你能扛多大流量
2.1 Kafka:分区日志模型,把“追加写”做到了极致
Kafka 最底层的数据单元是 Topic,每个 Topic 可以拆成多个 Partition,每个 Partition 就是一个有序的、不可变的日志文件,消息不断追加到日志尾部,消费者通过记录 offset 来知道消费到哪了。
这个模型有几个直接后果。第一,写入是顺序追加的,配合操作系统的 Page Cache 和零拷贝技术,吞吐量可以做到非常夸张,单机百万条每秒并不是什么神话。第二,消息不会被消费掉就删除,而是按照保留时间或大小滚动清理,这意味着你可以随时回溯到某个历史 offset 重新消费,这是 Kafka 做数据管道和日志分析的重要前提。第三,分区是并行度的来源,同一个 Topic 的分区数决定了最大并发度。
但分区的另一面是:Kafka 的分区是有序的,全局则是无序的。你要保证某个业务主键的消息有序,就得用 key 哈希让同一 key 进同一分区;如果你要全局有序,就只能用一个分区,那性能和分布式优势就白费了。此外,Kafka 原生没有延迟消息、没有死信队列这些业务语义,它把这类问题抛给了上层应用自己解决。这个我会在维度二详细展开。
2.2 RabbitMQ:交换机路由模型,灵活但是消费后即焚
RabbitMQ 的架构核心是 Exchange、Binding、Queue。生产者不直接发消息到队列,而是发到 Exchange,由 Exchange 根据 Routing Key 和 Binding 规则把消息路由到一个或多个队列上。
这个设计在业务系统里特别好用。比如一个“订单创建”事件,你可以把它路由到“短信队列”、“邮件队列”、“报表队列”,也可以通过 Topic Exchange 支持通配符匹配,“order.created” 路由到订单相关队列,“order.*” 再路由到监控队列。这种灵活度是 Kafka 和 RocketMQ 原生不容易做到的东西,尤其是在多业务方、多路由策略的场景。
但代价也明显。RabbitMQ 的消息一旦被消费者确认,就基本从队列里删除了,不像 Kafka 那样能保留很久、随时回放。虽然它有 TTL、死信路由、优先队列这些很完善的业务特性,但从数据保留和回溯的角度看,它更像一个“传输通道”而不是“数据日志”。这也导致它不太适合做大数据链路的数据总线,一旦某个下游崩溃时间较长,队列挤压的数据可能已经超过了容量上限。
2.3 RocketMQ:逻辑队列加物理共享存储的折中设计
RocketMQ 的存储模型是理解它“又高吞吐又带业务特性”的关键。它的消息物理上是全部顺序写入同一个 CommitLog 文件,相当于所有 Topic 共享一个大的追加写文件;但逻辑上又按 Topic 和 MessageQueue 建立了 ConsumeQueue 索引,消费者从逻辑队列上拉取消息时,先去 ConsumeQueue 拿到 CommitLog 的物理偏移,再去 CommitLog 读数据。
这跟 Kafka 每个分区一个日志文件的方案比起来,优点是一个 Broker 上即使有几千个队列,底层依然只有顺序写,不会因为队列数量多而把随机写放大到不可控。这也是 RocketMQ 能在 Kafka 式吞吐基础上,还保留大量业务能力的原因。事务消息、延迟消息、消费重试这些东西都建立在中间件对消息的主动管理之上,而不是完全交给客户端自己去折腾。
当然,这个模型也带来一些运维上的讲究,比如 CommitLog 文件一般都要预留较大磁盘,消息清理策略也要小心配置,不能让它把一个 Broker 磁盘写满后让整个 Broker 不可用。
2.4 三者一致性、可靠性与重复消费语义对比
聊到可靠性,必须先说清楚一个共识:消息中间件默认都会丢场景和重复场景,只是程度和应对方式不同。Kafka 通过副本机制保证消息在 broker 之间的多副本冗余,配合 acks=all 和 min.insync.replicas 可以做到比较强的持久化;RabbitMQ 有 publisher confirm 和 consumer ack 机制,生产者可以确认消息进了 broker,消费者处理完再确认删除;RocketMQ 则是主从复制加同步刷盘/异步刷盘组合。
但“不丢”和“不重”是两回事。三者几乎都是“至少一次(at least once)”语义,意思是极端情况下可能重复投递。消费者要做幂等,这是我们面试里最常见的考点,也是实战里躲不开的基本功。
我一般会让团队把所有消费者都按“可能重复”来写:处理前先查状态、用数据库唯一键防重、Redis setnx 加锁、或者记录消息 ID 到本地消息表。这个设计做完,即便队列层面发生了 rebalance、ack 丢失之类的重复投递,业务也不会乱。
| 对比项 | Kafka | RabbitMQ | RocketMQ |
|---|---|---|---|
| 存储模型 | 每分区独立日志文件 | 队列独立存储,消费确认后删除 | 共享 CommitLog + 逻辑 ConsumeQueue |
| 消息回溯 | 支持按 offset、时间点回溯 | 基本不支持回溯 | 支持按时间回溯 |
| 消费模型 | 拉取(pull) | 推拉结合 | 拉取(pull) |
| 顺序性 | 分区内有序 | 单队列有序 | 队列内有序 |
| 路由灵活性 | 弱 | 极强 | 中 |
| 集群模式 | 分布式天然横向扩展 | 镜像队列 / 仲裁队列 | 主从 + 多副本 DLedger |
| 消息清理 | 基于时间/大小保留 | 消费即删 | 基于时间/大小保留 |
3. 维度二:功能特性对比,日常开发最看重的能力
3.1 延迟消息与定时消息:谁开箱即用
很多人搜索“Kafka 如何延迟 30 分钟消费”,就是因为 Kafka 原生根本没有延迟消息能力。你要实现“订单超过 30 分钟未支付就关单”这种需求,常见方案无非是:
- 把执行时间戳放进消息体,消费者拉取后判断时间没到就 sleep 或重新放回队列;
- 用 Redis ZSet,把执行时间作为 score,起一个轮询任务取出到期消息再投递;
- 发到一个临时延迟 Topic,用定时任务扫表把到期消息搬迁到正式 Topic。
这些方案都不复杂,但都有一个通病:延迟精度、可靠性、运维复杂度都得自己扛。万一服务重启、Redis 数据丢了,延迟任务跟着丢,没人帮你兜底。
RocketMQ 则直接把延迟消息做成了内建功能。它支持 18 个延迟等级(1s、5s、10s、30s、1m、2m、3m、4m、5m、6m、7m、8m、9m、10m、20m、30m、1h、2h),发送时指定 delayLevel 即可,中间件本身负责到了时间才让消费者看到。缺点是等级是固定的,如果你想延迟 50 分钟就得升级到“1h”档,精确到秒级的任意延迟还是做不到。
RabbitMQ 的做法是靠 TTL + 死信队列来模拟,或者启用官方延迟插件rabbitmq_delayed_message_exchange。前者本质是消息在普通队列里等着过期,过期后被路由到真正的业务队列;后者是插件里维护了一个延迟索引,到了时间才投递。两者都能实现,但配置链路明显长一些,还要额外考虑插件版本和集群兼容问题。
所以如果你明确知道业务里大量依赖延迟消息,选型时 RocketMQ 一定是加分项。这是“省钱省事”的功能价值,不能光比吞吐量。
3.2 死信、重试与消息轨迹:出问题时怎么定位
生产环境里,消息消费失败是常态。我见过很多团队把失败消息直接打印日志就 ack 了,等业务方发现对不上账再跑批修复,非常被动。一个好的消息队列应该帮你把失败消息“兜住”,让你能可视化看到它卡在哪、重试了几次、最后去哪了。
RabbitMQ 的 DLX(死信交换机)是把被拒绝、TTL 过期、队列溢出等消息转移到死信队列,开发者在死信队列里写个消费者单独告警和分析。RocketMQ 则是每个消费组默认带一个重试队列,消费失败会自动按级别重试,重试多少次还失败就进死信队列(DLQ)。Kafka 本身没有死信概念,最主流的是自己建一个dlq-topic,消费者 catch 到异常后手动把原始消息发过去,Kafka 社区把这种模式叫做 DLT。
另外,排查“消息到底哪来的、到没到、谁消费了”这类问题,RocketMQ 控制台自带的消息轨迹功能很好用,能直接按消息 ID 查投递链路。RabbitMQ 的 traces 功能需要手动开启,Kafka 则基本没有直观的全链路消息轨迹,只能靠客户端日志和外部埋点。
我有一次在生产环境排一个“用户收到重复优惠券”的问题,就是因为消费者处理逻辑没做幂等,而队列重试把同一消息投了多次。如果当时用的是 RocketMQ 的轨迹功能,一眼就能看到重试了几次;Kafka 就得去翻各种日志拼时间线了。功能层面的差异,会在排障的时候被放大得非常明显。
3.3 顺序消息、事务消息、广播消息的支撑
这三类特殊消息,是选型时容易忽略但真到用时会卡住的地方。
顺序消息。聊到顺序,大家最爱提 Kafka,因为分区内天然有序。但要注意它只能保证“分区内有序”,你需要自己设计 key 的粒度,同一个业务号走同一个分区。RocketMQ 则提供了 MessageQueueSelector,发送时自己选队列,用法上更明确。RabbitMQ 要保证顺序基本就是单队列单消费者,吞吐量会受限,适合顺序要求高但量不大的场景。
事务消息。RocketMQ 的事务消息是它最出圈的能力之一:先发半消息(half message),业务本地事务执行成功后再 commit,失败就 rollback,中间件还会定时回查业务方确认最终状态。这解决了“本地数据库操作”和“发消息”这两个动作的一致性。Kafka 的事务 API 更偏向 producer 端的原子可见性,和 RocketMQ 这种“业务事务通知”不是同一个场景。RabbitMQ 则没有事务消息这个层级,一般要靠本地消息表或业务自己补偿。
广播消息。一个消息想被所有消费者实例各处理一遍,这是广播模式。Kafka 的广播是通过给每个实例单独分配一个消费组实现的;RocketMQ 支持 BROADCASTING 模式;RabbitMQ 的 fanout 交换机天生就是广播语义。
4. 维度三:性能、运维与生态,跑起来之后才知道的真相
4.1 吞吐与延迟的实测体感
网上张口就是“Kafka 百万 TPS”,但这种数字只有在极端压测条件下才成立。实际生产里,我见过有人用默认配置把 Kafka 用得比 RabbitMQ 还慢,也有人把 RocketMQ 调得接近 Kafka 的水平。配置和场景决定了最终效果。
就体感来说,三个队列的量级分界大概是:业务消息、异步任务、系统间解耦,日消息量在几百万到几千万条,RabbitMQ 完全够用,别为了吞吐去加复杂度。这个量级下 RabbitMQ 的确认机制、管理界面带来的开发效率,比省那点毫秒延迟重要得多。
到了日志归集、埋点数据、CDC 数据同步这种动辄每天上亿条的场景,Kafka 的追加写模型优势会彻底体现出来。它的瓶颈通常不在写入,而在消费者处理速度和 rebalance 时机。RocketMQ 居中,单机吞吐量比 RabbitMQ 高一截,又保留了丰富的业务语义,所以阿里的电商链路里它能扛住双十一的峰值流量。
延迟方面,RabbitMQ 的端到端延迟通常是最低的,因为它是即时推送给消费者的;Kafka 为了实现批量高吞吐,默认会攒一批数据再发,所以单条消息延迟会比 Rabbit 稍高;RocketMQ 也类似,需要拉取。注意,这里说的延迟差异是毫秒级到几十毫秒级,绝大多数业务根本感知不到,但如果你有“毫秒级触发”这种硬指标,RabbitMQ 会更合适。
4.2 部署与可视化管理:三者的搭建差异
选型不能只看性能,运维体验直接决定团队日常幸福感。
RabbitMQ 是最容易上手的。装完 Erlang 再装 RabbitMQ,启动之后开个rabbitmq_management插件,浏览器访问 15672 就能看到队列、连接、消费者、消息速率,清晰得不能再清晰。本地开发和 Debug 周期非常短,这也是为什么很多中小团队的第一套消息中间件是它。
Kafka 的部署复杂度这三四年降了不少。老版本要单独装 ZooKeeper,新版本 3.3+ 支持 KRaft 模式,一个docker run就能把 Kafka 拉起来,不再依赖 ZooKeeper。可视化工具里我常用的几个:kafka-ui(provectus 出的,界面现代,能看 topic、消费组、消息内容)、Offset Explorer(原 Kafka Tool,客户端工具,适合本地看消息)、Kafka Eagle(适合集群监控)。IntelliJ IDEA 里也有 Kafka 插件,连上集群直接看消息,本地调试方便得很。
RocketMQ 的部署要分 NameServer 和 Broker 两部分,稍微绕一些。Docker 部署时最容易踩的坑是内存问题,因为 Broker 的启动脚本默认给 JVM 分了 8G 堆内存,不加限制直接启动一个 2G 内存的机器,进程会立刻 OOM。正确做法是启动前把runbroker.sh里的-Xms和-Xmx调小,比如 512m 或 1g。可视化方面用 rocketmq-dashboard(前身是 rocketmq-console-ng),可以查看 Topic、消费进度、消息轨迹,还支持直接在界面上发送测试消息。
4.3 客户端生态与 Spring Boot 集成
团队的技术栈决定了你包装消息队列的成本。Java 后端几乎都要考虑 Spring Boot 集成,这里我列一下三者的典型写法,你感受下哪个和团队的代码习惯更贴合。
Kafka 用spring-kafka,配置核心是bootstrap-servers和consumer.group-id。生产里我强烈建议把enable-auto-commit设为 false,手动确认 offset,不然消费者一挂就丢消息。消费逻辑通常写一个标注了@KafkaListener(topics = "...")的方法。
RabbitMQ 用spring-boot-starter-amqp,声明 Exchange、Queue、Binding,然后用@RabbitListener(queues = "...")写消费者。它和 Spring 的契合度是最自然的,因为本身就是一个面向业务消息的产品。
RocketMQ 官方有rocketmq-spring-boot-starter,用@RocketMQMessageListener(topic = "...", consumerGroup = "..."),发送时用rocketMQTemplate.convertAndSend(topic, message)。写法和前两者几乎一样,只是注解不同。
另外提一个常见业务:MySQL 的 binlog 通过 Canal 同步到消息队列,下游用 Spring Boot 消费。国内团队基本都选 Kafka 做这个链路,因为 Canal 对 Kafka 的适配最成熟,而且数据量普遍不小,还需要根据 binlog 文件位点做回溯。这种场景只有 Kafka 的“保留和回放”能力才最顺手。
5. 场景决策指南:业务问题直接对照着选
5.1 日志归集、CDC 与实时数仓:Kafka 当仁不让
如果你需要把 N 台服务器日志收集到 ClickHouse、ES,或者让业务表变更实时同步到数仓,Kafka 基本不用考虑别的选项。日志系统追求的是:高吞吐写入、消息不丢、可回溯、多个下游(ES、数仓、监控)各取所需。Kafka 的分区 + offset + 保留策略就是为这个场景设计的,和 Flink、Spark Streaming 的配合也是生态最成熟的。
5.2 异步解耦与灵活路由的经典业务:RabbitMQ 很顺手
如果你做的是一个典型的业务系统,比如 OA、电商后台、企业应用,需要让订单服务、通知服务、库存服务解耦,消息流向还不是简单的“广播”,而是带着路由规则的,RabbitMQ 的体验是最顺畅的。它的管理界面、死信路由、优先级队列、即时推送这些能力,让业务团队能以很低的成本把事情做对。团队规模不大、运维资源有限的时候,别碰 Kafka 那套分区调优,RabbitMQ 能让你少熬很多夜。
“什么场景会用到 RabbitMQ”这句话可以用一句话讲清楚:需要灵活路由、想快速上手、消息吞吐量在百万级以下,且重视消息确认机制的普通业务系统,选 RabbitMQ 都不会错。
5.3 交易、订单、延迟消息与事务:RocketMQ 稳
如果你的业务是电商交易、支付回调、订单超时未支付关闭、优惠券过期,这类场景同时踩中了三个需求:要有可靠的事务消息保证本地操作和消息一致;要有延迟消息实现超时关单;还要在秒杀这类瞬时流量下有足够的吞吐。这三个需求加在一起,结论非常清楚,就是 RocketMQ。
我和团队之前维护过一个订单状态机系统,所有状态变更都通过消息通知下游,下游再回调更新。中间如果消息发早了、重了、缺了,状态就会乱。RocketMQ 的事务消息和重试机制帮我们省掉了大量自研补偿逻辑,这是对比之后才体会到的价值。
5.4 高频问题“答案速查”:重复消费、延迟消费、堆积和面试题
这里顺手把几个典型的“字面问题”串起来,方便你在选型评审或者面试时直接引用。
消息队列重复消费怎么解决:确认机制丢失、rebalance、网络重试都会导致重复。解法不是“换个队列”,而是消费者做到幂等:数据库唯一键、Redis SetNX、业务状态机判断、本地消息表。Kafka 的幂等 producer 和事务 API 只是避免 producer 端重复发送,消费端重复依然需要业务幂等。
Kafka 如何延迟 30 分钟消费:Kafka 不支持原生延迟消息,实际项目用 Redis ZSet 存到期时间戳,由调度进程到点投递到正式 Topic;或者把“到期时间”字段放进消息,消费者 poll 到但不到时间就不处理。RocketMQ 直接用 delayLevel,比如 30m 档位,代码一行搞定。
RabbitMQ 如何取当前重试次数:Spring AMQP 重试后消息头里会带x-death数组,里面记录了消息被拒绝对次数和原因,读取它就能判断这是第几次重试。
Kafka 消息延迟高怎么办:先看消费者是否有慢处理阻塞了 poll,再看 broker 磁盘和网络是否成了瓶颈,最后看分区数是否不够导致消费并发不足。常见优化是调大fetch.max.bytes、合理设置linger.ms和batch.size,以及给消费者加实例。
这些问题在笔试题里出现频率极高,但它们背后其实都是同一件事:消息投递语义和业务幂等。能把这件事讲清楚,比背一百个面试答案都有用。
6. 这些年踩过的坑和一条可以直接抄走的选型清单
6.1 从 RabbitMQ 迁到 Kafka:一次典型的踩坑记录
我以前维护过一套系统,一开始用的 RabbitMQ,后来因为日志量暴涨决定迁到 Kafka。迁移之后第一周就踩了个大坑:RabbitMQ 消费者是即时推送,消费失败会阻塞队列;Kafka 是主动拉取,消费者处理不过来时,Kafka 不会“帮”你背压,而是不断把积压的消息堆在分区里,partition offset 越拉越远。我们把消费端线程池改成带阻塞队列的异步模型,同时把消费并发度提上去,才缓过来。
这个经历让我意识到:Kafka 不是把消息“推”给你,而是把消息“放着让你来拿”。它对消费者的要求更高,你必须有完善的监控和积压告警,否则哪天业务高峰一过,你打开监控才发现消费已经落后几小时了。
6.2 部署与集成中的高频坑位清单
把生产环境里高频踩的坑列一个清单,希望你不用重走一遍:
- RabbitMQ 启动失败:八成是 Erlang 版本和 RabbitMQ 版本不匹配,或者主机名变了导致 cookie 对不上,再就是 5672 端口被占用。Windows 上装完最好先跑
rabbitmq-diagnostics status看节点名。 - Kafka 报
error while fetching metadata with correlation id:核心原因一般是客户端连不上 broker 地址,broker 注册的是内网 IP,而客户端从外部访问;或者advertised.listeners没配对外地址。Docker 部署时用KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092是最常见的解法。 - RocketMQ Broker 内存泄漏/启动即 OOM:启动脚本默认 8G 堆,小机器必须改小。另外 Broker 磁盘满会直接导致写入失败,提前做磁盘水位告警很重要。
- rocketmq-dashboard 打包报
java.io.EOFException: SSL peer shut down:大多是 Maven 从远程仓库拉依赖时握手失败或镜像源失效,换国内镜像源、清理本地仓库再重打即可。 - Docker 装 Kafka 不想用 ZooKeeper:用 KRaft 模式,Kafka 3.3 之后的镜像都可以单实例直接跑,不需要再起 zookeeper 容器。
6.3 选型清单:把需求排个序,答案自己会冒出来
最后给你一套我用过很多次的选型决策路径,建议直接打印出来作为评审标准。它不是让你背结论,而是逼你把需求一条条写清楚,答案自然就出现了。
| 决策问题 | 如果答案是“是” | 如果答案是“否” |
|---|---|---|
| 日消息量级是否超过几千万条、是否需要长期保留和回溯 | 优先 Kafka | 继续看下一个问题 |
| 业务是否需要灵活的路由规则、团队是否希望简单运维 | RabbitMQ 更顺手 | 继续看下一个问题 |
| 业务是否强依赖延迟消息、事务消息、死信重试 | RocketMQ 优势最大 | 继续看下一个问题 |
| 团队技术栈是否偏 Java、是否有大数据/Flink 链路 | Java 偏 RocketMQ、大数据偏 Kafka | 重新评估自己是否真的需要消息队列 |
| 是否需要对接 Canal、Flink、ES 等数据生态 | Kafka 生态最完整 | 按业务功能优先选 |
我在实际选型中最常用的组合是:核心业务异步解耦用 RabbitMQ 或 RocketMQ,数据通道和流式处理用 Kafka。你甚至可以同时部署两套,各司其职,这并不丢人。整套选型流程跑下来,真正决定结果的往往不是“哪个产品牛”,而是你的团队有多少精力去维护它、你的业务到底有没有用上它最擅长的能力。
如果你现在还在纠结,我建议你先别急着定,把一个最核心的业务场景画出来,把流量估算做出来,再对着上面这张表过一遍。我就是这么一步步把三套队列摸透的,也希望这份横评能让你少走点弯路。