mq使用不当,造成生产线上环境的服务奔溃问题记录
案例描述:
线上采用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使用不当,造成生产线上环境的服务奔溃问题记录相关推荐
- 记一次线上Zip文件操作导致JVM奔溃
又好久没有整理笔记了.这次疫情防控正好周末居家,就想着花点时间整理下自己工作中遇到一些疑难杂症,帮助自己更透彻的理解某些问题! 言归正传,问题的主要经过是这样的:生产上面运营人员导入一批表盘文件,系统 ...
- 记几次 [线上环境] Dubbo 线程池占满原因分析(第三次:GC STW)
[线上环境] Dubbo 线程池占满原因排查系列 记几次 [线上环境] Dubbo 线程池占满原因分析(第一次:HttpClient) 记几次 [线上环境] Dubbo 线程池占满原因分析(第二次:C ...
- 使用计算机进行生产流水线控制属于计算机,在自动化生产线上计算机控制技术的应用探究...
利用计算机对设备进行全程操控,可让整个生产的过程更加高效.稳定,不易出现差错,同时可以节省人力与资金成本.伴随社会的运作发展,自动化生产的可应用的领域越来越广泛.但是,此项技术在我国的开发应用时间较晚 ...
- JVM第六讲:线上环境 FGC 频繁,如何解决?
本文是JVM第六讲:线上环境 FGC 频繁,如何解决?重点:得靠经验来解决 文章目录 1.问题背景 2.遇到的问题及解决方案 2.1.pinpoint 打点存在大批量300ms以上 2.2.应用 cp ...
- 刚出生产线上的工业路由器,为何还要做老化测试?
工业路由器的老化测试,一般指工业通信设备的长时间持续满负荷工作.一般常见为24小时到48小时,这视乎企业对产品质量的追求以及成本的要求.老化测试也常被称为烧机.烤机,实际是苛刻地考验其实际应用或努力去 ...
- MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决
MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 一.简介 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发.发布并支持的.有以下特点: MySQL是 ...
- node开发环境(mac)和线上环境(linux)搭建
以前一直在做php后台,对node没有认真研究,现在前端发展速度这么快,再加上node的飞速发展,javascript统一中原指日可待啊.em~~,废话不多说开始开发环境和线上环境搭建吧,写一下自己的 ...
- appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器 转自:上海-悠悠
前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了. 环境准备: 1.OS版本号10.12 2.xcode版本号8.3.2 3.appiu ...
- 地球上环境最恶劣的数据中心
据西班牙<国家报>报道,各数据中心展开最佳运行的条件都非常具体,有时为硬盘和处理器维持适当的温度和湿度都非常困难,尤其是在那些地球上环境最恶劣的地方. 「水下」微软开发的Natick水下数 ...
最新文章
- DWR小结DWRUtil篇
- 介绍一篇关于session的好文章,写的很详细
- android 线程方式打印log到sd卡
- python文本分析
- 关系数据库的设计理论
- 小明分享|分享8ms平台sigmastar SSD201/SSD202 开源框架的github
- tomcat日志按天切分
- 慎用window.showModalDialog()
- Java面试题谷歌插件
- css怎么让div旋转不改变形状,旋转任意角度 如何让div旋转一定的角度
- 《计算机网络》第四章:介质访问控制(The Medium Access Control Sublayer)
- Altium AD20常用的操作快捷键,个人总结精炼版,全干货超实用
- 医视云助力清华长庚医院开展肝胆外科肿瘤远程多学科会诊
- 赛迪中国ECM市场报告解读一:市场需求在2023年将达到275亿元
- InsecureProgramming-master——abo3
- Techwiz LCD 1D:SRF的颜色分析
- FxFactory 7 Mac版(Mac视觉特效插件包)
- 【FPGA】十一、I2C通信回环
- PARI/GP 语言:从入门到实现大素数判定与大数分解
- java项目如何判断一个请求是否为AJAX请求