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

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

  •  
  •   Tussik · 209 天前 · 3305 次点击
    这是一个创建于 209 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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