问题:生产环境 rabbitmq 部分客户端 channel 持续积压消息不进行ack。

0. 服务配置

  • rabbitmq 集群(普通集群模式)

  • 消费者 三台 消费线程各消费者 10

  • 消费者配置 使用 spring-amqp|auto-ack 模式

1. 故障发现

近日有同学发现一个业务队列存在上千个 unacked 消息,并且有持续上涨的趋势。

2. 故障表现

队列下其中两个客户端的各一个 channel 分别阻塞几百条数据,并且在持续累加,重启应用后队列 unacked 消息全部进入 ready 状态等待重消费,但是重启后客户端依然有 channel 重新开始堆积并且在趋势上涨。

3. 问题排查

排查思路

  • 检查 mq 控制台是否是队列创建问题

  • 消费者阻塞是否有规律可循(未ack数据是否有共同特征、阻塞客户端配置是否有问题)

  • 客户端代码是否有问题、应用是否有jvm级别故障

4. 问题定位

经过一番筛查,问题定位到了代码部分,队列消费代码并非刚上线,而是在前一日服务重启后出现的这个问题,重新 review 代码后发现消费者有使用 CountDownLatch 等待多线程消费结果,CountDownLatch#countDown 的调用没有放到 finally 中执行,并且提交到线程池的任务也没有使用 try catch 进行包裹。

到此怀疑是消费线程阻塞到了 CountDownLatch#await 处,异步任务处理时由于偶现异常代码并未执行到 CountDownLatch#countDown 处,再者由于异步任务未捕获异常导致错误直接抛到 jvm 日志无法记录错误。

为了验证这个问题,我们又dump了阻塞服务的栈信息,发现确实有消费者线程阻塞到 CountDownLatch#await 处,问题定位结束。

5. 解决方案

从任务处下手添加 catch 记录日志,并将 CountDownLatch#await 放到 finally 中执行。重启应用再次观察,并未出现 unacked 消息,观察日志也并未出现新添加的 error 日志。

6.问题拓展

同一个 channel 为何会阻塞那么多数据?

线上生产环境采用推模式,rabbitmq 通过 channel 推送消息到客户端,客户端采用 LinkedBlockingQueue 做缓存,一个 channel 对应一个消费者线程,当消费者线程阻塞时 LinkedBlockingQueue 作为中转一直在预存消息,所以会出现很多 unacked 消息。

为什么仅有部分一两个 channel 出现堆积?

线上添加错误日志后实际并未出现错误打印,怀疑之前异常可能是由于重启后第一次请求 rpc 偶现调用失败,猜测暂无法复现,后续需观察日志。

总结

  • 谨慎使用线程同步,谨防线程死锁,务必保证线程不会 hang死。

  • 自建线程池做好错误兜底,不要将异常抛给jvm。

推荐好文

>>【练手项目】基于SpringBoot的ERP系统,自带进销存+财务+生产功能>>分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!
>>能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!

生产环境中,RabbitMQ 持续积压消息不进行ack ,发生什么了?相关推荐

  1. Dubbo Mesh 在闲鱼生产环境中的落地实践

    本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是"借力开源. ...

  2. 记录一次生产环境中Redis内存增长异常排查全流程!

    作者:z小赵 ★ 一枚用心坚持写原创的"无趣"程序猿,在自身受益的同时也让朋友们在技术上有所提升. 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已 ...

  3. 写一段代码提高内存占用_记录一次生产环境中Redis内存增长异常排查全流程!...

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已经进行了两次扩容,内存增长还在持续中,希望业务方排查一下容量 ...

  4. 第十五篇:如何排查生产环境中的反压问题

    你好,欢迎来到第 15 课时,这一课时我们主要讲解生产环境中 Flink 任务经常会遇到的一个问题,即如何处理好反压问题将直接关系到任务的资源使用和稳定运行. 反压问题是流式计算系统中经常碰到的一个问 ...

  5. 使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题

    使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题 参考文章: (1)使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题 (2)https://www.cnblogs. ...

  6. svn 服务器在生产环境中的搭建

    svn 服务器在生产环境中的搭建 搭建环境 阿里云服务器  CentOS release 6.7 安装软件 yum install subversion  -y 创建项目目录 cd /home/svn ...

  7. 【转】在生产环境中部署前端代码

    在生产环境中部署前端代码 本文章前端代码是基于vue+webpack开发的 Nginx是一款轻量级的Web 服务器/反向代理服务器 首先,webpack配置如下 在开发过程中,我们是通过npm run ...

  8. SCOM 如何监控生产环境中的LinuxUnix机器

    Linux能够监控的版本应该是从4.0以上才行,如果其他博友有更好的方法.共享哦!! 如何监控生产环境中的Linux&Unix机器 1. 点击Unix Action Account帐户属性 2 ...

  9. 生产环境中on yarn模式是否采用yarn session

    flink on yarn包括 yarn session以及per job两种方式. 那么生产环境中到底采用哪种呢? 下面是社区群中的讨论: 所以on yarn模式在生产环境中我们使用per job ...

最新文章

  1. 2022.3.26八仙花
  2. figma下载_我关于Figma文件封面的故事
  3. php项目部署lnmp,如何在lnmp环境里,部署多个php项目?
  4. Android教程之android平台水波效果!提供源码!
  5. 你没干什么坏事,你怕什么?
  6. php将word转txt,PHP如何将将word文件转为pdf
  7. Web前端期末大作业--重工机械设备检测生产企业官网网页设计(HTML+CSS+JavaScript )实现
  8. Bootstrap禁用某个按钮组
  9. java bufferedrandomaccessfile_java 读写操作大文件 BufferedReader和RandomAccessFile
  10. LINUX下载编译libyuv
  11. 瑞星、360、金山卫士、BaiduPlayer、SOSO开聚会,电脑吃不消了
  12. 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 Semantic Role Labeling (SRL).
  13. 《所谓情商高就是会说话》
  14. 软件工程 阶段测试三
  15. matlab 矩阵 矢量场,Matlab将矢量转换为矩阵(Matlab turning vectors into a matrix)
  16. java 获取今天或者某一天是星期几/周几以及几号的方法
  17. 前端实现实时消息提醒消息通知
  18. 图解 CMMI 2.0之(四)能力等级和成熟度等级
  19. 数据统计与分析基础实验一:基本语法与运算(R语言)
  20. PC端的阿里云盘搜索工具

热门文章

  1. 网易传媒回应“变相裁员 ”说法:假消息,将提起诉讼
  2. 荣耀9X Pro外观设计图曝光:升降前置摄像头/保留3.5mm耳机孔
  3. 手机这5个反人类的设计,你能容忍到第几个?
  4. 海信新机F30S即将发布:搭载紫光展锐虎贲T310处理器
  5. 奈雪的茶回应违规操作事件:虚心接受意见并及时改进
  6. 华为nova 4e 3月14日发布:麒麟710+3200万前摄
  7. 数据库优化:优化查询
  8. fast start oracle,Oracle Data Guard快速启动故障切换 - fast-start failover(FSFO)
  9. 没有找到站点_为了在家Coding,我搜集了海量的远程站点,然而...
  10. python ax.imshow_python – Matplotlib imshow / matshow在情节上显...