不知道大家还记得去年 B 站那次严重的事故不,记得当时在 V 站也是引起了热议的。离当时过去刚好一年多的时间,今天看到 B 站前两天在公众号上发的复盘报告2021.07.13 我们是这样崩的。不知道大家看过没,看完还挺唏嘘的,根因竟然是一个字符串类型的数字参数 0 导致的死循环。
1
Jooooooooo 2022-07-14 19:33:45 +08:00 1
复盘挺好的, 很详细
看过很多超大故障的原因细节, 很多确实都是非常简单的原因导致的 |
2
Tussik OP @Jooooooooo #1 确实。不管是写代码,还是测试,软件的整个流程还是得多注意细节才能避免事故。
|
3
heyjei 2022-07-14 19:40:25 +08:00
这时候,对于弱类型的语言,区分 == 和 === ,是多么的明智。
|
5
nbndco 2022-07-14 19:53:32 +08:00
测试在这里其实是基本没啥用的,这也是为啥大公司的 RPC 都是强类型的,因为没有强类型这种问题完全无解。
在动态语言中,根本不可能对每一个方法都做大量 runtime 的类型检查,唯一能做的就是确保参数进来的时候就不会错。 |
9
anzu 2022-07-14 20:27:18 +08:00
哈哈,动态类型一时爽
|
11
zhlxsh 2022-07-14 20:28:28 +08:00 via iPhone
一个递归引发的血案?
|
12
jdi 2022-07-14 21:42:50 +08:00
Lua 是动态类型语言,常用习惯里变量不需要定义类型,只需要为变量赋值即可。
Lua 在对一个数字字符串进行算术操作时,会尝试将这个数字字符串转成一个数字。 欢声笑语中打出 GG |
13
Mark24 2022-07-14 21:46:46 +08:00
上午发完文,然后 2022.07.13 下午又蹦了,和淘宝一起。
|
14
Tussik OP @nbndco #8 原文也提到了,之前未发现此问题的原因是特殊的发布方式只在生产环境会用到,且使用频率极低。后续他们在线下也复现了此问题。所以我认为从某种程度上来说,也算是测试未能覆盖到此种场景。
|
16
nbndco 2022-07-14 22:41:57 +08:00 1
@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 ?不可能的啊。 |
17
testFor 2022-07-14 23:59:03 +08:00
我可能连复线都做不出来,别说排查了
|
18
cuebyte 2022-07-15 00:08:32 +08:00
为什么要过了整整一年来发复盘文章呢?是周年祭?
|
19
ShinichiYao 2022-07-15 07:48:19 +08:00 3
我就想到这个故事
一个测试工程师走进一家酒吧,要了一杯啤酒; 一个测试工程师走进一家酒吧,要了一杯咖啡; 一个测试工程师走进一家酒吧,要了 0.7 杯啤酒; 一个测试工程师走进一家酒吧,要了-1 杯啤酒; 一个测试工程师走进一家酒吧,要了 2^32 杯啤酒; 一个测试工程师走进一家酒吧,要了一杯洗脚水; 一个测试工程师走进一家酒吧,要了一杯蜥蜴; 一个测试工程师走进一家酒吧,要了一份 asdfQwer@24dg!&*(@; 一个测试工程师走进一家酒吧,什么也没要; 一个测试工程师走进一家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来; 一个测试工程师走进一家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿; 一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷; 一个测试工程师走进一家酒吧,要了 NaN 杯 Null ; 一个测试工程师冲进一家酒吧,要了 500T 啤酒咖啡洗脚水野猫狼牙棒奶茶; 一个测试工程师把酒吧拆了; 一个测试工程师化装成老板走进一家酒吧,要了 500 杯啤酒并且不付钱; 一万个测试工程师在酒吧门外呼啸而过; 一个测试工程师走进一家酒吧,要了一杯啤酒';DROP TABLE 酒吧; 测试工程师们满意地离开了酒吧。 然后一名顾客点了一份炒饭,酒吧炸了。 |