一次P0事故的背后:谁该背这口“大锅”?

68 阅读3分钟

老A混进互联网见过不少的线上问题,其中有一个线上问题,它发生的情节的复杂,最终结果判定的离奇给我留下了很深的印象。 事情发生在2022年的6月,那是一个看似平凡的周四晚上,星光黯淡,代码在静默中上线。

研发团队的主力小李,推动了一次重要升级。这次升级涉及核心数据处理逻辑的改动——新老版本在数据的写入和读取方式上完全不同。由于架构设计的限制和工期压力,小李在设计中明确标注:本次升级不支持回滚。同时,代码中也没有引入数据版本标识来区分新旧数据,这为后续的灾难埋下了伏笔。

突出关键信息.png 在提测阶段,小李 在发给测试团队的文档中用红色字体强调:“本次发布不支持回滚,请重点验证功能与性能。 ”测试团队的负责人小张看到了这份说明,他带领团队照常执行了功能测试、压力测试——一切正常。于是,小张 发布了测试报告,结论是两个字:“通过”。

测试团队会议.png 周五,系统安静地运行着,没有人察觉到潜在的危机。

展示服务器机房.png 直到周日深夜,一个重要客户的紧急电话打到了研发值班人员小赵的手机上:“某个核心功能完全不可用!”

小赵 迅速响应,初步排查后,他根据故障现象和时间点,认定是“小李 周四的那次升级导致的”。在巨大的时间压力和紧张情绪下,他没有翻看最初的设计文档,下意识地认为最直接的解决方案就是回滚。于是,小赵 拨通了运维值班老王的电话:“王哥,我们这个模块有问题,需要紧急回滚,尽快!”

此时,一个关键的沟通断层出现了:研发值班的小赵 并不清楚这个模块“绝对不能回滚”的技术背景,而运维老王 也从未收到过相关风险提示。周末深夜的值班氛围本就紧张,时间压力下,思考的空间被压缩。

按照公司标准流程,回滚应先小流量验证:即先在一台机器上执行,确认无问题后再推广至整个机房。但这个流程需要预先配置路由策略。而老王在系统中发现,该模块并未配置小流量回滚策略。

面对这个“空白配置”,老王 做出了一个判断:“既然没有配置,说明默认不需要小流量,直接整机房回滚是最快的解决办法。” 他相信流程和配置本身的规定,一键按下了整个机房的回滚操作。

结果?数据错乱、服务雪崩、客户投诉蜂拥而至——一场P0级事故,正式爆发。

这个问题老A也跟同事们讨论过,有人认为是研发小李的架构设计缺陷是根源,埋下了炸弹,应该小李背锅;有人认为是测试小张缺乏风险思维虽然研发没说回滚测试但是也要进行测试,应该小张背锅;有人认为是研发值班小赵应急判断失误,未核实关键信息就行动,小赵背锅;有人认为是老王缺乏基本判断力,做事机械,是按下核按钮的直接责任人,应该老王背锅。各位读者你们觉得谁背锅,不妨评论区讨论一下。