RocketMQ 使用教程
一、基础概念与架构
-
核心角色
- NameServer:无状态路由中心,负责 Broker 的注册与发现,与 ZooKeeper 不同,无强一致性要求。
- Broker:消息存储与转发节点,支持主从架构(如 Dledger 模式)实现高可用。
- Producer/Consumer:生产者发送消息,消费者拉取消息,均通过 NameServer 获取 Broker 路由信息。
-
Topic 与 Queue
- Topic 是逻辑概念,底层由多个 Queue(队列)组成,消息实际存储在 Queue 中,支持分布式存储与负载均衡。
二、快速入门
-
安装与启动
- 下载 RocketMQ 并解压,启动 NameServer 和 Broker:
nohup sh bin/mqnamesrv & nohup sh bin/mqbroker -n localhost:9876 &
- 下载 RocketMQ 并解压,启动 NameServer 和 Broker:
-
生产者发送消息
- 同步发送(可靠但延迟较高):
DefaultMQProducer producer = new DefaultMQProducer("group"); producer.setNamesrvAddr("localhost:9876"); producer.start(); Message msg = new Message("TopicTest", "Hello RocketMQ".getBytes()); SendResult result = producer.send(msg); producer.shutdown(); - 异步发送(高性能,需回调处理结果):
producer.send(msg, new SendCallback() { @Override public void onSuccess(SendResult sendResult) { /* ... */ } @Override public void onException(Throwable e) { /* ... */ } });
- 同步发送(可靠但延迟较高):
-
消费者订阅消息
- 集群模式:同 Group 内竞争消费,每条消息仅被一个 Consumer 处理。
- 广播模式:同 Group 内所有 Consumer 均消费同一消息。
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group"); consumer.subscribe("TopicTest", "*"); consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> { // 处理消息 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; }); consumer.start();
三、进阶功能
-
事务消息
- Half Message:生产者先发送预处理消息,Broker 存储到临时 Topic,待本地事务执行成功后提交。
- 事务状态回查:若生产者未提交/回滚,Broker 定时回调检查事务状态,确保最终一致性。
-
顺序消息
- 通过
MessageQueueSelector将同一业务键的消息发送到同一 Queue,消费时单线程处理:producer.send(msg, (mqs, msg, arg) -> mqs.get(arg.hashCode() % mqs.size()), orderId);
- 通过
-
消息持久化与高可用
- 同步刷盘(
flushDiskType=SYNC_FLUSH)确保消息写入磁盘后再响应生产者。 - Dledger 模式:基于 Raft 协议实现主从数据同步,避免单点故障。
- 同步刷盘(
RocketMQ 常见面试题
一、核心原理
-
RocketMQ 的消费模式是 Push 还是 Pull?
- 本质是 Pull(长轮询),Consumer 通过长连接主动拉取消息,Broker 若无消息则挂起请求,待新消息到达后立即返回。
-
如何保证消息不丢失?
- Producer:同步发送 + 重试机制(
setRetryTimesWhenSendFailed)。 - Broker:同步刷盘 + Dledger 主从同步。
- Consumer:手动 ACK,消费成功后再提交 Offset。
- Producer:同步发送 + 重试机制(
-
消息重复消费如何解决?
- 原因:网络重试、消费模式(不同 Group 重复消费)。
- 方案:业务层幂等(如数据库唯一键、Redis 分布式锁)。
二、设计与实践
-
如何实现顺序消费?
- 生产者指定同一 Queue,消费者单线程处理(如订单场景)。
- 示例:使用订单 ID 哈希选择 Queue。
-
消息堆积如何处理?
- 临时扩容 Consumer,或创建新 Topic 迁移积压消息。
- 注意:RocketMQ 消息默认 48 小时后清理(基于 CommitLog 访问时间)。
-
负载均衡机制
- Producer:随机选择 Queue,支持自定义路由策略(如哈希)。
- Consumer:平均分配、一致性哈希等算法,支持动态扩缩容。
三、高可用与扩展
-
Broker 高可用方案
- 主从复制(同步/异步) + Dledger 集群(基于 Raft)。
- NameServer 无状态,多节点部署避免单点故障。
-
分布式事务支持
- 事务消息通过 Half Message 和状态回查实现最终一致性,适用于订单、支付等场景。
参考资料
- 安装与配置:RocketMQ 官方文档
- 代码示例:优快云 博客
- 深入原理:RocketMQ 面试题汇总
580

被折叠的 条评论
为什么被折叠?



