消息类型

RocketMQ 提供5种消息发送方式,根据业务对可靠性 和实时性的不同要求选择。

一、同步消息(Sync)

特征:发送后阻塞等待 Broker 返回结果,有回执才继续。

  • 适用场景:重要通知(短信、转账成功通知)
  • 优点:可靠性最高,发送方知道消息一定到达
  • 缺点:发送方阻塞,吞吐量较低
复制代码
SendResult result = producer.send(message);  // 同步阻塞等待

之前写的所有 producer.send() 默认就是同步消息。


二、异步消息(Async)

特征:发送后不阻塞,结果通过回调函数异步返回。

  • 适用场景:响应时间敏感但对结果即时性要求不高的场景(订单中间状态更新)
复制代码
producer.send(message, new SendCallback() {
    @Override
    public void onSuccess(SendResult sendResult) {
        System.out.println("发送成功: " + sendResult);
    }
    @Override
    public void onException(Throwable e) {
        System.out.println("发送失败: " + e.getMessage());
    }
});
// 这里不会阻塞,先执行下面的代码,等结果回来才回调上面

执行顺序 :先执行 send() 下面的代码 → 等 Broker 返回结果 → 再触发回调 onSuccess/onException。

所以日志是"先发完下面的,再打印上面的回调结果"。

报错 MQClientException 是因为异步回调还没执行完,producer 就被 shutdown 了。解决方案:主线程等待一段时间再关闭。


三、单向消息(Oneway)

特征:只管发,不需要任何回执,不关心结果。

  • 适用场景:日志收集、埋点数据等允许丢失的场景
  • 优点:吞吐量最高
  • 缺点:不保证到达
复制代码
producer.sendOneway(message);  // 发了就忘,无返回值

四、延时消息(Delay)

特征:消息发送后不会立即投递给消费者,而是等待指定时间后再投递。

  • 适用场景:订单超时取消(30分钟未支付)、定时提醒
复制代码
message.setDelayTimeLevel(3);  // 延时等级 3 = 10s
producer.send(message);

RocketMQ 不支持任意时间的延时,只支持预设的18个延时等级:

|-------|-----|-------|----|-------|-----|
| level | 延时 | level | 延时 | level | 延时 |
| 1 | 1s | 7 | 3m | 13 | 9m |
| 2 | 5s | 8 | 4m | 14 | 10m |
| 3 | 10s | 9 | 5m | 15 | 20m |
| 4 | 30s | 10 | 6m | 16 | 30m |
| 5 | 1m | 11 | 7m | 17 | 1h |
| 6 | 2m | 12 | 8m | 18 | 2h |

需要自定义延时时间?可以修改 Broker 配置 messageDelayLevel。


五、批量消息(Batch)

特征:将多条消息打包成一次请求发送,减少网络开销。

  • 适用场景:需要一次性发送大量小消息
  • 限制 :同一批次的消息必须 Topic 相同,且总大小 不超过 1MiB

    List msgList = new ArrayList<>();
    msgList.add(new Message("topic7", "tag1", "msg1".getBytes()));
    msgList.add(new Message("topic7", "tag1", "msg2".getBytes()));
    msgList.add(new Message("topic7", "tag1", "msg3".getBytes()));

    SendResult result = producer.send(msgList); // 批量发送

超过 1MiB 怎么办?自己实现分批:ListUtils.partition(msgList, size) 拆成多个小批次。


六、五种消息类型对比总结

|--------|---------|-------|-------|-----------|
| 类型 | 是否等待回执 | 可靠性 | 吞吐量 | 典型场景 |
| 同步 | 阻塞等待 | ★★★★★ | ★★ | 短信、转账通知 |
| 异步 | 回调获取 | ★★★★ | ★★★★ | 订单状态流转 |
| 单向 | 不关心 | ★ | ★★★★★ | 日志、埋点 |
| 延时 | 同步/异步均可 | ★★★★ | ★★★ | 超时取消、定时通知 |
| 批量 | 同步/异步均可 | ★★★★ | ★★★★★ | 大批量小消息 |


七、消息生产者核心流程

复制代码
Producer 启动
    │
    ├─ 连接 NameServer(获取路由信息)
    │
    ├─ 选择发送方式:
    │   ├─ send()        → 同步等待回执
    │   ├─ send(callback) → 异步回调
    │   └─ sendOneway()  → 不等待
    │
    ├─ 选择 MessageQueue(负载均衡)
    │
    └─ 发送到 Broker → 返回 SendResult
         ├─ sendStatus: SEND_OK / FLUSH_DISK_TIMEOUT / SLAVE_NOT_AVAILABLE
         ├─ msgId: 全局唯一消息ID
         └─ queueOffset: 在队列中的偏移量
相关推荐
2301_32241428041 小时前
springboot学生课堂出勤统计系统15835-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·mysql·随机森林·微信小程序·uni-app·微信开发者工具·推荐算法
程序员夏洛2 小时前
VMware Workstation Pro 卸载失败:安装向导提前结束、错误 1603 的排查与解决
java
User_芊芊君子2 小时前
【JavaEE初阶 - 网络原理】网络分几层?从自定义协议聊到 DNS
java·网络·java-ee
聚美智数9 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
十年Java程序媛9 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
我是人✓10 小时前
SpringBoot静态资源映射揭秘
java·spring boot·后端
土豆.exe10 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
小坏讲微服务11 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
kunicoding11 小时前
多线程编程核心概念详解:从线程基础到并发安全
java·jvm·安全