V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tussik
V2EX  ›  哔哩哔哩

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

  •  
  •   Tussik · 2022-07-14 19:27:54 +08:00 · 3890 次点击
    这是一个创建于 624 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    19 条回复    2022-07-15 07:48:19 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2022-07-14 19:33:45 +08:00   ❤️ 1
    复盘挺好的, 很详细

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

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

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

    欢声笑语中打出 GG
    Mark24
        13
    Mark24  
       2022-07-14 21:46:46 +08:00
    上午发完文,然后 2022.07.13 下午又蹦了,和淘宝一起。
    Tussik
        14
    Tussik  
    OP
       2022-07-14 22:14:33 +08:00
    @nbndco #8 原文也提到了,之前未发现此问题的原因是特殊的发布方式只在生产环境会用到,且使用频率极低。后续他们在线下也复现了此问题。所以我认为从某种程度上来说,也算是测试未能覆盖到此种场景。
    Tussik
        15
    Tussik  
    OP
       2022-07-14 22:15:23 +08:00
    @Mark24 #13 哈哈,然后明年再来一篇复盘 😂
    nbndco
        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 ?不可能的啊。
    testFor
        17
    testFor  
       2022-07-14 23:59:03 +08:00
    我可能连复线都做不出来,别说排查了
    cuebyte
        18
    cuebyte  
       2022-07-15 00:08:32 +08:00
    为什么要过了整整一年来发复盘文章呢?是周年祭?
    ShinichiYao
        19
    ShinichiYao  
       2022-07-15 07:48:19 +08:00   ❤️ 3
    我就想到这个故事

    一个测试工程师走进一家酒吧,要了一杯啤酒;
    一个测试工程师走进一家酒吧,要了一杯咖啡;
    一个测试工程师走进一家酒吧,要了 0.7 杯啤酒;
    一个测试工程师走进一家酒吧,要了-1 杯啤酒;
    一个测试工程师走进一家酒吧,要了 2^32 杯啤酒;
    一个测试工程师走进一家酒吧,要了一杯洗脚水;
    一个测试工程师走进一家酒吧,要了一杯蜥蜴;
    一个测试工程师走进一家酒吧,要了一份 asdfQwer@24dg!&*(@;
    一个测试工程师走进一家酒吧,什么也没要;
    一个测试工程师走进一家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来;
    一个测试工程师走进一家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿;
    一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷;
    一个测试工程师走进一家酒吧,要了 NaN 杯 Null ;
    一个测试工程师冲进一家酒吧,要了 500T 啤酒咖啡洗脚水野猫狼牙棒奶茶;
    一个测试工程师把酒吧拆了;
    一个测试工程师化装成老板走进一家酒吧,要了 500 杯啤酒并且不付钱;
    一万个测试工程师在酒吧门外呼啸而过;
    一个测试工程师走进一家酒吧,要了一杯啤酒';DROP TABLE 酒吧;
    测试工程师们满意地离开了酒吧。
    然后一名顾客点了一份炒饭,酒吧炸了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2785 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:30 · PVG 20:30 · LAX 05:30 · JFK 08:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.