消息发送

一、简单生产者

生产者发送消息的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 推。

相关推荐
Code_Solitude1 小时前
c语言:指针(3)+冒泡排序
java·c语言·算法
乌暮1 小时前
从 `println` 到生产级日志:Spring Boot 日志体系完全指南
java·开发语言·jvm·spring boot·后端·学习·面试
脉动数据行情2 小时前
Java OkHttp 对接国际期货批量行情 SpringBoot 定时落库实践
java·spring boot·okhttp
星夜离尘562 小时前
MATLAB 定点量化误差实验 半个 LSB 的界限为什么挡不住削顶失真
开发语言·matlab
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 百度人脸识别:介绍
java·开发语言·交友
障碍的枫子2 小时前
我的第一个Agent
开发语言·python·langchain
Pniubi2 小时前
区分agent中长期记忆和偏好记忆
开发语言·ai·智能体
一枕槐安4872 小时前
大模型应用后端设计:上下文管理、缓存、降级策略的工程方案总结
java·spring·缓存
T_Apollo2 小时前
2.9 Java 25 版本新增特性和类
java