当前位置: 首页 > ds >正文

消息队列疑难问题(RocketMQ)

文章目录

    • 1.消息丢失
    • 2.消息重复消费(幂等)
    • 3.消息积压
    • 4.顺序消息
    • 5.分布式事务(数据一致性)
    • 6.消息延迟&毛刺
      • 6.1.消息延迟
      • 6.2.毛刺
    • 7.平滑扩容和缩容
    • 8.高可用&异地多活
    • 9.消息体积过大
    • 10.版本兼容 & 协议升级
    • 10.总结

1.消息丢失

触发点RocketMQ 防护手段
生产者宕机未收到 ACKsend(msg, timeout) 捕获异常并重试;开启 事务消息(Half Message + 本地事务表)
Broker 刷盘前崩溃配置 flushDiskType=ASYNC_FLUSH + 同步刷盘;开启 DLedger(Raft)多副本
消费者先 ACK 后业务失败关闭 自动 ACK,改为 手动 ACKConsumeConcurrentlyStatus.RECONSUME_LATER

2.消息重复消费(幂等)

  • 根因:Broker 重投或 Consumer 重启。
  • 方案
    • 幂等键:消息 Key + 业务唯一键 → 写入 Redis SETNX 或 MySQL 唯一索引;
    • RocketMQ 自带去重:开启 enableIdempotent=true(5.x 版本)

3.消息积压

工具用法
RocketMQ Dashboard查看 消费 TPS消息堆积量
快速扩容增加 消费组实例数 + consumeThreadMax 调大;
批量拉取设置 pullBatchSize=1000 + consumeMessageBatchMaxSize=32
降级非核心消息直接投递 延迟队列,或转 死信队列

4.顺序消息

  • 场景:订单状态机、库存扣减。
  • 方案
    • 顺序消息:同一业务 Key → 同一个 MessageQueue
    • 失败重试:顺序消费失败后进入 重试队列,仍保证顺序重放。

5.分布式事务(数据一致性)

  • 一致性:最终一致,本地事务失败则回滚半消息。
// 1. 发送半消息
TransactionSendResult result =producer.sendMessageInTransaction(msg, localTransactionExecuter, arg);// 2. 本地事务执行
public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {// 本地业务 + 事务表return LocalTransactionState.COMMIT_MESSAGE;
}// 3. Broker 回调检查
public LocalTransactionState checkLocalTransaction(MessageExt msg) {return checkBizStatus(msg) ? COMMIT_MESSAGE : ROLLBACK_MESSAGE;
}

6.消息延迟&毛刺

  • 延迟 = 持续的“慢”;
  • 毛刺 = 瞬间的“卡”。
概念通俗解释产生原因典型症状
消息延迟 (Latency)消息从发送到被消费者成功处理所耗时间 远大于预期。• Broker GC / CPU 飙高监控图里“平均延迟”持续升高,业务体感“订单状态更新慢”。
毛刺 (Spike / Jitter)延迟曲线出现瞬间尖峰(毫秒级→秒级→毫秒级)。• 瞬时流量洪峰

6.1.消息延迟

现象典型根因RocketMQ 解法 & 配置参数
端到端耗时 > 业务 SLA1. 生产者同步刷盘等待• Broker:flushDiskType=ASYNC_FLUSH + transientStorePoolEnable=true
跨城链路延迟网络 RTT 高• 就近部署:Producer & Consumer 与 Broker 同可用区
大促洪峰生产者 TPS >> 消费者 TPS消费者水平扩容:动态增加实例(K8s HPA)

6.2.毛刺

现象典型根因RocketMQ 解法 & 配置参数
99.9 线瞬间飙高1. 单条超大消息阻塞网络消息拆分:>1MB 走 OSS,只传 URL
Broker CPU 瞬时 100%热点 Key 打在同一队列Key Hash 打散:自定义 MessageQueueSelector
磁盘抖动Page Cache 回收预留内存osPageCacheBusyTimeOutMillis=1000

7.平滑扩容和缩容

  • Broker 无状态:新增 Broker 后,Topic 路由元数据自动同步;
  • 队列重平衡:Consumer 端使用 AllocateMessageQueueAveragely 算法,秒级感知变化。

8.高可用&异地多活

  • DLedger(Raft):Broker 组自动选主,支持 同城双中心 / 异地三中心
  • NameServer 多节点:无状态,秒级故障切换。

9.消息体积过大

  • 拆分:大文件放 OSS,MQ 只传 URL;
  • 压缩compressType=LZ4,带宽 ↓50%。

10.版本兼容 & 协议升级

  • RocketMQ 5.x 支持 gRPC 协议,老客户端通过 Proxy 平滑升级;
  • Schema Registry:支持 Avro/Protobuf 版本兼容。

10.总结

问题RocketMQ 解法关键配置
丢失事务消息 + DLedgerflushDiskType, DLedger
重复幂等键 + enableIdempotentmessageKey, 唯一索引
积压扩容 + 批量消费pullBatchSize, consumeThreadMax
顺序顺序队列 + 重试队列MessageQueueSelector
事务Half Message + 本地事务表sendMessageInTransaction
延迟Dashboard + 重试参数maxReconsumeTimes
http://www.xdnf.cn/news/17229.html

相关文章:

  • 09-堆
  • GaussDB 常见问题-集中式
  • 8.5 CSS3多列布局
  • lumerical——Y分支功分器
  • Redis Stream:高性能消息队列核心原理揭秘
  • PDF转图片工具技术文档(命令行版本)
  • CRT调试堆检测:从原理到实战的资源泄漏排查指南
  • 北京JAVA基础面试30天打卡02
  • RocketMq如何保证消息的顺序性
  • 面向对象的七大设计原则
  • Kotlin属性委托
  • 探秘MOBILITY China 2026,新能源汽车与智慧出行的未来盛宴
  • React18 严格模式下的双重渲染之谜
  • 嵌入式硬件中运放的基本控制原理
  • 2025金九银十Java后端面试攻略
  • 天津大学2024-2025 预推免 机试题目(第二批)
  • 400V降24V,200mA,应用领域:从生活到工业的 “全能电源管家”
  • C++面向对象编程基础:从类定义到封装机制详解
  • 深度学习-卷积神经网络CNN-填充与步幅
  • 最新基于Python科研数据可视化实践技术
  • 【人工智能99问】什么是Post-Training,包含哪些内容?(19/99)
  • Next Terminal 实战:内网无密码安全登录
  • MCP进阶:工业协议与AI智能体的融合革命
  • Redis之Hash和List类型常用命令
  • VGMP(VRRP Group Management Protocol)VRRP组管理协议
  • Druid学习笔记 02、快速使用Druid的SqlParser解析
  • Solidity全局变量与安全实践指南
  • python中的字典
  • 雷达系统工程学习:自制极化合成孔径雷达无人机
  • bypass