rocketmq

RocketMQ 分布式消息队列部署与运维

补充说明

rocketmq 是 Apache 的分布式消息中间件,核心由轻量级 NameServer、负责存储与投递的 Broker、以及生产者和消费者客户端组成。Topic 在 Broker 上被切成多个 Queue(分区),同一 Queue 内有序,消费者组按 Queue 分配消费,因此 Queue 数决定消费并行度上限。

它擅长削峰、异步解耦、顺序消息、事务消息和延时/重试投递,Java 生态接入成本低。与 Kafka 相比,RocketMQ 提供原生的顺序、事务和定时消息,不依赖分区再平衡扩消费;与 RabbitMQ 相比,它更适合高吞吐、长时间堆积和分区顺序场景。

4.x 使用 Remoting 协议(10911),5.x 增加 Proxy 与 gRPC 接入,但 NameServer/Broker/Queue 的模型不变。生产上要显式建 Topic、关闭自动创建、按消费者并行度规划 Queue 数,并持续监控堆积、重试和 DLQ。

常用示例

export NAMESRV_ADDR=127.0.0.1:9876
nohup sh bin/mqnamesrv &
nohup sh bin/mqbroker -n 127.0.0.1:9876 -c conf/broker.conf &
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
sh bin/mqadmin clusterList -n 127.0.0.1:9876
sh bin/mqadmin brokerStatus -n 127.0.0.1:9876 -b 127.0.0.1:10911
sh bin/mqadmin topicStatus -n 127.0.0.1:9876 -t OrderTopic
sh bin/mqadmin topicRoute -n 127.0.0.1:9876 -t OrderTopic
sh bin/mqadmin updateTopic -n 127.0.0.1:9876 -c DefaultCluster -t OrderTopic -r 8 -w 8
sh bin/mqadmin consumerProgress -n 127.0.0.1:9876 -g order-consumer
sh bin/mqadmin resetOffsetByTime -n 127.0.0.1:9876 -g order-consumer -t OrderTopic -s 2026-01-01#00:00:00:000
sh bin/mqadmin sendMessage -n 127.0.0.1:9876 -t OrderTopic -p 'hello'

最小事务消息与顺序消费写法:

TransactionMQProducer txProducer = new TransactionMQProducer("tx-producer");
txProducer.setNamesrvAddr("127.0.0.1:9876");
txProducer.setTransactionListener(new TransactionListener() {
    public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        return LocalTransactionState.COMMIT_MESSAGE; // 本地事务成功才提交
    }
    public LocalTransactionState checkLocalTransaction(MessageExt msg) {
        return LocalTransactionState.COMMIT_MESSAGE; // 回查必须幂等
    }
});
txProducer.sendMessageInTransaction(new Message("OrderTopic", "body".getBytes()), null);

consumer.registerMessageListener((MessageListenerOrderly) (msgs, context) -> {
    // 同一 Queue 串行消费,返回 SUCCESS 或 SUSPEND_CURRENT_QUEUE_A_MOMENT
    return ConsumeOrderlyStatus.SUCCESS;
});
consumer.subscribe("OrderTopic", "*");
consumer.start();

常见配置

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
namesrvAddr=127.0.0.1:9876
deleteWhen=04
fileReservedTime=72
defaultTopicQueueNums=8
autoCreateTopicEnable=false
transactionTimeOut=6000
transactionCheckMax=15

brokerId=0 为主节点,大于 0 为从节点;brokerRole 取 SYNC_MASTER、ASYNC_MASTER 或 SLAVE。deleteWhen 与 fileReservedTime 默认分别为 04 点和 72 小时;transactionTimeOut 默认 6000ms、transactionCheckMax 默认 15;defaultTopicQueueNums 在 5.x 源码中默认为 8,旧版为 4,建议显式指定。

易错点与排错

相关命令

读完自测

  1. NameServer、Broker、Topic/Queue 各自负责什么?
  2. 顺序消息为什么要求同一业务键进入同一 Queue?
  3. 事务消息的本地事务结果未知时,Broker 如何确认?
答案
  1. NameServer 保存路由元数据;Broker 存储和投递消息;Topic 是逻辑分类,Queue 是并行与顺序的物理单位。
  2. 只有同一 Queue 内才保证顺序,消费者按 Queue 加锁串行消费;跨 Queue 没有全局顺序。
  3. Broker 定时回查生产者的 checkLocalTransaction,按提交、回滚或未知状态决定消息可见性。