敖丙我寫了一個新手都寫不出的低級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


三太子敖丙

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

讚揚二維碼喜歡做者

相關文章
相關標籤/搜索