常用MQ的区别
·
1)核心定位一句话
- Kafka:超高吞吐的分布式日志系统/流平台,强项在“海量数据管道 + 实时流处理”。
- RocketMQ:互联网场景的业务消息中间件,强项在“事务/延迟/顺序/可用性 + 易用运维”。
- RabbitMQ:AMQP 体系的通用消息代理,强项在“路由灵活 + 可靠投递 + 中小规模”。
- Pulsar:云原生的分布式消息/流一体,强项在“计算存储分离、多租户、跨地域”。
- ActiveMQ:老牌 JMS Broker,更多是“存量系统兼容/简单场景”。
2)对比维度(面试高频)
吞吐与延迟(大概方向)
- 吞吐:Kafka ≈ Pulsar(很强) > RocketMQ(强) > RabbitMQ(中等,偏低延迟) > ActiveMQ
- 端到端延迟:RabbitMQ(常见更低)≈ RocketMQ(可做到很低) > Kafka(依赖 batch/刷盘策略)
现实里:Kafka追吞吐;RabbitMQ追低延迟+灵活路由;RocketMQ在业务能力与性能之间平衡。
消费模型
- Kafka:消费者组(Consumer Group)+ 分区(Partition)并行;典型“拉取(poll)”。
- RocketMQ:消费者组 + 队列(MessageQueue);支持集群消费/广播消费;拉取为主。
- RabbitMQ:队列语义更强,“推送(push)”为主;prefetch 控流很关键。
- Pulsar:Subscription 模型更丰富(Exclusive/Shared/Failover/Key_Shared 等)。
顺序消息
- Kafka:分区内有序(同 key 进同 partition)。
- RocketMQ:支持严格顺序(通过队列选择器/顺序消费),业务用得多。
- RabbitMQ:单队列单消费者可保证顺序,但并发/重投递会破坏“全局顺序”。
- Pulsar:按 key/partition 维度可保证有序。
事务消息(业务一致性)
- RocketMQ:原生事务消息(半消息 + 回查)是其标志能力。
- Kafka:支持事务(EOS 语义)更多用于流处理/生产者幂等+事务写入,但业务“本地事务+消息”要自己设计 Outbox/CDC。
- RabbitMQ:有 publisher confirm、事务模式(性能差,实际很少用),业务一致性通常靠补偿/Outbox。
- Pulsar:有事务能力但生态/实践上不如 RocketMQ 在“业务事务消息”里常见。
延迟消息 / 定时消息
- RocketMQ:原生延迟消息(定级延迟/新版本更灵活),业务常用。
- RabbitMQ:靠插件/TTL+DLX 等组合实现(能做但要设计)。
- Kafka:通常用定时轮/延迟队列服务、或按时间分桶 topic,自研较多。
- Pulsar:支持 delayed delivery。
路由能力(topic/queue、交换机等)
- RabbitMQ:最强(Exchange:direct/topic/fanout/headers…),适合复杂路由。
- Kafka/RocketMQ/Pulsar:以 topic 为中心,路由相对简单,更多靠“多 topic + tag/key + 业务侧处理”。
可靠性语义(至少一次/恰好一次)
- RabbitMQ / RocketMQ / Kafka:工程上默认都更常做 At-least-once(至少一次),然后业务幂等兜底。
- Kafka:事务 + 幂等生产者 + exactly-once(多用于流处理链路)。
- RocketMQ:业务上通常强调“可靠投递 + 消费幂等 + 可追溯”。
生态与场景
- Kafka:大数据/日志/埋点/流处理(Flink/Spark/ksql 等)生态王者。
- RocketMQ:电商/支付/订单/库存等典型业务消息;国产互联网公司使用面广。
- RabbitMQ:企业集成、后台任务、微服务事件(特别是需要灵活路由)很常见。
- Pulsar:云原生、多租户、跨地域、消息+流统一,越来越多但需要更强运维能力。
- ActiveMQ:存量/JMS。
3)选型速记(直接可背)
- 海量吞吐 + 事件流/日志/埋点:选 Kafka
- 业务消息(事务/延迟/顺序/高可用):选 RocketMQ
- 路由复杂、低延迟、中小规模、AMQP 体系:选 RabbitMQ
- 云原生、多租户、跨地域、长期留存、消息/流一体:选 Pulsar
- 老系统 JMS 兼容:ActiveMQ
4)面试官常追问的“坑点提示”
- Kafka:分区决定并行度与有序粒度;扩分区会影响 key 分布与顺序;重平衡、消息积压处理要会。
- RocketMQ:顺序消息的队列选择与消费并发要配套;事务消息回查与幂等要讲清楚。
- RabbitMQ:prefetch/ack/requeue 会直接影响吞吐与“重复消费”;镜像队列/Quorum Queue 的权衡要知道。
- 所有 MQ:最终都要落到 幂等(去重)+ 重试 + DLQ + 可观测(堆积/延迟/失败率)。
更多推荐
所有评论(0)