架構(gòu)修煉之道|一個(gè)傳統(tǒng)網(wǎng)關(guān)系統(tǒng)有幾種“死”法

架構(gòu)修煉之道 | 一個(gè)傳統(tǒng)網(wǎng)關(guān)系統(tǒng)有幾種 “死” 法

湘橋ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

本文節(jié)選自《架構(gòu)修煉之道》,作者京東王新棟。

圖 | meghan-holmes-779221-unsplash

這里說的傳統(tǒng),是按照網(wǎng)關(guān)技術(shù)演進(jìn)的階段劃分的,從同步到半同步,再到全異步,我們將同步和半同步技術(shù)下的網(wǎng)關(guān)稱為“傳統(tǒng)”網(wǎng)關(guān),同步網(wǎng)關(guān)的意思是從接收請(qǐng)求到調(diào)用API接口提供方的過程都是同步調(diào)用;半同步則是指將I/O請(qǐng)求線程和業(yè)務(wù)處理線程分開,但業(yè)務(wù)線程內(nèi)部還是同步調(diào)用API接口;全異步的意思就比較清楚了,整個(gè)鏈路都是異步請(qǐng)求。接下來介紹“傳統(tǒng)”網(wǎng)關(guān)會(huì)在什么情況下“down掉”。

API網(wǎng)關(guān)系統(tǒng)有兩大特點(diǎn),一個(gè)是訪問量大,另一個(gè)是依賴系統(tǒng)多。如下圖所示,“單純”的情況下(比如系統(tǒng)A提供的接口只供網(wǎng)關(guān)調(diào)用)網(wǎng)關(guān)系統(tǒng)要承受比被依賴的系統(tǒng)多數(shù)倍的流量,因?yàn)锳PI網(wǎng)關(guān)是所有依賴API的集合。網(wǎng)關(guān)還會(huì)通過RPC調(diào)用很多底層系統(tǒng),每個(gè)系統(tǒng)的穩(wěn)定性水平參差不齊,接口的性能也會(huì)間接影響網(wǎng)關(guān)整體的運(yùn)行穩(wěn)定性。因此我們在做防范的時(shí)候就要從這兩個(gè)特點(diǎn)入手。

 

架構(gòu)修煉之道 | 一個(gè)傳統(tǒng)網(wǎng)關(guān)系統(tǒng)有幾種 “死” 法 

上面介紹了API網(wǎng)關(guān)的兩大特點(diǎn),這兩個(gè)特點(diǎn)算外部因素,接著再來看一下內(nèi)部因素。程序都是運(yùn)行在計(jì)算機(jī)上面的,計(jì)算機(jī)的每個(gè)部件的利用率和負(fù)載水平直接影響程序的運(yùn)行。比如CPU、內(nèi)存、磁盤等。另外系統(tǒng)之間的交互還需要網(wǎng)絡(luò),這些都需考慮。一段程序在計(jì)算機(jī)中的運(yùn)行依賴部件如下圖所示。

架構(gòu)修煉之道 | 一個(gè)傳統(tǒng)網(wǎng)關(guān)系統(tǒng)有幾種 “死” 法

關(guān)注CPU

用戶請(qǐng)求在進(jìn)入網(wǎng)關(guān)的時(shí)候我們從技術(shù)上已經(jīng)把I/O請(qǐng)求線程和業(yè)務(wù)處理線程隔離開了,這一點(diǎn)可以利用Servlet3異步特性實(shí)現(xiàn)(下面還會(huì)詳細(xì)介紹Servlet3的異步特性),如下圖所示。

架構(gòu)修煉之道 | 一個(gè)傳統(tǒng)網(wǎng)關(guān)系統(tǒng)有幾種 “死” 法

業(yè)務(wù)線程池毫無疑問是在CPU里面運(yùn)行的,線程是計(jì)算機(jī)CPU最寶貴的資源,我們一定要重點(diǎn)關(guān)注CPU利用率和CPU負(fù)載。

  • CPU利用率:顯示的是程序在運(yùn)行期間實(shí)時(shí)占用的CPU百分比。

  • CPU負(fù)載:顯示的是一段時(shí)間內(nèi)正在使用和等待使用CPU的平均任務(wù)數(shù)。在Linux系統(tǒng)中,我們可以使用uptime或top(使用top會(huì)看到更詳細(xì)的信息)命令來查看系統(tǒng)的負(fù)載情況。如果使用uptime命令則會(huì)得到如下一行:


11:36 up 23 days, 2:31, 2users, load averages: 1.74 1.58 1.60

最后的loadaverages的意思是系統(tǒng)平均負(fù)載,它包含三個(gè)數(shù)字,這三個(gè)數(shù)字分別表示1分鐘、5分鐘、15分鐘內(nèi)系統(tǒng)的負(fù)載平均值。我們可以按照1分鐘的粒度取第一個(gè)數(shù)字,從而判定系統(tǒng)負(fù)載的大小。

上面的23days說明筆者有23天沒有重啟過計(jì)算機(jī)了。

注意,CPU利用率高,并不意味著負(fù)載就一定大,兩者沒有必然聯(lián)系。

架構(gòu)修煉之道 | 一個(gè)傳統(tǒng)網(wǎng)關(guān)系統(tǒng)有幾種 “死” 法

關(guān)于這兩個(gè)概念的理解,我們還可以舉一個(gè)例子來說明。有8個(gè)人在排隊(duì)玩一個(gè)打地鼠的游戲機(jī),要求1分鐘之內(nèi)要打完100個(gè)地鼠,如果有人一分鐘之內(nèi)沒有完成這個(gè)任務(wù),那么就需要重新排隊(duì),等待下一輪。游戲機(jī)在這里相當(dāng)于CPU,正在或等待玩打地鼠游戲的人就相當(dāng)于任務(wù)數(shù)量。

在玩游戲的過程中,肯定有的人在規(guī)定的1分鐘之內(nèi)打完100個(gè)地鼠,完成任務(wù)之后就離開了,有人沒有完成任務(wù)而去重新排隊(duì),還有可能有新增的人來玩這個(gè)游戲,人數(shù)的變化相當(dāng)于任務(wù)的增減。有的人拿起打地鼠的錘子就開始玩,一直打完1分鐘,而有的人可能在前20秒看手機(jī),后40秒才開始玩打地鼠。把游戲機(jī)看作CPU,排隊(duì)的人數(shù)看作任務(wù)數(shù),我們說前一種人(任務(wù))的CPU利用率高,后一種人(任務(wù))的CPU利用率低。

當(dāng)然CPU不會(huì)在前20秒休息、后40秒工作,只是說,有的程序可能涉及的計(jì)算量比較大,CPU利用率就高,而有的程序涉及的計(jì)算少,CPU的利用率就低。不管CPU利用率是高是低,跟后面有多少人(任務(wù))在排隊(duì)沒有必然的聯(lián)系。

之所以花了一些篇幅來介紹CPU的這兩個(gè)概念,因?yàn)檫@兩個(gè)指標(biāo)實(shí)在是太重要了,在線上生產(chǎn)環(huán)境中是需要重點(diǎn)監(jiān)控的。鑒于API網(wǎng)關(guān)的訪問量大和依賴系統(tǒng)多的特點(diǎn),如果調(diào)用的API性能突然變差,在大訪問量的情況下,線程數(shù)會(huì)逐漸升高,直至將CPU資源耗盡。蔓延到整個(gè)網(wǎng)關(guān)集群,這就是雪崩的效應(yīng)。

關(guān)注磁盤

磁盤有兩個(gè)比較重要的指標(biāo)分別是磁盤使用率和磁盤負(fù)載百分比。磁盤使用率比較容易理解,我們重點(diǎn)說一下磁盤負(fù)載百分比這個(gè)指標(biāo)。在Linux系統(tǒng)下查看該指標(biāo)的命令為 iostat -x 1 10 (如果沒有iostat ,則需要使用yum install sysstat進(jìn)行安裝),筆者下面的圖中示例值還構(gòu)不成威脅,但如果 %util 接近 100%,則說明產(chǎn)生的I/O請(qǐng)求太多,I/O系統(tǒng)已經(jīng)滿負(fù)荷,該磁盤可能存在瓶頸,如下圖所示。

架構(gòu)修煉之道 | 一個(gè)傳統(tǒng)網(wǎng)關(guān)系統(tǒng)有幾種 “死” 法

程序運(yùn)行的過程中我們可能都不會(huì)關(guān)注磁盤的使用,如果處理不當(dāng),這有可能是一個(gè)“定時(shí)炸彈”。網(wǎng)關(guān)的特性訪問量大,再加上有的程序里面的日志打印不規(guī)范,比如日志的級(jí)別設(shè)置得不合理,把info日志打印出來。即使在日志級(jí)別合理的情況下,比如error日志,這時(shí)又涉及網(wǎng)關(guān)的第二個(gè)特性,依賴系統(tǒng)多。當(dāng)有API返回失敗錯(cuò)誤的時(shí)候,就會(huì)有大量的error日志寫入磁盤,很容易把磁盤打滿,尤其在容器時(shí)代,每臺(tái)服務(wù)器分配的磁盤容量相對(duì)物理機(jī)來說都比較小,如果集群的所有機(jī)器磁盤被打滿,對(duì)網(wǎng)關(guān)系統(tǒng)來說無疑是一場災(zāi)難。

關(guān)注網(wǎng)絡(luò)

在微服務(wù)系統(tǒng)架構(gòu)下,應(yīng)用離不開網(wǎng)絡(luò),尤其是網(wǎng)關(guān)系統(tǒng),它的特點(diǎn)之一就是依賴系統(tǒng)多。依賴就是RPC調(diào)用和網(wǎng)絡(luò)。在一個(gè)RPC環(huán)境下,網(wǎng)絡(luò)占據(jù)了一次RPC調(diào)用所耗時(shí)間的很大比重。網(wǎng)絡(luò)質(zhì)量的好壞直接影響了一次請(qǐng)求從進(jìn)入API網(wǎng)關(guān)到返回給用戶響應(yīng)的時(shí)間長短。如下圖所示,網(wǎng)關(guān)到依賴系統(tǒng)B之間的網(wǎng)絡(luò)突然變差,調(diào)用時(shí)長增加,在請(qǐng)求訪問量多的時(shí)候,一請(qǐng)求一線程的模式下,會(huì)直接導(dǎo)致API 網(wǎng)關(guān)系統(tǒng)的任務(wù)線程數(shù)增多,如果短時(shí)間內(nèi)不能恢復(fù),則整個(gè)API網(wǎng)關(guān)的集群所有機(jī)器的CPU資源都會(huì)被線程耗盡。

同時(shí)現(xiàn)有的線上生產(chǎn)環(huán)境部署并不能完全保證同機(jī)房調(diào)用,甚至還有跨地區(qū)調(diào)用,因此網(wǎng)絡(luò)是我們要考慮的一個(gè)重要因素,同時(shí)網(wǎng)絡(luò)的因素需要和上面講到的CPU的線程資源相關(guān)聯(lián)去考慮。

架構(gòu)修煉之道 | 一個(gè)傳統(tǒng)網(wǎng)關(guān)系統(tǒng)有幾種 “死” 法

現(xiàn)在可以總結(jié)一個(gè)傳統(tǒng)API網(wǎng)關(guān)系統(tǒng)會(huì)有幾種“死”法了,因?yàn)橐蕾嚨哪硞€(gè)系統(tǒng)的API性能突然變差導(dǎo)致請(qǐng)求線程數(shù)量逐漸升高直至線程占滿了CPU,也就是API網(wǎng)關(guān)依賴系統(tǒng)多的特點(diǎn)因素,可以認(rèn)為是被其他系統(tǒng)“拖死”的。線上生產(chǎn)環(huán)境下日志輸出不規(guī)范,過度打印日志,再加上請(qǐng)求量突然變大,導(dǎo)致清理工具來不及清理日志,最后磁盤滿了,可以認(rèn)為是被日志“打死”的。網(wǎng)絡(luò)一直是一個(gè)除系統(tǒng)本身外最不穩(wěn)定的因素,在系統(tǒng)之間調(diào)用的時(shí)候,網(wǎng)絡(luò)發(fā)生故障導(dǎo)致請(qǐng)求變慢,這一點(diǎn)和第一條被其他系統(tǒng)“拖死”類似,只是這次是網(wǎng)絡(luò)。

查理.芒格有一句名言:“如果我知道我會(huì)死在哪里,我將永遠(yuǎn)不去那個(gè)地方”。同樣對(duì)于一個(gè)API網(wǎng)關(guān)系統(tǒng),如果我們知道哪些因素會(huì)導(dǎo)致一個(gè)網(wǎng)關(guān)“掛掉”,那么我們就會(huì)提前防范,以避免這種“災(zāi)難”的發(fā)生。當(dāng)然并不是宣揚(yáng)傳統(tǒng)網(wǎng)關(guān)不好,它也有自己的優(yōu)勢,比如編程模型簡單、開發(fā)調(diào)試運(yùn)維方便等。如果業(yè)務(wù)規(guī)模較小,比如每天調(diào)用量不足千萬,或者不到億級(jí),那么可以繼續(xù)使用這種類型的網(wǎng)關(guān),甚至達(dá)到億級(jí)規(guī)模之后再配合有效的容錯(cuò)機(jī)制(比如Netflix的zuul1+Hystrix)也可以支撐上億規(guī)模的訪問量。不過我們有更好的異步網(wǎng)關(guān)解決方案,接下來介紹異步網(wǎng)關(guān)技術(shù)實(shí)現(xiàn)。

本文作者:王新棟

現(xiàn)就職于京東,“程序架道”公眾號(hào)作者。平時(shí)熱愛總結(jié)與分享,對(duì)高性能API網(wǎng)關(guān)、線程調(diào)優(yōu)、NIO、微服務(wù)架構(gòu)、容錯(cuò)等技術(shù)有較深的研究和實(shí)戰(zhàn)經(jīng)驗(yàn)。目前致力于帶領(lǐng)團(tuán)隊(duì)在平臺(tái)開放技術(shù)領(lǐng)域?qū)崿F(xiàn)突破。

名稱欄目:架構(gòu)修煉之道|一個(gè)傳統(tǒng)網(wǎng)關(guān)系統(tǒng)有幾種“死”法
新聞來源:http://bm7419.com/article36/gocdpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)外貿(mào)網(wǎng)站建設(shè)、定制開發(fā)、網(wǎng)站策劃、響應(yīng)式網(wǎng)站、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)