美文网首页让前端飞Web前端之路
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。

阿里程序员写了一个新手都写不出的低级bug,被骂惨了。

作者: 57c7496c74e0 | 来源:发表于2020-03-25 09:25 被阅读0次

    正文
    我先描述一下bug的现象哈:

    image.png

    这两个输入框的值都是我从KV(Redis之类的存储中间件)里面获取到的,也是可以实时修改的,我自作聪明,想着KV里面如果没值,就默认取一个静态变量,这样有个兜底,在类加载的时候加载静态变量,我取的时候也效率高了。

    这就也为我后面的Bug埋下了伏笔,问题是这个Bug烦就烦在他在预发环境是好的,线上却是坏的。

    先看看代码怎么写的:


    image.png

    可以看到代码里面,我是在静态代码块去KV取值,如果有值就用KV的做初始值,没取到我也有默认值,我当时还在想自己的构思真巧妙,用KV比DB效率高,用常量去做兜底,不至于没配置的情况没有值,报空指针啥的。

    当时一个劲给自己加油打气,一个劲的妙啊,不知道自己写了多蠢的代码。

    这样写看似没什么问题,但是我这个值是可以修改的这就有问题了,而且我有几个地方还是取的变量,不是一直取的KV。

    而且常量被我当变量用,也都违背了这玩意的初衷了。

    我上线后,三歪就说:敖丙出大问题了,为啥我刷新一下值就不对了,再刷新值就回来了。

    我惊恐万分,深知我写了BUG,我不着痕迹的擦去我鬓角的汗水,深呼吸了一下。

    回答道:我代码还没写好呢,你怎么乱点,我告诉过你不要乱点的,现在你点坏了吧。

    三歪好像真的以为他错了,委屈巴巴的啥也没说就默默离开了。

    image.png

    这个时候我马上打开电脑,也顾不上歪歪的感受了,思绪转的飞快,开始在闹海中构建整个值传递的链路。

    我改了页面的值,之后我也改了这个静态变量和KV的值,但是我在线上发现我刷新页面一会是修改之后的,一会是修改之前的值.

    这就奇怪了呀,主要是在预发还不能复现,这就很坑爹了,难受呀歪歪。

    Tip:预发指的是,代码跟线上一样,数据库一样,环境配置不一样。

    我把代码看了一遍又一遍,还是没发现问题。

    在当天那个饱暖思淫欲的下午饭之后我,突然灵光一闪发现了问题的核心,预发是好的因为他是一台机器。

    而我们线上的机器是负载均衡的,有两台机器,我修改一次只改了一台机器的值,另外一台没修改到。

    那么问题就简单了,我们看下图: image.png

    预发情况,是单机,不管我怎么读怎么修改,每次数据都是准确的(这里我还没意识到其实每次去取变量是不对的)。

    但是线上不一样,服务器启动的时候给每台机器赋值了,这样的情况如果只是读是没问题的(怪不得静态常量都是private的,能修改的话基本上都有这个问题)。

    但是如果修改,你修改的请求只是打到了一台机器上,如果下次负载均衡请求到了这个机器,那么你很幸运,结果是对的,但是往往负载均衡算法就是那么公平,雨露均沾这样的情况 1/2的请求,都会拿到错误的结果。

    而且这个地方的问题还有一个就是,应该是修改KV之后,修改变量,我有的地方取的是变量,因为我想每次反正都改了,取也没事。
    学习交流
    我建了一个前端学习的交流裙目前来看,学习氛围很不错。进群要求:提问学习、少闲聊、多分享(长期潜水的,就不必了)。https://shimo.im/docs/XTgDptdp3pQJJ6GH/ 《零基础学习前端思路,附带学习资料》

    其实正确的做法是我每次去都读KV就好了,只有KV为空的时候才去读静态变量,作为一种兜底方案,不应该去改变常量的值。

    而且大家要知道,我修改KV成功万一修改常量的时候出错了呢?你取常量的值就不对了。

    所以查询,修改应该这样做: image.png

    主要是想提醒大家,谨慎操作静态常量,能不变就不变,不要写这么骚的操作了,我这算少的很多 40、50台线上机器的服务,这种问题是真的难发现。

    我是万万没想到,我居然写出这种代码,下次再写出来,只能让歪歪不要乱点了,免得又点坏了哈哈。

    白嫖不好,创作不易,各位的点赞就是丙丙创作的最大动力,我们下篇文章见,文末图片有福利!

    持续更新,未完待续……

    相关文章

      网友评论

        本文标题:阿里程序员写了一个新手都写不出的低级bug,被骂惨了。

        本文链接:https://www.haomeiwen.com/subject/fxxtuhtx.html