一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

架構(gòu)師寫(xiě)的BUG會(huì)是什么樣的

jf_ro2CN3Fa ? 來(lái)源:小姐姐味道 ? 2023-10-19 18:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

64bad34c-6e2b-11ee-939d-92fbcf53809c.png

架構(gòu)師說(shuō),我的代碼不需要做注釋。所謂的注釋?zhuān)际墙o垃圾代碼用的。我深以為是,他明顯是受到了Netflix公司的影響。

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

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

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

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

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

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

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

Monitor$MonitorKey@15aeb7ab

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

64cec99c-6e2b-11ee-939d-92fbcf53809c.png

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

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

線(xiàn)程1:獲取key為a的值
線(xiàn)程2:獲取key為a的值
線(xiàn)程1:a為null,生成一個(gè)b
線(xiàn)程2:a為null,生成一個(gè)c
線(xiàn)程1:保存a=b
線(xiàn)程2:保存a=c

此時(shí),B丟了。

業(yè)務(wù)可以忍受,但嚴(yán)謹(jǐn)?shù)募夹g(shù)大牛們?nèi)淌懿涣?,提出了修改的意?jiàn)。

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

publicsynchronizedvoidvisit(Stringurl,Stringdesc,longtimeCost)

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

MonitorKeykey=newMonitorKey(url,desc);
MonitorValuevalue=monitors.putIfAbsent(key,newMonitorValue());
value.count.getAndIncrement();
value.totalTime.getAndAdd(timeCost);
value.avgTime=value.totalTime.get()/value.count.get();

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

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

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

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

編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 堆棧
    +關(guān)注

    關(guān)注

    0

    文章

    183

    瀏覽量

    20078
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4893

    瀏覽量

    70442
  • 架構(gòu)師
    +關(guān)注

    關(guān)注

    0

    文章

    47

    瀏覽量

    4763

原文標(biāo)題:架構(gòu)師寫(xiě)的BUG,非比尋常

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    kintex產(chǎn)品架構(gòu)設(shè)計(jì)文檔(成為架構(gòu)師也是電子人不錯(cuò)的選...

    kintex產(chǎn)品架構(gòu)設(shè)計(jì)文檔(成為架構(gòu)師也是電子人不錯(cuò)的選擇) ROCE(儒仕),用心為每一位電子人!Xilinx7系列普及講座,架構(gòu)師設(shè)計(jì)方案模板,交流學(xué)習(xí) 內(nèi)容請(qǐng)下載附件pdf,更多內(nèi)容請(qǐng)登錄ww..rocetech..co
    發(fā)表于 04-30 16:41

    關(guān)于架構(gòu)師的詳細(xì)介紹

    溝通能力被排在架構(gòu)師能力的第一位,它既是架構(gòu)師入門(mén)能力,也是最難用量化標(biāo)準(zhǔn)來(lái)的能力。本文將為大家介紹架構(gòu)師——能說(shuō)會(huì)道的程序員。
    發(fā)表于 07-11 07:20

    架構(gòu)師的能力鍛煉

    架構(gòu)師每天都需要做選擇題。什么選擇?怎么做選擇?架構(gòu)師需要進(jìn)行怎樣的學(xué)習(xí)、培訓(xùn)和鍛煉來(lái)進(jìn)行正確的選擇?讀了本篇文章,你會(huì)對(duì)架構(gòu)師為什么會(huì)需要權(quán)衡取舍以及妥協(xié)的能力有一個(gè)更加深刻的印象,并對(duì)于如何鍛煉這個(gè)能力有一個(gè)初步的認(rèn)識(shí)。
    發(fā)表于 07-11 08:29

    架構(gòu)師最重要的是什么

    軟件架構(gòu)師的定義乃至所需要的特質(zhì)歷來(lái)眾說(shuō)紛紜。下面從一些另類(lèi)的角度來(lái)做點(diǎn)分析。
    發(fā)表于 07-15 08:12

    好的架構(gòu)師為什么是出色的程序員

    一個(gè)優(yōu)秀的軟件架構(gòu)師,首先一定是一個(gè)出色的程序員,這是本篇文章的議題。從本文我們可以了解到一個(gè)架構(gòu)師的工作是什么,他容易遇到的問(wèn)題是什么,因此他為什么必須是一個(gè)出色的程序員。
    發(fā)表于 07-17 07:03

    女性會(huì)更適合做架構(gòu)師?

    人們往往發(fā)現(xiàn)優(yōu)秀的數(shù)學(xué)家、物理學(xué)家以及軟件架構(gòu)師有著很多相似的素質(zhì),甚至往往能夠一人精通這好幾個(gè)領(lǐng)域,其中很重要的原因就是這個(gè)抽象思維的能力。架構(gòu)師們潛意識(shí)中會(huì)覺(jué)得女性更適合做架構(gòu)師?讓我們看看這是為什么。
    發(fā)表于 07-17 06:15

    最難調(diào)試的Bug什么樣的?

    你碰到過(guò)的最難調(diào)試的 Bug什么樣的?
    發(fā)表于 06-10 13:32

    未來(lái)環(huán)保汽車(chē)會(huì)是什么樣?

    未來(lái)環(huán)保汽車(chē)會(huì)是什么樣? 一汽-大眾
    發(fā)表于 04-07 09:08 ?1929次閱讀
    未來(lái)環(huán)保汽車(chē)<b class='flag-5'>會(huì)是</b><b class='flag-5'>什么樣</b>?

    一位支付寶架構(gòu)師自述從工程架構(gòu)師的成長(zhǎng)之路

    寫(xiě)這篇文章之前,我特意把這幾年看過(guò)的關(guān)于架構(gòu)架構(gòu)師的書(shū)重新翻了一遍,結(jié)果發(fā)現(xiàn)它們的定義或多或少有一些不一,而經(jīng)過(guò)了這幾年,一些之前同意的觀點(diǎn),現(xiàn)在的我也不敢茍同了。另一方面,業(yè)界
    的頭像 發(fā)表于 06-05 10:57 ?4385次閱讀

    怎樣成為一名資深Java架構(gòu)師

    要想往架構(gòu)師的方向發(fā)展首先要知道架構(gòu)師是什么?
    的頭像 發(fā)表于 10-17 09:03 ?3350次閱讀

    大數(shù)據(jù)架構(gòu)師的職責(zé)有哪些

    架構(gòu)師按照專(zhuān)注領(lǐng)域不同,可分為企業(yè)架構(gòu)師、基礎(chǔ)結(jié)構(gòu)架構(gòu)師、特定技術(shù)架構(gòu)和解決方案架構(gòu)師等,專(zhuān)職架構(gòu)師
    的頭像 發(fā)表于 04-04 16:24 ?4063次閱讀

    開(kāi)發(fā)工程架構(gòu)師的區(qū)別

    架構(gòu)師是程序員的職業(yè)生涯發(fā)展的一個(gè)方向,很多架構(gòu)師都是從開(kāi)發(fā)人員逐步過(guò)渡來(lái)的,程序員想要成為架構(gòu)師,平時(shí)就應(yīng)該身負(fù)“架構(gòu)師”職責(zé),用架構(gòu)師
    的頭像 發(fā)表于 04-04 16:35 ?1.4w次閱讀

    前端工程轉(zhuǎn)型架構(gòu)師的經(jīng)歷

    前端架構(gòu)師, 聽(tīng)起來(lái)就是個(gè)很高大上的 Title, 每個(gè)初入行的前端工程在面試時(shí), 被問(wèn)到你未來(lái)的方向是什么? 我們或許都會(huì)很順口的回答, “嗯, 朝著架構(gòu)方向走吧。..”, 那這個(gè)像是順口溜
    的頭像 發(fā)表于 07-23 14:16 ?4381次閱讀

    什么是 SoC 設(shè)計(jì)中的系統(tǒng)架構(gòu)師?

    您知道系統(tǒng)架構(gòu)師在片上系統(tǒng) (SoC) 設(shè)計(jì)中的具體工作嗎?如果您已經(jīng)認(rèn)識(shí)或經(jīng)驗(yàn)豐富的系統(tǒng)架構(gòu)師,那么可能無(wú)需進(jìn)一步閱讀。但是,如果您是我們眾多正在探索該行業(yè)機(jī)會(huì)的年輕讀者之一,請(qǐng)繼續(xù)閱讀,看看這是
    的頭像 發(fā)表于 07-18 16:26 ?2325次閱讀
    什么是 SoC 設(shè)計(jì)中的系統(tǒng)<b class='flag-5'>架構(gòu)師</b>?

    阿里專(zhuān)家:架構(gòu)師是一個(gè)什么樣的角色

    架構(gòu)其實(shí)是每個(gè)業(yè)務(wù)線(xiàn)都有,有些技術(shù)同學(xué)本身也是架構(gòu)師的角色。阿里很早以前是專(zhuān)門(mén)有架構(gòu)師崗位,專(zhuān)門(mén)的去做架構(gòu),但是做著做著架構(gòu)師就做沒(méi)了。
    的頭像 發(fā)表于 03-14 09:25 ?997次閱讀