B 站前两天发的去年那次事故的复盘报告,不知道大家看过没

2022-07-14 19:27:54 +08:00
 Tussik

不知道大家还记得去年 B 站那次严重的事故不,记得当时在 V 站也是引起了热议的。离当时过去刚好一年多的时间,今天看到 B 站前两天在公众号上发的复盘报告2021.07.13 我们是这样崩的。不知道大家看过没,看完还挺唏嘘的,根因竟然是一个字符串类型的数字参数 0 导致的死循环。

4094 次点击
所在节点    哔哩哔哩
19 条回复
Jooooooooo
2022-07-14 19:33:45 +08:00
复盘挺好的, 很详细

看过很多超大故障的原因细节, 很多确实都是非常简单的原因导致的
Tussik
2022-07-14 19:36:44 +08:00
@Jooooooooo #1 确实。不管是写代码,还是测试,软件的整个流程还是得多注意细节才能避免事故。
heyjei
2022-07-14 19:40:25 +08:00
这时候,对于弱类型的语言,区分 == 和 === ,是多么的明智。
nbndco
2022-07-14 19:51:12 +08:00
@heyjei 对于这个问题好像没啥意义吧
nbndco
2022-07-14 19:53:32 +08:00
测试在这里其实是基本没啥用的,这也是为啥大公司的 RPC 都是强类型的,因为没有强类型这种问题完全无解。

在动态语言中,根本不可能对每一个方法都做大量 runtime 的类型检查,唯一能做的就是确保参数进来的时候就不会错。
Tussik
2022-07-14 20:09:40 +08:00
@nbndco #5 如果测试阶段能够触发这个场景,那么应该也是能够避免的吧
eason1874
2022-07-14 20:11:55 +08:00
@nbndco 有意义啊,如果有弱比较,那 "0" == 0 为 true 了,就不会出现这个情况了
nbndco
2022-07-14 20:26:26 +08:00
@Tussik 测试什么呢?参数是系统外传入的,你根本就不知道外部会传入什么。
anzu
2022-07-14 20:27:18 +08:00
哈哈,动态类型一时爽
nbndco
2022-07-14 20:27:34 +08:00
@eason1874 用更容易出错的方法来解决一个不太容易出错的问题么。这不是把小坑挖成地道了么。
zhlxsh
2022-07-14 20:28:28 +08:00
一个递归引发的血案?
jdi
2022-07-14 21:42:50 +08:00
Lua 是动态类型语言,常用习惯里变量不需要定义类型,只需要为变量赋值即可。

Lua 在对一个数字字符串进行算术操作时,会尝试将这个数字字符串转成一个数字。

欢声笑语中打出 GG
Mark24
2022-07-14 21:46:46 +08:00
上午发完文,然后 2022.07.13 下午又蹦了,和淘宝一起。
Tussik
2022-07-14 22:14:33 +08:00
@nbndco #8 原文也提到了,之前未发现此问题的原因是特殊的发布方式只在生产环境会用到,且使用频率极低。后续他们在线下也复现了此问题。所以我认为从某种程度上来说,也算是测试未能覆盖到此种场景。
Tussik
2022-07-14 22:15:23 +08:00
@Mark24 #13 哈哈,然后明年再来一篇复盘 😂
nbndco
2022-07-14 22:41:57 +08:00
@Tussik 线下必然能复现这个问题啊,就几行 lua 代码,我现在也能复现,不然如何定位到问题?但是能复现和可测试之间是没有任何关联的。

因为你不知道应该怎么测,测什么。

首先 unit test 是没有任何意义的,这个就不用说了。可能的基本只能是 integration test 或者 smoke test 。对于这类完全不 predictable 的 edge case ,smoke test 也基本没有任何意义。那么就只能做 integration test 。

integration test 这个天坑我也不想多说,做过的都明白,最后只能 test 基本的 case ,确保模块间正常可用,甚至不能测试真实日常场景,更不可能测试 edge case 。别的不说,你就想想一般 unit test 里都经常只测 happy path ,好一点的也一般只有 utility 才 coverage 100%,很多逻辑都无法测试。很多时候为了 coverage mock 来 mock 去最后基本都只是在测试 mock 写对了没有,业务逻辑都 mock 光了。现在你来说 integration test 还要测这么复杂的 edge case ?不可能的啊。
testFor
2022-07-14 23:59:03 +08:00
我可能连复线都做不出来,别说排查了
cuebyte
2022-07-15 00:08:32 +08:00
为什么要过了整整一年来发复盘文章呢?是周年祭?
ShinichiYao
2022-07-15 07:48:19 +08:00
我就想到这个故事

一个测试工程师走进一家酒吧,要了一杯啤酒;
一个测试工程师走进一家酒吧,要了一杯咖啡;
一个测试工程师走进一家酒吧,要了 0.7 杯啤酒;
一个测试工程师走进一家酒吧,要了-1 杯啤酒;
一个测试工程师走进一家酒吧,要了 2^32 杯啤酒;
一个测试工程师走进一家酒吧,要了一杯洗脚水;
一个测试工程师走进一家酒吧,要了一杯蜥蜴;
一个测试工程师走进一家酒吧,要了一份 asdfQwer@24dg!&*(@;
一个测试工程师走进一家酒吧,什么也没要;
一个测试工程师走进一家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来;
一个测试工程师走进一家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿;
一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷;
一个测试工程师走进一家酒吧,要了 NaN 杯 Null ;
一个测试工程师冲进一家酒吧,要了 500T 啤酒咖啡洗脚水野猫狼牙棒奶茶;
一个测试工程师把酒吧拆了;
一个测试工程师化装成老板走进一家酒吧,要了 500 杯啤酒并且不付钱;
一万个测试工程师在酒吧门外呼啸而过;
一个测试工程师走进一家酒吧,要了一杯啤酒';DROP TABLE 酒吧;
测试工程师们满意地离开了酒吧。
然后一名顾客点了一份炒饭,酒吧炸了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866226

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX