本周一个故障,记录一下。

诸位知道,历史遗留代码,只要能运行,一般都不愿意去动的。 然而, 遗留问题就像雷区,排雷会炸,不排也会炸。 这不,本周一个电子卡券导出的雷,炸得我真是“面目全非”。

具体代码不必细讲。 看官只需懂得:电子卡券导出是一个PHP后台任务,接收消息队列的导出消息来处理任务。 在捕获了一个异常之后,走到了异常处理分支。异常分支有句代码 logger->warn 。 这有何错 ? logger 并没有 warn 方法 ! IDE 也提示的。 于是 PHP 报 fatal error ,直接退出了进程。 这样,导出任务进程无法启动,无法处理消息,队列阻塞,前端就一直显示报表正在生成中。

为什么 logger 没有 warn 方法 , 却还明显地写着 logger->warn ,甚至历经两年都没有发现 ? 想必部分读者已经了然:因为写在异常捕获中。异常测试,是很容易被忽略的分支。

值得提及的是,logger 有个 warning 的方法。 然而,开发者习惯用 warn 而不是 warning ,并且 warn 是动词,warning 是名词。 打日志本应该用 warn 而非 warning 。 底层 API 设计者希望用新的方式取代老的方式,也必须考虑到大多数开发者的惯用法。

另一个问题是: 电子卡券导出为什么处理这么慢?

进一步阅读代码可知,电子卡券导出代码,里层竟然对每一个订单循环进行处理:访问 DB 获取卡券信息,调用用户 API 接口,调用重量级的订单详情接口。环环相扣,真是令人“拍案叫绝”啊!

为什么会出现这种情况 ? 原来,为了方便,导出代码复用了列表代码。而列表代码只需要处理 20 个订单, 但导出代码却会处理数万订单。可想其性能可以低到地心里面去。推测, 可能当时修改列表代码的时候,并没有注意到导出复用了列表代码,只是在列表代码里修改了,但同时导出的处理也影响到了,而修改者浑然不觉。

调用重量级的订单详情接口,也值得商榷。 列表与导出要显示的信息不过七八个,却要调用订单详情接口,获取近百个字段。真是为了一个轮胎,拖了一辆卡车。须知,这事并不鲜见。注意到,导出外层批量调用了一次新的批量详情接口,却不料里层为了订单列表又循环对每个订单调用了老的订单详情接口,令人以泪洗面!

这里有三个启示:

  • 对于大量数据,循环调用单个接口,乃开发之忌。列表如果这么做,一定会有一天跪掉;导出如果这么做,要么会拉跨被调用的业务方,要么自己慢到比蜗牛还慢。
  • 心里要有全景图,能评估影响范围(极为重要!),不然,很容易因为一个改动影响到另一个地方。此是开发常理。
  • 不要为了一个轮胎,拖一个卡车。不要轻率地复用一个大的业务模块。如果要复用,请通读这个业务模块,并保证复用的模块是轻量级的。

处理一个故障,可以折腾很多时间。比如 “趴坟”啊,开会啊,每一个细小的地方,一定要分析得水落石出,令人心服口服,无言以对,—— 哪怕这坨代码再也不会在线上运行。 有这时间,可以多去发现和思考系统中的潜伏着的问题,根治之。

PS: 无意看到历史上的今天,发了一篇“代码问题及对策” ,里面早已谈到了这些问题。 后人哀之而不鉴之,亦使后人复哀后人矣。

转载于:https://www.cnblogs.com/lovesqcc/p/11143831.html

遗留问题,排雷会炸,不排也会炸!相关推荐

  1. rust三人防炸家_rust腐蚀防炸房子教程 | 手游网游页游攻略大全

    发布时间:2015-09-17 我的世界怎么防炸详解  我的世界防炸指令怎么用.我的世界是近期很热门的游戏,玩家们会有无尽的自由发挥空间,但是也会有很多未知的危险等着大家.游戏中我们稍微不小心,就会被 ...

  2. 炸金花 php算法,php 炸金花牌型 和 比牌 规则

    获取炸金花牌的类型 参数 : $Poker 是一个数组 "size": 1 - 13 表示 $size_arr = ['A','二','三','四','五','六','七','八' ...

  3. kfc流程管理炸薯条几秒_炸薯条成为数据科学的最后前沿

    kfc流程管理炸薯条几秒 In February, our Data Science team had an argument about which restaurant we went to ma ...

  4. 2022京东年货节全民炸年兽怎么玩 全民炸年兽玩法规则

    2022京东年货节全民炸年兽玩法规则 手机京东搜索"虎气冲天062",领最高9999元红包,每天都可以领取! 活动概述 1.活动时间 本活动所有时间均以北京时间为准. 整体活动时间 ...

  5. 【图纸炸开】命令unlockdwg炸开图纸

    添加公众号:"第一设计群" CAD图纸属性为"多重插入块",普通的分解"X"命令炸不开了,如果想炸开图纸进行编辑操作,需要使用插件. 炸开图 ...

  6. 2023年京东炸年兽脚本《京东炸年兽活动脚本》

    需要的可以私我,目前一直环境异常 需要流量卡+V (xinyushang95)

  7. 喜姐成立两年A轮融资近3亿,资本也爱“吃”炸串?

    "人间烟火气,最抚凡人心." 上学时,学校门口除了等待孩子放学的家长还有喷香四溢的路边摊,而炸串则是路边摊上当之无愧的王牌美食. 如今,承载着无数人回忆的炸串,也成为了轻餐饮赛道上 ...

  8. 炸串常规店对拼夜市经济,“夸父”能火多久?

    餐饮行业自古就是中国消费市场的大头,据艾媒网数据显示,2019年国内餐饮行业收入规模达46721亿元,而2020年上半年因受疫情影响,收入规模为14609亿元,同比下降32.8%.2021年,疫情影响 ...

  9. 11粘土人脖卡面撑怎么用_纽约春节必备小吃!鸭脖、炸串、麻辣烫...送到家门口,放肆撸爽!...

    人生就像啃鸭脖,既要有大块吃肉的快感,也要啃骨唆髓的销魂!坐落在法拉盛的喵喵鸭,主营各类卤味.鸭货鸡爪猪耳朵,牛腱藕片猪蹄子一应具全.最值得一提的就是鸭脖了.味道鲜美无比,香.辣.甘.麻.甜.酥,啃光 ...

最新文章

  1. Bad credentials异常
  2. Objective-C市场占有率排名升至第4位
  3. Oracle怎么算开始一个会话,oracle – 随机获取ORA-08177只有一个活动会话
  4. servlet中文乱码_Servlet入门 信息过滤
  5. Android学习笔记---HttpClient入门,使用方法,及简介
  6. 扇贝和不背单词_你还没找到中意的背单词APP?我都试过,我来帮你盘点盘点
  7. Ubuntu下RamDisk使用
  8. canvas与svg的区别
  9. XCode下的iOS单元测试(转)
  10. java nextDouble exception_java 控制台输入输出 nextdouble问题
  11. 数据库技术与应用知识点小结(上)
  12. 三菱PLC型号通讯接口汇总表 细分FX Q系列等 PLC数据采集实用知识点
  13. 广义pareto分布_帕累托分布
  14. 中英文对照的文档、分离有妙招
  15. [HTB]Nunchucks
  16. 如何解决网上图片模糊不清,还原图片清晰度?
  17. 杰理之RX传导杂散【篇】
  18. 如何高效的完成每日的任务?
  19. blender导入png图片不透明 | png贴图在blender中有黑底
  20. 关于冒险岛,8090的不二游戏

热门文章

  1. c语言如何查看内置函数,C中函数内部的函数
  2. STM32H743+CubeMX-串口非空闲中断接收
  3. php我赢职场季枫_我赢职场 - 主页
  4. Qt文档阅读笔记-QFuture官方解析及实例
  5. Qt笔记-Q3DScatter中元素的移动和旋转
  6. 软件设计师习题笔记-重点习题一
  7. Qt5.7+Opencv2.4.9人脸识别(四)模型训练
  8. Qt可执行程序写入版本信息
  9. nginx设置跨域问题
  10. php事务 面向对象,PHP面向对象之事务脚本模式(详解)