程式設計師寫了一個新手都寫不出的低階bug,被罵慘了。
你知道的越多,你不知道的越多
點贊再看,養成習慣
本文 GitHub https://github.com/JavaFamily 已收錄,有一線大廠面試點思維導圖,也整理了很多我的文件,歡迎Star和完善,大家面試可以參照考點複習,希望我們一起有點東西。
前前言
為啥今天有個前前言呢?
因為你們的丙丙啊,昨天有牌面了喲,直接被微信官方推薦,知乎推薦,也就僅僅是還行吧(心裡樂開花)。
也有好幾個號主發來問候,直接實名羨慕哈哈,丙丙以後也是被微信推薦過的男人了,你們也是有牌面的讀者了。
前言
你們是不是以為丙丙這麼忙了,肯定不會寫技術文章給你們看了?
丙丙暖男來的,不過說實話年前估計是沒啥時間寫技術文章了,上週末兩篇你們也看到了,不是年會就是首腦峰會,實在很忙。
這周也是一樣,我們年底了專案也趕,我今天一列下個Q的計劃,我的個乖乖,平均三天一個需求,什麼鬼啊。
而且週四又有技術部的年會,我還是視訊的導演(打雜仔哈哈),肯定需要確認很多細節,到時候我應該還可以週末水一篇給你們看(劇透下那一期會有我女神入鏡)。
下週週二我就坐車回家了,打工仔回家過年了,我也叫我媽把我要回家的訊息放出去了,估計媒人這會已經在路上了,到時候相親我又可以水文章了,過年素材也好多呀,開心。
這一篇主要說一下我之前的一個很愚蠢的bug,本來只打算讓他呆我筆記裡面的,但是還是忍不住想要分享出來,讓大家避免這種低階錯誤(其實我想水一篇多少有點技術內容的文章,免得寫N篇全是水日常的文章,你們估計又要Diss我了)。
正文
我先描述一下bug的現象哈:
這兩個輸入框的值都是我從KV(Redis之類的儲存中介軟體)裡面獲取到的,也是可以實時修改的,我自作聰明,想著KV裡面如果沒值,就預設取一個靜態變數,這樣有個兜底,在類載入的時候載入靜態變數,我取的時候也效率高了。
這就也為我後面的Bug埋下了伏筆,問題是這個Bug煩就煩在他在預發環境是好的,線上卻是壞的。
先看看程式碼怎麼寫的:
可以看到程式碼裡面,我是在靜態程式碼塊去KV取值,如果有值就用KV的做初始值,沒取到我也有預設值,我當時還在想自己的構思真巧妙,用KV比DB效率高,用常量去做兜底,不至於沒配置的情況沒有值,報空指標啥的。
當時一個勁給自己加油打氣,一個勁的妙啊,不知道自己寫了多蠢的程式碼。
這樣寫看似沒什麼問題,但是我這個值是可以修改的這就有問題了,而且我有幾個地方還是取的變數,不是一直取的KV。
而且常量被我當變數用,也都違背了這玩意的初衷了。
我上線後,三歪就說:敖丙出大問題了,為啥我重新整理一下值就不對了,再重新整理值就回來了。
我驚恐萬分,深知我寫了BUG,我不著痕跡的擦去我鬢角的汗水,深呼吸了一下。
回答道:我程式碼還沒寫好呢,你怎麼亂點,我告訴過你不要亂點的,現在你點壞了吧。
三歪好像真的以為他錯了,委屈巴巴的啥也沒說就默默離開了。
這個時候我馬上開啟電腦,也顧不上歪歪的感受了,思緒轉的飛快,開始在鬧海中構建整個值傳遞的鏈路。
我改了頁面的值,之後我也改了這個靜態變數和KV的值,但是我線上上發現我重新整理頁面一會是修改之後的,一會是修改之前的值.
這就奇怪了呀,主要是在預發還不能復現,這就很坑爹了,難受呀歪歪。
Tip:預髮指的是,程式碼跟線上一樣,資料庫一樣,環境配置不一樣。
我把程式碼看了一遍又一遍,還是沒發現問題。
在當天那個飽暖思淫慾的下午飯之後我,突然靈光一閃發現了問題的核心,預發是好的因為他是一臺機器。
而我們線上的機器是負載均衡的,有兩臺機器,我修改一次只改了一臺機器的值,另外一臺沒修改到。
那麼問題就簡單了,我們看下圖:
預發情況,是單機,不管我怎麼讀怎麼修改,每次資料都是準確的(這裡我還沒意識到其實每次去取變數是不對的)。
但是線上不一樣,伺服器啟動的時候給每臺機器賦值了,這樣的情況如果只是讀是沒問題的(怪不得靜態常量都是private的,能修改的話基本上都有這個問題)。
但是如果修改,你修改的請求只是打到了一臺機器上,如果下次負載均衡請求到了這個機器,那麼你很幸運,結果是對的,但是往往負載均衡演算法就是那麼公平,雨露均沾這樣的情況 1/2的請求,都會拿到錯誤的結果。
而且這個地方的問題還有一個就是,應該是修改KV之後,修改變數,我有的地方取的是變數,因為我想每次反正都改了,取也沒事。
其實正確的做法是我每次去都讀KV就好了,只有KV為空的時候才去讀靜態變數,作為一種兜底方案,不應該去改變常量的值。
而且大家要知道,我修改KV成功萬一修改常量的時候出錯了呢?你取常量的值就不對了。
所以查詢,修改應該這樣做:
主要是想提醒大家,謹慎操作靜態常量,能不變就不變,不要寫這麼騷的操作了,我這算少的很多 40、50臺線上機器的服務,這種問題是真的難發現。
我是萬萬沒想到,我居然寫出這種程式碼,下次再寫出來,只能讓歪歪不要亂點了,免得又點壞了哈哈。
點關注,不迷路
好了各位,以上就是這篇文章的全部內容了,我是敖丙,勵志做一名讓大家都記得住的博主,能看到這裡的人呀,都是人才。
我後面會每週都更新幾篇一線網際網路大廠面試和常用技術棧相關的文章,非常感謝人才們能看到這裡,如果這個文章寫得還不錯,覺得「敖丙」我有點東西的話 求點贊? 求關注❤️ 求分享? 對暖男我來說真的 非常有用!!!
白嫖不好,創作不易,各位的支援和認可,就是我創作的最大動力,我們下篇文章見!
敖丙 | 文 【原創】
如果本篇部落格有任何錯誤,請批評指教,不勝感激 !
文章每週持續更新,可以微信搜尋「 三太子敖丙 」第一時間閱讀和催更(比部落格早一到兩篇喲),本文 GitHub https://github.com/JavaFamily 已經收錄,有一線大廠面試點思維導圖,也整理了很多我的文件,歡迎Star和完善,大家面試可以參照考點複習,希望我們一起有點東西。
相關文章
- 當程式設計師寫不出程式碼了……程式設計師
- 面試了一個 39 歲程式設計師後,我被罵了……面試程式設計師
- 被罵“沒前途”,那個996的程式設計師做錯了什麼?996程式設計師
- 寫了個全域性變數的bug,被同事們打臉!!!變數
- 別罵了,其實低程式碼平臺對程式設計師有這些好處!程式設計師
- 宣佈 Epic 獨佔後,這個獨立遊戲被罵慘了遊戲
- 終於,幫開發寫了一個bug
- 基礎都掌握了卻還是敲不出程式碼?程式設計新手如何快速提升coding能力?程式設計
- 什麼!程式設計師不乖乖寫程式碼,跑去寫小說了?一時興起寫了《雪中悍刀行》的番外,請品鑑!程式設計師
- 優秀的程式設計師都熱愛寫作程式設計師
- 三年Java程式設計師,被無良HR欺騙,3輪面試都過了,最後慘被放鴿子Java程式設計師面試
- 一個老程式設計師的程式設計之路,寫給年輕的程式設計師們程式設計師
- 人人都寫過的5個Bug!
- 那些學了 Python 的程式設計師,程式設計能力都“退化”成什麼樣了?Python程式設計師
- 雷軍做程式設計師時寫的部落格,太牛了!程式設計師
- 雷軍做程式設計師時寫的部落格,太牛了。。程式設計師
- 第一個想取代程式設計師的AI程式設計師,失敗了?程式設計師AI
- 女朋友想減肥,程式設計師花了三天寫了個卡路里計數器程式設計師
- 我打算寫一個《程式設計師的成長課》程式設計師
- 寫了一個 WebSocket 框架Web框架
- 寫了一個 MySQL 代理MySql
- 好程式設計師寫出來的程式碼,就叫好程式碼嗎?你錯了!程式設計師
- 辛苦三個月培養出來的程式設計師,罵幾句就離職了,領導:真無語了程式設計師
- 學Python的程式設計師,程式設計能力都“退化”成什麼樣了?Python程式設計師
- 慘,給Go提的程式碼被批麻了Go
- 有贊996刷屏:男程式設計師們,別再低頭寫程式碼了996程式設計師
- 程式設計師寫的跳轉程式設計師
- 新手程式設計師?教你解決辦法!基礎都掌握了,動手敲程式碼就一臉懵逼程式設計師
- 寫了一個網站(彩票)網站
- 寫了一個 FastCGI 實現AST
- 看看一個老程式設計師是如何手寫Spring MVC的!程式設計師SpringMVC
- 為了收集和整理程式設計的常用單詞,我寫了個背單詞應用程式設計
- 盤點 Python 高手都寫不出來的幾個錯誤Python
- 我們被一個 kong 的效能 bug 折騰了一個通宵
- 糟糕,你寫的 BUG 要被存1000年了!
- 程式設計師寄雪求婚出BUG:年底了,如何求婚成功?程式設計師
- 不同人對BUG的反應,程式設計師:誰動了我的程式碼?程式設計師
- 捅婁子了,寫個bug被國家資訊保安漏洞共享平臺抓到了?