成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

架構(gòu)師寫的BUG,非比尋常

開發(fā) 前端
小伙話不多,但一旦說話斬釘截鐵,帶著無法撼動(dòng)的自信。原因就是,有他著數(shù)億高并發(fā)經(jīng)驗(yàn),每一秒鐘的請(qǐng)求,都是其他企業(yè)運(yùn)行一年也無法企及的。這就讓人非常羨慕,畢竟他靠這個(gè)比我賺的錢要多。

[[334345]]

本文轉(zhuǎn)載自微信公眾號(hào)「小姐姐味道」,作者小姐姐養(yǎng)的狗 。轉(zhuǎn)載本文請(qǐng)聯(lián)系小姐姐味道公眾號(hào)。

部門新來了個(gè)架構(gòu)師,BAT背景,住在三環(huán),開寶馬上班,有車位。

小伙話不多,但一旦說話斬釘截鐵,帶著無法撼動(dòng)的自信。原因就是,有他著數(shù)億高并發(fā)經(jīng)驗(yàn),每一秒鐘的請(qǐng)求,都是其他企業(yè)運(yùn)行一年也無法企及的。這就讓人非常羨慕,畢竟他靠這個(gè)比我賺的錢要多。

俗話說,要想在公司不出事故,那就不要寫代碼。干活多了容易出事,一身輕松無人問津,這就是現(xiàn)實(shí)。

但有時(shí)候還是要看成果的。新來的研發(fā)領(lǐng)導(dǎo)不懂技術(shù),但他懂技術(shù)指標(biāo),所以就統(tǒng)計(jì)大家提交git的數(shù)量,如果git活動(dòng)是一片綠色如A股,那就算過關(guān)了。

架構(gòu)師思來想去,決定領(lǐng)一個(gè)并發(fā)量最高的需求:統(tǒng)計(jì)接口的平均響應(yīng)時(shí)間和啟動(dòng)以來的請(qǐng)求數(shù)。

為什么說它的并發(fā)量高呢?這是因?yàn)椋墙y(tǒng)計(jì)所有接口的,自然比每一個(gè)接口的請(qǐng)求量都要大。AOP代碼一包,每個(gè)接口都得從他這里走一圈。

該我們的架構(gòu)師上場(chǎng)了。代碼如圖。

 

架構(gòu)師說,我的代碼不需要做注釋。所謂的注釋,都是給垃圾代碼用的。我深以為是,他明顯是受到了Netflix公司的影響。

程序考慮到了高并發(fā)場(chǎng)景,使用了線程安全的ConcurrentHashMap,然后每次通過監(jiān)控key取出相應(yīng)的數(shù)據(jù),然后在value上遞增。這么簡(jiǎn)單的代碼,確實(shí)不需要增加什么注釋。

作為項(xiàng)目里并發(fā)量最高的代碼,出于對(duì)高級(jí)架構(gòu)師的信任,我們并不需要做什么代碼review,也不需要做什么測(cè)試。大家都很忙,代碼您吶,到線上遛一遛吧。

我建議你先找一找代碼的問題,如果你發(fā)現(xiàn)了問題,那就比架構(gòu)師還厲害;如果你沒發(fā)現(xiàn),也不證明你比架構(gòu)師弱,沒有什么好傷心的。

下面插一副圖,阻斷一下思維。

[[334346]]

 

裝B遭雷劈,線上運(yùn)行一段時(shí)間后,內(nèi)存溢出了。

大家吵吵個(gè)沒完,畢竟xjjdog說過,內(nèi)存溢出問題的排查周期很長(zhǎng),大約平均需要40天左右才能解決問題。在大家開始論證的時(shí)候,架構(gòu)師偷偷的啟動(dòng)了Eclipse MAT。MAT用來分析內(nèi)存問題是非常合適的,但前提是你需要把堆棧給搗鼓下來。

架構(gòu)師會(huì)用jmap,最主要的是權(quán)限大,于是自己搞了一份拷貝到線下分析。

我能理解到他的心情,畢竟問題定位到自己的代碼不是一件什么值得高興的事情。他發(fā)現(xiàn)內(nèi)存的堆里面,滿滿的全是MonitorKey和MonitorValue。

Monitor$MonitorKey@15aeb7ab

我和架構(gòu)師關(guān)系比較好,于是他問我:咱們的接口是不是特別的多?

我說:不是啊,你別看訪問量大,就這么個(gè)狗屁業(yè)務(wù)能有多少接口?幾百個(gè)撐了天了。

他說:我在堆里發(fā)現(xiàn)了幾千萬個(gè)...

說完他就不言語了,因?yàn)樗l(fā)現(xiàn)里面有不少是一樣的接口。一定是參數(shù)的原因,所以他在代碼里加了這個(gè),把?后面的給截?cái)嗔恕?/p>

  1. key = key.split("\\?")[0]; 

結(jié)果發(fā)布到線上,過不了多久內(nèi)存又溢出了。這次終于引起了大牛們的注意,經(jīng)過大家的分析,發(fā)現(xiàn)代碼是忘了給MonitorKey重寫equals和hashCode方法了。

我不禁臉紅起來。作為好朋友,我不應(yīng)該讓他出這個(gè)丑。但我又是隱隱快樂的,因?yàn)樗べY比我高。

所以這就是一個(gè)很大的問題。很多同學(xué)對(duì)HashMap的知識(shí)點(diǎn)對(duì)答如流,甚至還專門記憶了紅黑樹。但換一個(gè)方式去問,卻又一臉懵逼。

其中一種問法是這樣的:一個(gè)普通的對(duì)象,能夠作為HashMap的key么?

答案顯然是可以的,但需要注意重寫hashCode和equals方法。如果忘記重寫的話,大概率會(huì)造成內(nèi)存泄漏。

很不幸,現(xiàn)實(shí)中忘記的案例很多。大牛架構(gòu)師也會(huì)中招。

代碼重寫hashCode和equals方法后,線上就再也沒發(fā)生過內(nèi)存溢出。

等等,還沒完。畢竟是架構(gòu)師,僅僅這樣一個(gè)bug還是證明不了水平的。架構(gòu)師寫的bug,肯定非比尋常。

這種事出現(xiàn)的多了,研發(fā)領(lǐng)導(dǎo)對(duì)技術(shù)的權(quán)威性就不再是那么感冒。我們決定從并發(fā)量最高的代碼開始,進(jìn)行一下代碼review。

很不幸,架構(gòu)師的visit代碼出現(xiàn)問題了。雖然問題不是很大,但它畢竟是個(gè)問題。

 

在統(tǒng)計(jì)數(shù)據(jù)的時(shí)候,代碼使用了ConcurrentHashMap,但它并沒有什么卵用。

visit方法,首先拿出了key,然后判空,再塞值。這明顯不是一個(gè)原子操作。

  1. 線程1:獲取key為a的值 
  2. 線程2:獲取key為a的值 
  3. 線程1:a為null,生成一個(gè)b 
  4. 線程2:a為null,生成一個(gè)c 
  5. 線程1:保存a=b 
  6. 線程2:保存a=c 

此時(shí),B丟了。

業(yè)務(wù)可以忍受,但嚴(yán)謹(jǐn)?shù)募夹g(shù)大牛們?nèi)淌懿涣耍岢隽诵薷牡囊庖姟?/p>

架構(gòu)師說,給visit方法加個(gè)synchronized不就成了。

  1. public synchronized void visit(String url, String desc, long timeCost)  

我說不行。有更優(yōu)雅的寫法,效率更高。那就是使用putIfAbsent方法,代碼改動(dòng)如下:

MonitorKey key = new MonitorKey(url, desc);MonitorValue value = monitors.putIfAbsent(key, new MonitorValue());value.count.getAndIncrement();value.totalTime.getAndAdd(timeCost);value.avgTime = value.totalTime.get() / value.count.get();

大家就這兩種方式爭(zhēng)論了起來。

技術(shù)總監(jiān)托著腮想了半天,看了看爭(zhēng)的面紅耳赤的同學(xué)們,說:這就是我不放心你們的緣故。線上環(huán)境要盡量保持穩(wěn)定性,做最小的變更。既然加個(gè)synchronized就能夠很容易簡(jiǎn)單解決的問題,為啥不直接用呢?下面這種代碼改動(dòng)太大,有風(fēng)險(xiǎn)。

總監(jiān)接著把頭轉(zhuǎn)向我:這個(gè)BUG非比尋常,為了讓大家引以為戒,你來做整個(gè)事故的復(fù)盤。把問題的排查和得到的教訓(xùn)分享給大家,讓大家向這種至簡(jiǎn)的架構(gòu)看齊。我們平常的工作中,也要盡量以結(jié)果導(dǎo)向?yàn)橹鳎檬裁词侄螣o所謂,能漂亮把事情辦好就行。

這就是此篇文章的由來,我虛心受教,同時(shí)也明白自己的工資是漲不上去了。

你要是點(diǎn)個(gè)贊或者友情三連,或許還能安慰我一下下。

作者簡(jiǎn)介:小姐姐味道 (xjjdog)。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個(gè)人微信xjjdog0,歡迎添加好友,進(jìn)一步交流。

 

責(zé)任編輯:武曉燕 來源: 小姐姐味道
相關(guān)推薦

2021-02-21 09:28:24

kafka系統(tǒng)并發(fā)量

2011-11-30 09:32:41

互聯(lián)網(wǎng)經(jīng)濟(jì)大會(huì)

2020-08-04 09:11:47

架構(gòu)師垃圾代碼

2010-06-17 16:12:43

WAP協(xié)議

2017-01-12 09:57:04

2016-12-22 23:55:40

架構(gòu)師代碼技術(shù)

2014-07-15 16:43:57

2020-08-27 08:54:02

腳本架構(gòu)師Linux

2010-10-18 09:10:57

Google日歷宕機(jī)

2022-05-16 13:52:38

黑客網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2022-01-05 20:37:28

運(yùn)維

2020-08-24 08:50:12

架構(gòu)師TL技術(shù)

2009-12-18 10:22:50

Ray Ozzie架構(gòu)師

2012-08-04 16:02:00

架構(gòu)師

2022-04-28 13:08:51

架構(gòu)師軟件

2020-10-26 09:02:45

如何校驗(yàn)參數(shù)

2019-07-23 18:15:26

技術(shù)大數(shù)據(jù)數(shù)據(jù)庫(kù)

2010-12-28 10:40:50

admin

2015-10-28 13:39:25

2012-06-17 12:58:04

架構(gòu)師架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 成人在线视频免费观看 | 欧美a区| 天天干成人网 | 96国产精品久久久久aⅴ四区 | 欧美久久精品一级黑人c片 91免费在线视频 | 国产欧美一级二级三级在线视频 | 黄色小视频大全 | 亚洲一区二区视频在线观看 | 亚洲欧美在线观看 | 国产麻豆乱码精品一区二区三区 | av在线免费观看网站 | 国产一区二区在线免费观看 | 国产小视频在线 | 91精品免费 | 91av在线视频观看 | 伊人狠狠 | 欧美寡妇偷汉性猛交 | 国产一区二区三区久久久久久久久 | 欧美精品在线一区 | 老司机久久 | 欧美一区二区成人 | 黄色大片毛片 | 综合二区| 在线一区二区国产 | 中文字幕在线网 | 中文字幕日韩av | 99久久精品国产一区二区三区 | 国产精品18hdxxxⅹ在线 | 成人亚洲| 一级一片在线观看 | 欧美日韩国产一区二区三区 | 日本一区二区影视 | 91亚洲精品在线观看 | 亚洲国产精品视频 | 国产成人jvid在线播放 | 精品国产免费一区二区三区五区 | 成人免费看片 | 99tv| 天堂综合网久久 | 久草成人 | 性高湖久久久久久久久3小时 |