敖丙我写了一个新手都写不出的低级bug,被骂惨了。

https://mp.weixin.qq.com/s/yB9s771gDz6oMKZsUnJuyg

敖丙我写了一个新手都写不出的低级bug,被骂惨了。

收录于话题程序员

#程序员 1568 #程序人生 669算法

前前言

image.png

为啥今天有个前前言呢?数据库

由于大家的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(内心乐开花)。服务器

也有好几个号主发来问候,直接实名羡慕哈哈,丙丙之后也是被微信推荐过的男人了,大家也是有牌面的读者了。微信

image.png

前言

大家是否是觉得丙丙这么忙了,确定不会写技术文章给大家看了?session

丙丙暖男来的,不过说实话年前估计是没啥时间写技术文章了,上周末两篇大家也看到了,不是年会就是首脑峰会,实在很忙。负载均衡

这周也是同样,咱们年末了项目也赶,我今天一列下个Q的计划,个人个乖乖,平均三天一个需求,什么鬼啊。ide

并且周四又有技术部的年会,我仍是视频的导演(打杂仔哈哈),确定须要确认不少细节,到时候我应该还能够周末水一篇给大家看(剧透下那一期会有我女神入镜)。ui

下周周二我就坐车回家了,打工仔回家过年了,我也叫我妈把我要回家的消息放出去了,估计媒人这会已经在路上了,到时候相亲我又能够水文章了,过年素材也好多呀,开心。spa

这一篇主要说一下我以前的一个很愚蠢的bug,原本只打算让他呆我笔记里面的,可是仍是忍不住想要分享出来,让你们避免这种低级错误(其实我想水一篇多少有点技术内容的文章,省得写N篇全是水平常的文章,大家估计又要Diss我了)。

正文

我先描述一下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以后,修改变量,我有的地方取的是变量,由于我想每次反正都改了,取也没事。

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

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

因此查询,修改应该这样作:

image.png

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

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

image.png


三太子敖丙

你知道的越多,你不知道的越多

赞扬二维码喜欢做者