中间件速查手册
消息队列 · rocketmq

RocketMQ

为交易场景生的消息队列,事务和延迟消息是原生能力

消息队列Apache-2.0Java学习难度:中等

RocketMQ 是阿里在大促场景里磨出来的消息队列,双十一的峰值流量是它的主场。相比 Kafka,它把国内业务最常问的几件事做成了原生功能:事务消息、18 级延迟消息、严格顺序消息,还有一套很轻的路由中心 NameServer。

01

它解决什么问题

下单成功后要通知库存、积分、物流,还得保证“本地事务成功才发消息”。用 Kafka 要自己写本地消息表兜底,用 RocketMQ 一个事务消息就解决了。

真实场景:典型场景:用户下单,订单库写入成功后发一条事务消息,库存服务扣减。订单库回滚了,消息就不会被投递出去。

02

核心概念

每个概念一句话 + 一个类比。点击卡片看更详细的解释。

03

数据流转动画

跟着步骤看一条数据从进入系统到被处理完的完整路径,可以暂停、重播和调速。

Flow animation

生产者发消息 + 消费者组负载均衡

Producer订单服务NameServer路由注册中心Broker存消息Queue 0order-topicQueue 1order-topicQueue 2order-topicConsumer A组内成员Consumer B组内成员

← 左右滑动查看完整流程图 →

01 / 05
1. 拉取路由

Producer 向 NameServer 询问 order-topic 分布在哪些 Broker 上。

提示:注意 NameServer 只给路由、不存消息;Queue 才决定并行度和顺序。 悬停图中的节点可以看概念解释。

04

优劣势

短句说清适合什么、不适合什么,选型时先看这一栏。

适合什么
  • 原生事务消息,解决“本地事务 + 发消息”一致性
  • 原生 18 级延迟消息,订单超时关单不用自己扫表
  • 单 Queue 严格有序,顺序消费开箱可用
  • NameServer 无状态,运维比 Kafka 的 ZK 轻
不适合什么
  • 吞吐低于 Kafka,社区和生态规模也小一些
  • 延迟消息只有 18 个固定档位,不能任意秒数
  • 客户端以 Java 为主,其他语言 SDK 相对弱
  • Topic 数量过多时性能下降明显
05

常见使用场景

每个场景都配一句「为什么用它」。

01

订单超时自动关单

下单时发一条 30 分钟延迟消息,到点消费,检查状态后关单。

为什么用它:延迟消息是原生能力,不用自己写定时扫表任务。

02

分布式事务最终一致

订单库写入后发事务消息,库存服务消费扣减,失败则回查补偿。

为什么用它:半消息 + 回查机制保证“本地事务成功,消息一定发出去”。

03

大促削峰

秒杀请求先进 MQ,后端按自己的能力慢慢消费。

为什么用它:RocketMQ 在阿里双十一场景验证过,堆积能力强。

06

同类对比

和同赛道的组件并排看,差异一目了然。

KafkaRocketMQRabbitMQ

一句话:吞吐选 Kafka,业务语义选 RocketMQ,路由灵活和轻量选 RabbitMQ。三者不是替代关系,很多公司同时用两个。

打开对比页
07

常见问题

上手第一个月最容易卡住的地方。

Q1顺序消费怎么实现?

发送时用 MessageQueueSelector 按订单号把同一订单的消息投到同一个 Queue,消费端用 MessageListenerOrderly 加锁顺序消费。注意:全局顺序要把 Topic 设成 1 个队列,几乎没人这么做。

Q2延迟消息怎么用?

发消息时设置 delayTimeLevel(1~18,对应 1s 到 2h)。RocketMQ 5.x 支持任意时间定时消息(timer message),需要 Broker 开启 timerWheel 支持。

Q3事务消息的原理?

先发半消息(对消费者不可见)→ 执行本地事务 → 提交或回滚。如果 Broker 没收到确认,会定时回查生产者的本地事务状态,最多 15 次,仍未知则丢弃并告警。

Q4广播模式和集群模式的区别?

集群模式(默认)组内分摊,一条消息只被一个消费者处理;广播模式每个消费者都收全量,offset 存在本地。广播模式不能做消息重投,也不保证消费进度。

Q5消息堆积了怎么办?

先看是消费慢还是消费挂了。消费慢就加消费者(不超过 Queue 数)或提高批量拉取;Queue 不够就扩容 Queue。RocketMQ 堆积不影响写入,但磁盘满了会拒绝写入。