一、简单生产者
生产者发送消息的6步流程(缺啥补啥):
public class Producer {
public static void main(String[] args) throws Exception {
// ① 谁来发?------创建生产者,指定生产者组
DefaultMQProducer producer = new DefaultMQProducer("group1");
// ② 发给谁?------指定 NameServer 地址(路由中心)
producer.setNamesrvAddr("localhost:9876");
producer.start(); // 必须 start,否则发不了
// ③ 发什么?------构造 Message
String msg = "hello world";
Message message = new Message("topic1", "tag1", msg.getBytes());
// ④ 怎么发?------send() 发送
SendResult sendResult = producer.send(message);
// ⑤ 发的结果?------打印 SendResult(含 msgId、发送状态)
System.out.println(sendResult);
// ⑥ 打扫战场------关闭生产者释放资源
producer.shutdown();
}
}


关键点 :producer.send() 是同步发送 ,发完即拿到 SendResult。
二、简单消费者
public class Consumer {
public static void main(String[] args) throws Exception {
// ① 谁来收?------Push 模式消费者
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");
// ② 从哪收?------指定 NameServer
consumer.setNamesrvAddr("localhost:9876");
// ③ 收什么?------订阅 Topic,"*" 表示匹配所有 Tag
consumer.subscribe("topic1", "*");
// ④ 怎么处理?------注册消息监听器
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(
List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
System.out.println(new String(msg.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
// ⑤ 启动消费者
consumer.start();
// ⚠️ 千万别关!消费者需要一直运行等待消息推送
}
}

关键点:消费者不能关!它是长连接,持续监听服务端推送的消息。
三、消费模式:集群 vs 广播
3.1 集群模式(CLUSTERING,默认)

同一个 ConsumerGroup 内的多个消费者实例分摊 消费消息,每条消息只被组内一个消费者消费。
启动两个同组消费者实例(IDEA 勾选 "Allow parallel run"):



结果:10条消息,一人分到5条 → 负载均衡
3.2 广播模式(BROADCASTING)

像微博明星发帖,所有粉丝都能收到 。每条消息会被组内所有消费者都消费一次。

consumer.setMessageModel(MessageModel.BROADCASTING);

结果:10条消息,两个消费者都收到了10条。

|------|--------------|-------------|
| 对比维度 | 集群模式(默认) | 广播模式 |
| 消费方式 | 负载均衡,一人一份 | 全员复制,每人全量 |
| 适用场景 | 订单处理、削峰填谷 | 配置刷新、缓存更新通知 |
| 消费进度 | 服务端维护 offset | 客户端本地维护 |
| 消息重试 | 支持 | 不支持 |
四、多生产者模式
不管哪个生产者组,只要发到同一个 Topic,该 Topic 的消费者组就能全收到。
五、核心概念速查表
|--------------------|----------------------------------|
| 概念 | 说明 |
| NameServer | 路由注册中心,无状态节点,所有组件向它注册 |
| Producer Group | 生产者组,多实例统一标识 |
| Consumer Group | 消费者组,集群模式下组内负载均衡 |
| Topic | 消息主题,一类消息的逻辑分类 |
| Tag | 消息标签,Topic 下的二级分类(过滤用) |
| Message | 消息体 = Topic + Tag + Key + Body |
| MessageExt | 消费端收到的消息扩展对象(多了 msgId、queueId 等) |
六、Push vs Pull 两种消费模式
|--------|-------------------------|-------------------------|
| | Push(推) | Pull(拉) |
| 实现类 | DefaultMQPushConsumer | DefaultMQPullConsumer |
| 消息获取方式 | Broker 主动推送 | 消费者主动拉取 |
| 实时性 | 高 | 可控 |
| 系统压力 | 可能被消息淹没 | 拉取间隔需权衡 |
| 常见用途 | 绝大多数业务场景 | 特殊场景(如批量拉取) |
注意:RocketMQ 的 Push 模式底层也是 Pull 的封装(长轮询),不是真正由 Broker 推。