消息发送

一、简单生产者

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

相关推荐
eggwyw5 小时前
C++中大括号的用法合集
开发语言·c++
xiaoye-duck5 小时前
《C++ 项目:手写大模型接入 SDK》本地 Ollama 部署与适配
开发语言·网络·c++·语言模型
特立独行的猫A5 小时前
13MB 单文件、一条命令变服务:把仓颉写的 cjh 内嵌进你的应用,当它的 AI 大脑
java·后端·python
Brookty5 小时前
Java博客项目实战|工程环境与构建:工程目录、PowerShell命令调用与JDK/IDEA/Maven工作机制
java·项目实战
联犀5 小时前
联犀 Go SIMD 实战:视频转码从 16.5ms 到 5.46ms
开发语言·golang·音视频
octopus_c6 小时前
STL 之 string:auto 与范围 for、常用接口、模拟实现与深浅拷贝
开发语言·c++·算法
Nerd(BUG版)6 小时前
KMP学习day5--Kotlin Flow异步流基础
开发语言·学习·kotlin
养军博客6 小时前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
TeamDev6 小时前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
J.YA6 小时前
String字符串[面试题]
java·开发语言