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

消息队列疑难问题(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.lryc.cn/news/611291.html

相关文章:

  • 认识爬虫 —— bs4提取
  • 阿里招AI产品运营
  • 永磁同步电机的矢量控制
  • RK3568下使用Qt 绘制实现实时坐标曲线
  • 【Spring Cloud】-- 注册中心
  • PowerShell 入门2: 使用帮助系统
  • 异或游戏 运算符优先级问题
  • GB28181监控平台LiveGBS如何配置GB28181对接海康、大华解码器上墙,将GB28181平台是视频给硬件解码器解码上墙
  • cJSON库应用
  • C语言的常见错误与调试
  • uniapp renderjs 逻辑层,视图层互相传递数据封装
  • 背包初步练习
  • 计算机视觉面试保温:CLIP(对比语言-图像预训练)和BERT技术概述
  • Linux逻辑卷管理操作指南
  • 论文解读:Mamba: Linear-Time Sequence Modeling with Selective State Spaces
  • JSP相关Bug解决
  • AutoSar AP LT规范中 建模消息和非建模消息都可以使用LogInfo() API吗?
  • 达芬奇31-40
  • stm32F407 硬件COM事件触发六步换相
  • AI赋能复合材料与智能增材制造:前沿技术研修重磅
  • 智能融合:增材制造多物理场AI建模与工业应用实战
  • 【面向对象】面向对象七大原则
  • linux nfs+autofs
  • 注意点:Git 从安装到分支协作、冲突解决的完整步骤 ---待修改,没看这个步骤,需要重新整理步骤
  • ara::log::LogStream::WithTag的概念和使用案例
  • 跨域场景下的Iframe事件监听
  • Nature Neuroscience | 如何在大规模自动化MRI分析中规避伪影陷阱?
  • Android 开发中,HandlerThread、IntentService 和 AsyncTask区别对比
  • 性能测试终极指南:从指标到实战
  • 《传统企业如何借助数字化转型实现企业增长》