案例描述:

线上采用canel监听A表的status状态变化,只要有变化就通过mq发送消息到对应的消费者端处理。

消费者端的程序代码这样子写(因涉及公司业务,这里只是举个大致的代码示例)

代码大致的思路就是,监听队列QUEUE_B,然后消费发送到QUEUE_B的消息,如果消费过程中发生异常,就将消息重新发回队列中去。

一开始上线这个功能是正常的,因为doSomeThing业务里面没有任何异常,消息能够被正常消费。

后来某个版本上线后,突然有一天晚上,发现线上的服务,大部分宕机,监控短信响个不停。

经核实,就是因为doSomeThing里面的代码异常了,导致mq消费失败,然后代码里又将消息重新推回队列中。这样子问题就来。

程序本身有问题,mq消费消息永远是失败的,然后又刚好设置重新归队,导致一直在刷mq消费失败的日志,结果80G的磁盘没多久就撑爆了,导致同服务器的其他服务因为磁盘写入日志的问题,全线奔溃。。。代价有点惨重。

@Component
@Slf4j
public class MsgReceiverB {@RabbitListener(queues = RabbitMqConfig.QUEUE_B)public void onMessage(Message message, Channel channel) throws Exception {try {log.info("接收处理队列MsgReceiverB当中的消息: " + new String(message.getBody()));//处理某业务的代码,这里以doSomeThing示例doSomeThing();channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);} catch (Exception e) {log.error("QUEUE_B消费异常={}",e.getMessage());channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);}}private void doSomeThing() {//获取用户登录信息,原先获取不到用户信息是返回null,后来获取不到直接抛错,导致了这次血案的发生System.out.println("处理业务");}
}

问题总结:

出现这种问题的原因:开发对应业务的同事对mq的特性不是很熟悉。虽然一开始没有问题,但是埋下了隐患。后来某同事

因需求变动,导致doSomeThing()代码抛错就成了引爆这个导火线的人,直接导致了这次线上事故的发生。

笔者认为合理的处理方式有以下几种

第一种:消息消费失败后,不要设置重新归队,因为代码没有执行手工确认这个动作,消息是不会从mq中移出的,也就是消息

不会丢失,等消费者下次再启动的时候,就会重新消费。

第二种:消息消费失败后,直接让消息进入死信队列,在死信队列里,再起消费端重新消费,如果消费几次还是失败的话,

发消息通知人工处理。(根据消息的重要性判断是否需要人工处理,还是直接丢弃)

第三种:消息消费失败,直接持久化到数据库,nosql数据库或者sql数据库都可以,然后再发消息人工介入处理。(根据消息的重要性判断是否需要人工处理,还是直接丢弃)

以上纯属笔者个人意见,如有更好的方案,欢迎下方评论。

mq使用不当,造成生产线上环境的服务奔溃问题记录相关推荐

  1. 记一次线上Zip文件操作导致JVM奔溃

    又好久没有整理笔记了.这次疫情防控正好周末居家,就想着花点时间整理下自己工作中遇到一些疑难杂症,帮助自己更透彻的理解某些问题! 言归正传,问题的主要经过是这样的:生产上面运营人员导入一批表盘文件,系统 ...

  2. 记几次 [线上环境] Dubbo 线程池占满原因分析(第三次:GC STW)

    [线上环境] Dubbo 线程池占满原因排查系列 记几次 [线上环境] Dubbo 线程池占满原因分析(第一次:HttpClient) 记几次 [线上环境] Dubbo 线程池占满原因分析(第二次:C ...

  3. 使用计算机进行生产流水线控制属于计算机,在自动化生产线上计算机控制技术的应用探究...

    利用计算机对设备进行全程操控,可让整个生产的过程更加高效.稳定,不易出现差错,同时可以节省人力与资金成本.伴随社会的运作发展,自动化生产的可应用的领域越来越广泛.但是,此项技术在我国的开发应用时间较晚 ...

  4. JVM第六讲:线上环境 FGC 频繁,如何解决?

    本文是JVM第六讲:线上环境 FGC 频繁,如何解决?重点:得靠经验来解决 文章目录 1.问题背景 2.遇到的问题及解决方案 2.1.pinpoint 打点存在大批量300ms以上 2.2.应用 cp ...

  5. 刚出生产线上的工业路由器,为何还要做老化测试?

    工业路由器的老化测试,一般指工业通信设备的长时间持续满负荷工作.一般常见为24小时到48小时,这视乎企业对产品质量的追求以及成本的要求.老化测试也常被称为烧机.烤机,实际是苛刻地考验其实际应用或努力去 ...

  6. MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决

    MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 一.简介 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发.发布并支持的.有以下特点: MySQL是 ...

  7. node开发环境(mac)和线上环境(linux)搭建

    以前一直在做php后台,对node没有认真研究,现在前端发展速度这么快,再加上node的飞速发展,javascript统一中原指日可待啊.em~~,废话不多说开始开发环境和线上环境搭建吧,写一下自己的 ...

  8. appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器 转自:上海-悠悠

    前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了. 环境准备: 1.OS版本号10.12 2.xcode版本号8.3.2 3.appiu ...

  9. 地球上环境最恶劣的数据中心

    据西班牙<国家报>报道,各数据中心展开最佳运行的条件都非常具体,有时为硬盘和处理器维持适当的温度和湿度都非常困难,尤其是在那些地球上环境最恶劣的地方. 「水下」微软开发的Natick水下数 ...

最新文章

  1. DWR小结DWRUtil篇
  2. 介绍一篇关于session的好文章,写的很详细
  3. android 线程方式打印log到sd卡
  4. python文本分析
  5. 关系数据库的设计理论
  6. 小明分享|分享8ms平台sigmastar SSD201/SSD202 开源框架的github
  7. tomcat日志按天切分
  8. 慎用window.showModalDialog()
  9. Java面试题谷歌插件
  10. css怎么让div旋转不改变形状,旋转任意角度 如何让div旋转一定的角度
  11. 《计算机网络》第四章:介质访问控制(The Medium Access Control Sublayer)
  12. Altium AD20常用的操作快捷键,个人总结精炼版,全干货超实用
  13. 医视云助力清华长庚医院开展肝胆外科肿瘤远程多学科会诊
  14. 赛迪中国ECM市场报告解读一:市场需求在2023年将达到275亿元
  15. InsecureProgramming-master——abo3
  16. Techwiz LCD 1D:SRF的颜色分析
  17. FxFactory 7 Mac版(Mac视觉特效插件包)
  18. 【FPGA】十一、I2C通信回环
  19. PARI/GP 语言:从入门到实现大素数判定与大数分解
  20. java项目如何判断一个请求是否为AJAX请求

热门文章

  1. Java杂七杂八(做完要验证)
  2. 【ESP32 S2 烧录AT固件 串口与USB两种方式】
  3. WEB漏洞-关闭不安全的HTTP方法
  4. uniapp开发微信公众号,uniapp公众号本地调试,本地开发
  5. 实现阮一峰ES6的顶部加载条效果
  6. 如何学习ABAQUS有限元仿真分析软件
  7. 高德地图实现区域下钻
  8. Java调用WebService短信接口
  9. 黑苹果系统安装通用教程(Clover引导)
  10. windows系统下如何使用python定时任务