• 1
  • 2
分享
  • 【原创】复盘一次线上问题的处理过程
  • sylan215 2019-08-15 12:24:13 字数 2030 阅读 2007 收藏 2

上周产品出现了一个线上 bug,我和一位同事临时通宵给做了善后处理,本来是有很清晰的处理思路,以及很熟练的处理方法,但是过程中还是出现了各种各样的问题,现做个简单总结,希望能给后续处理同类问题带来帮助。

一、问题背景

客户端代码有一个逻辑,判断一个文件是否是 XML 文件时,实现逻辑不严谨,没有进行充分性校验,选取的判断条件不唯一,类似我在《记一次问题分析解决的完整过程》中臆断的使用换行符来分隔字段的逻辑。

因为这个逻辑的存在,如果获取 XML 文件的 URL 地址不存在,那么返回的 404 页面,也匹配上述的判断条件,结果就命中了不应该命中的流程,继续处理。

在后续处理过程中,预期的数据出现了异常,从而导致了更严重的逻辑异常。

总结:
1、正规长期使用的线上代码,一定要避免山寨的实现方式。

我在文章《记一次问题分析解决的完整过程》中,也说过自己解析 html 时用的山寨方法,结果出现各种奇葩问题,但我那是一次性使用,可以接受,现在是一个长期使用的线上逻辑,这么去实现,完全是埋坑。

2、开发代码 Review 需要增加类似取巧实现方案的检查,有通用逻辑或者 API 处理的,绝对不用自己臆断的实现方案。

3、测试同学在沟通逻辑时,一定要多问一句实现方案,哪怕听懂了大概,也可以判断方案的合理性,以及可能带来的风险。

二、处理方案

因为上面的问题,客户端在逻辑处理时把一个文件夹的文件全部清空了,所以处理方案很明确:想办法把清空的文件恢复。

现在有两种解决方案。

第一种是精细处理,把所有文件都整理出来,一个个的通过升级的方式下发恢复,这种方式针对性强,但是操作过程繁琐,耗时较长,且容易出现二次事故。

另一种是粗暴处理,比如下发一个升级包,把客户端文件全部更新一遍,这种方式的方案简单通用,实施快捷,但是版本变更可能引起用户不适。

权衡之后,我们选择了第二个方案,主要考虑是,相对功能异常而言,用户还是可以接受一些小的改变。

总结:
1、应急处理方案的选择,一定要考虑时间因素,同时考虑成本和风险。

2、方案需要尽快的确定,因为落实过程中还会存在各种不确定性,在前序环节要尽可能节省时间。

3、方案确定后,尽快使用最小集合进行快速验证,避免因为一个关键问题导致方案被推翻重来。

三、落地实施

方案确定后,我们开始细化落地细节。

首先是选择升级包,刚好线上有一个可用升级包,节省了我们重复打包的工作量,这也是选择这个方案的原因之一,但是这个升级包还有 1% 左右的用户覆盖不到,经过权衡,可以接受,于是升级包问题搞定。

然后是升级条件,线上已有三个升级包节点,每个节点都需要互斥,为了避免条件太多造成的错乱,我们选取了一个唯一性文件依赖进行互斥,于是第二个问题搞定。

然而升级条件还有另一个问题,就是我们需要针对本地不存在某个指定的文件进行升级,这个逻辑前不久刚做过修改,我对这个逻辑不熟悉,所以构造和验证这个问题的过程花费了不少的时间,事实证明,熟悉业务逻辑细节非常重要。

当然过程中还涉及对于条件设定的抉择,因为我能查看全局的文件设置,所以能快速准确的找到合适的条件和依赖文件(已经涉及其他组的多个文件了),如果是没有这么多信息,我能想到自己肯定会抓狂,事实再次证明,对于业务逻辑的全局了解,以及相关流程的熟练,对处理问题过程中的判断和实施及其重要。

所有条件都配置好了,最后剩下实际环境的验证,众所周知,测试环境的维护一直都是一项让人头大的事,而复杂的升级配置和特殊环境要求更是如此。

过程中仍然出现了各种各样的问题,但是因为每次都可以准确判断造成问题的原因,极大的节省了定位问题的时间,事实证明,能够准确发现问题的关键点,从而快速定位问题的原因在处理问题过程中至关重要。

四、后怕

每一次处理问题的过程,都是积累的经验得到充分体现的过程,所以全程都是高度紧张,凌晨 4 点,搞定全部问题,顺利上线。

回家洗澡的时候,不经意的回顾整个问题处理的过程,突然想起来过程中换了三次依赖的目标文件,目前使用的这个依赖文件的可用性验证,做的并不充分,简单说,就是没有在实际环境下去确认这个依赖文件选择的合理性,一边洗澡我一边开始冒冷汗。

赶紧打电话先暂停升级,然后打开电脑进行仔细确认,还好还好,虚惊一场,关键时候的判断还是蛮准确的,并没有搞错这个关键问题,想起来当时换的第二个文件就是因为有这个问题,所以才用的第三个文件,确认安全后又赶紧恢复上线了。

看着窗外已经露出的鱼肚白,终于可以安心的躺下睡觉了。

以上,简单复述了自己处理一个紧急问题的经过,因为脱敏的缘故,细节没有说的特别明确,但是大概意思基本都表达出来了,不知道你在工作过程中是否处理过类似的问题,欢迎给我留言分享你的经验。

当然,如果你觉得自己有所收获,欢迎分享文章到朋友圈 + 点个「在看」让更多人看到,谢谢。

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   前言  Api测试又可以理解为接口测试,是目前企业中使用最广泛的一项测试技术。很多小伙伴在没有了解一些基础知识时,就盲目的去学习接口测试,学的一脸蒙。今天我就从0到1给大家分享下如何去做接口测试。  什么是API测试?  应用程序编程接口(API)是充当软件组件接口的规范。大多数功能测试都涉及测试网页或表单等用户界面,而API测试涉及绕过用户界面并通过调用其API直接与服务程序通信。  API测试允许测试绕过GUI并将请求直接发送到应用程序的后端或服务,并在验证响应内容以确保按预期运行的同时收到响应。  为什么API测试很重要?  随着敏捷开发成为大多数互联网公司的标准,我们开发软件和自动...
            0 0 544
            分享
          • 1.1输入项边界清晰,类型明确,例如名称为“0-100”的“字符串”组成;属性明确,例如单价、数量为必填项,金额不可编辑,金额=单价*数量;来源清晰,例如机台为下拉框方式显示,选项值来源(基础数据-机台设置-新增的数据);容错处理,例如1.机台为字符串1-100,当输入大于100时输入无效;2.身份证未必填项,保存时,未填,提示“请填写身份证”;数值规范,例如开始日期初始化=当前日期-15天,结束日期初始化=当天日期。1.2界面产品原型布局合理清晰,包括菜单、按钮、查询输入框,列显示;事件触发约束:例如:1.默认:编辑、取消、保存置灰,退出按钮可用,选中某行后,编辑恢复可用;2.未选择数据,点...
            0 0 749
            分享
          •        在接口测试中有一个这样的场景:登录之后,需要进行昵称修改,怎么实现?       首先我们分别看下登录、昵称修改的接口说明:        以上业务中补充一点,昵称修改,还需要添加请求头Authorization传登录获取的token值。       分析:登录之后的响应结果中会返回用户id、token信息; 而更新昵称需要传参member_id、且需要请求头传token;也就是我们要想办法从“登录”的响应结果中...
            14 14 1521
            分享
          •   摘要:大家好,今天我们一起聊聊,在软件性能测试过程中如何编写性能测试用例,上一次推文介绍了如何进行性能测试的需求分析,在性能需求分析中已经确定了哪些接口或那些业务逻辑需要进行性能测试,那么在用例设计上就根据不同的接口及业务进行设计测试用例。  首先需要对每个接口进行压测,验证每个接口是否有明显的性能瓶颈。并需要把所有的单一接口全部优化完毕后,再做场景级别的性能测试。  一、单接口的性能测试用例  例如登录系统的登录接口:  二、多接口的业务场景性能测试用例  例如登录系统的登录后进行下载业务。  三、全流程业务场景性能测试用例  例如登录系统的登录后进行填表然后进行下载业务。  例如登录系...
            0 1 1086
            分享
          • 安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程,可以说,安全测试贯穿于软件的整个生命周期。下面通过一张图描述软件生命周期各个阶段的安全测试,如下图所示。上图中的风险分析、静态分析、渗透测试都属于安全测试的范畴,与前面介绍的普通测试相比,安全测试需要转换视角,改变测试中模拟的对象。下面从以下维度比较常规测试与安全测试的不同。(1)测试目标不同普通测试以发现Bug为目标;安全测试以发现安全隐患为目标。(2)假设条件不同普通测试假设导致问题的数据是用户不小心造成的,接口一般只考虑用户界面;安全测试假设导致问题的数据...
            0 0 766
            分享
      • 51testing软件测试圈微信