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

RabbitMq消息阻塞,立即解决方案

如果目前你的 RabbitMQ 消费者 被卡住不再消费消息,且消息已经到达消费者绑定队列,但Spring Cloud Stream 没有继续触发 @StreamListener 的方法执行。这类问题一般是因为消费者线程阻塞消息被 RabbitMQ 拒绝投递。我们可以按照下面的步骤紧急处理:


✅ 立即解决方案(临时 + 快速恢复消费)

Step 1. 重启消费者服务

这一步是最快恢复消费的方式:

  • Spring Cloud Stream 的默认 ack 模式是自动 ack,只要没有抛出异常,MQ 就认为消费成功

  • 如果你遇到卡死,有可能是:

    • 前一条消息处理还没结束(线程阻塞)
    • 或者死循环/超时没释放线程
  • 重启服务可释放线程/消费挂起状态

# 假设是 docker 容器/服务
docker restart your-consumer-service
# 或者直接 kill 掉 Java 服务再启动

观察 RabbitMQ 管控台,看是否:

  • 队列消息数逐渐减少
  • 消费速率恢复为 > 0
  • 控制台中连接数和 channel 数重新建立

🔍 临时观察细节(可排查 root cause)

✅ RabbitMQ 控制台重点检查 3 项:

项目正常情况异常表现
Ready有新消息就增加,消费中就减少持续增长说明消息没人处理
Unacked一般在 0 ~ prefetch 区间内长期不变说明卡住未 ack
Consumer Utilization1.0小于 1.0 说明消费者阻塞或卡死

打开 RabbitMQ 中该 queue 的 “Consumer” 详情页,能看到具体的 Consumer 状态。


🔧 推荐补救优化(防止再次发生)

✅ 修改 application.yml 设置消费者并发 + prefetch:

spring:cloud:stream:bindings:executeAiBaseTask-in-0:destination: ai-paas-executeAiBaseTask.ai-platformrabbit:bindings:executeAiBaseTask-in-0:consumer:concurrency: 5       # 启动多个消费线程prefetch: 10         # 提前拉取多个消息处理acknowledge-mode: AUTO # 默认可以先用 AUTO,后面再换 MANUAL

✅ 改造处理逻辑为异步线程池提交:

@StreamListener(ExecuteAiBaseTaskBinding.INPUT)
public void executeAiBaseTask(String apiCode) {taskExecutor.submit(() -> handleAiTask(apiCode));
}

将你的整套复杂处理逻辑挪到 handleAiTask(apiCode) 中。


🛡️ 如果你急着排查是“哪条消息卡住了”

你可以尝试用 RabbitMQ 控制台 Web UI:

  • 在对应 Queue 上点击“Get messages

  • 获取队列中某些消息的 payload

  • 手动判断是否是某条任务数据异常

    • 比如 rightPop 之后无法解析 JSON、字段缺失、Redis 无响应等

总结

步骤目的操作
🔧 Step 1快速恢复消费重启消费服务
🔍 Step 2定位卡住原因RabbitMQ 控制台查看 Unacked 与队列状态
✅ Step 3防止再挂死增加并发、改异步处理、调高 prefetch
🛠 Step 4结构性优化异步线程池 + MANUAL ack 模式(推荐)

相关文章:

  • NNLM神经网络语言模型总结
  • 使用 hover-class 实现触摸态效果 - uni-app 教程
  • 使用VSCode编辑Markdown+PlantUml
  • 推荐一个Winform开源的UI工具包
  • HTTP / HTTPS 协议
  • 移动网页调试工具实战:从 Chrome 到 WebDebugX 的效率演进
  • 【C/C++】自定义类型:结构体
  • Ubuntu 系统默认已安装 python,此处只需添加一个超链接即可
  • 单向循环链表C语言实现实现(全)
  • 在Ubuntu24.04中配置开源直线特征提取软件DeepLSD
  • Kubernetes排错(十七) :kubelet日志报device or resource busy
  • IIS服务器URL重写配置完整教程
  • Spark 集群配置、启动与监控指南
  • 榕壹云打车系统:基于Spring Boot+MySQL+UniApp的开源网约车解决方案
  • DAX权威指南2:CALCULATE 与 CALCULATETABLE
  • 【Linux笔记】——进程信号的捕捉——从中断聊聊OS是怎么“活起来”的
  • Jmeter变量传递介绍
  • 【Java面试题】——this 和 super 的区别
  • Jmeter对服务端进行压测快速上手
  • 使用IDEA创建Maven版本的web项目以及lombok的使用
  • 订婚不等于性同意!山西订婚强奸案入选最高法案例
  • 袁思达已任中国科学院办公厅主任
  • “异常”只停留在医院里,用艺术为“泡泡宝贝”加油
  • 中国巴西关于乌克兰危机的联合声明
  • 1至4月我国汽车产销量首次双超千万辆
  • 何立峰:中方坚定支持多边主义和自由贸易,支持世贸组织在全球经济治理中发挥更大作用