【編者按】本文作者 Rohit Dhall 是一名企業(yè)架構(gòu)師,目前就職于 HCL 科技公司碱呼。 Rohit 擁有 18 年的 IT 工作經(jīng)驗(yàn)颖系,熟悉 Java/J2ee 、 P2P 辩越、 DWH 黔攒、SOA 等技術(shù)趁啸。本文介紹了五種微服務(wù)系統(tǒng)常見(jiàn)的性能挑戰(zhàn),并探討了相應(yīng)的解決策略督惰。
本文系 OneAPM 工程師編譯呈現(xiàn)不傅,以下為正文。
在IT基礎(chǔ)設(shè)施中赏胚,基于微服務(wù)架構(gòu)的系統(tǒng)變得越來(lái)越受歡迎访娶,在這種架構(gòu)中,但凡與業(yè)務(wù)相關(guān)的功能都會(huì)由多于一個(gè)的應(yīng)用組成觉阅,但是對(duì)于整個(gè)集成系統(tǒng)的性能而言震肮,這種集成也帶來(lái)了巨大的挑戰(zhàn)。在基于微服務(wù)的系統(tǒng)中留拾,功能通過(guò)多個(gè)服務(wù)組合提供戳晌,因此存在大量的集成點(diǎn)和接觸點(diǎn)。這反過(guò)來(lái)也加重了性能負(fù)擔(dān)痴柔,甚至?xí)绊懴到y(tǒng)的整體表現(xiàn)沦偎。本文主要討論一些微服務(wù)系統(tǒng)所面臨的關(guān)鍵性能挑戰(zhàn),同時(shí)也向大家介紹一些能夠幫助大家解決問(wèn)題的技術(shù)和模式咳蔚。
集成系統(tǒng)所面臨的挑戰(zhàn)
分布式計(jì)算本來(lái)就有其自身的挑戰(zhàn)豪嚎,所有這些挑戰(zhàn)不僅有據(jù)可查,而在分布式系統(tǒng)上工作的專業(yè)人士幾乎每天都在為之困擾谈火,尤其在集成環(huán)境中接觸點(diǎn)超過(guò)了「正吵扪」集成環(huán)境時(shí),情形則會(huì)更加糟糕糯耍。當(dāng)連接到應(yīng)用內(nèi)部或者遠(yuǎn)程外部系統(tǒng)中其他微服務(wù)時(shí)扔字,很多環(huán)節(jié)都可能出錯(cuò)囊嘉。例如,被連接的微服務(wù)可能非常緩慢或宕機(jī)革为,那么如果應(yīng)用程序沒(méi)有提前設(shè)計(jì)好如何處理這種情況扭粱,將會(huì)對(duì)程序的性能和穩(wěn)定性產(chǎn)生不利影響。
緩解性能挑戰(zhàn)
在本節(jié)中震檩,筆者將討論一些方法和設(shè)計(jì)策略琢蛤,幫助在基于微服務(wù)的環(huán)境中實(shí)現(xiàn)更好的性能,增強(qiáng)系統(tǒng)的彈性和整體穩(wěn)定性抛虏。
節(jié)流模式
節(jié)流是一種用于規(guī)避異常應(yīng)用的技術(shù)博其,當(dāng)異常應(yīng)用發(fā)送的請(qǐng)求超過(guò)應(yīng)用程序的處理負(fù)載時(shí),可能導(dǎo)致系統(tǒng)過(guò)載甚至崩潰迂猴。
一個(gè)實(shí)現(xiàn)節(jié)流的簡(jiǎn)單方法是限定單個(gè)應(yīng)用程序的連接數(shù)慕淡。假設(shè)有兩個(gè)廠商調(diào)用微服務(wù)從賬戶中取錢。其中一個(gè)供應(yīng)商是像亞馬遜那樣龐大的應(yīng)用错忱,那么它調(diào)用應(yīng)用的次數(shù)要比擁有小眾群體的供應(yīng)商多的多。因此挂据,可以提供這兩家廠商兩個(gè)獨(dú)立的專用「入口點(diǎn)」以清,通過(guò)節(jié)流進(jìn)行連接限制。這樣崎逃,大量來(lái)自亞馬遜的請(qǐng)求就不會(huì)妨礙第二個(gè)供應(yīng)商的請(qǐng)求掷倔。此外,也可以限制各個(gè)協(xié)作對(duì)象的請(qǐng)求頻率个绍,這樣發(fā)送請(qǐng)求的速度就不會(huì)超過(guò)微服務(wù)的處理速度了勒葱。
一般情況下,來(lái)自外部服務(wù)/系統(tǒng)的同步請(qǐng)求會(huì)通過(guò)負(fù)載均衡器巴柿、 HTTP 服務(wù)器或其他類似的入口點(diǎn)進(jìn)行節(jié)流限制凛虽。
超時(shí)
如果請(qǐng)求的微服務(wù)響應(yīng)緩慢,會(huì)使得應(yīng)用需要花費(fèi)很長(zhǎng)時(shí)間才能完成一個(gè)請(qǐng)求广恢,應(yīng)用線程在很長(zhǎng)的時(shí)間內(nèi)都處于忙碌狀態(tài)凯旋。這會(huì)對(duì)應(yīng)用程序產(chǎn)生級(jí)聯(lián)影響,導(dǎo)致應(yīng)用或服務(wù)器完全堵塞甚至失去響應(yīng)钉迷。
大多數(shù)庫(kù)(libraries)至非、 API 、框架和服務(wù)器都為各種特定的請(qǐng)求超時(shí)提供配置糠聪,只需設(shè)置讀寫請(qǐng)求超時(shí)荒椭、等待超時(shí)、連接池等待超時(shí)舰蟆、活躍會(huì)話超時(shí)等的數(shù)值即可趣惠,但這些超時(shí)需要通過(guò)適當(dāng)?shù)男阅軠y(cè)試或 SLA 驗(yàn)證才能確定狸棍。
專用線程池
另一個(gè)重要的設(shè)計(jì)是將不同的任務(wù)請(qǐng)求或不同的微服務(wù)連接放到獨(dú)立的線程池中,就像Bulkheads那樣對(duì)資源進(jìn)行隔離信卡。大家不妨設(shè)想一下這樣的場(chǎng)景隔缀,在應(yīng)用流中需要使用 REST 通過(guò) HTTP 連接五個(gè)不同的微服務(wù),也可以使用一個(gè)普通的線程池去維持這些連接傍菇,如果其中某個(gè)服務(wù)因?yàn)槟撤N原因出現(xiàn)異常猾瘸,那么池內(nèi)所有的微服務(wù)都會(huì)受到牽連。為了最大限度地減少這種異常的負(fù)面影響丢习,將單獨(dú)的服務(wù)放進(jìn)專門的線程池顯然是更明智的做法牵触。這不僅可以減少某個(gè)異常對(duì)其他服務(wù)的影響,還能保證應(yīng)用程序的其他部分繼續(xù)正常地工作咐低。
這種模式通常被稱為Bulkheads模式揽思。下圖描述了該模式的示例場(chǎng)景:在左側(cè),微服務(wù) A 用同一個(gè)連接池去請(qǐng)求 X 和 Y 兩個(gè)服務(wù)见擦。如果服務(wù) X 或 Y 其中任何一個(gè)行為異常钉汗,都將影響連接池的整體表現(xiàn)。如果采用Bulkheads模式鲤屡,如該圖右側(cè)所示损痰,即使微服務(wù) X 被錯(cuò)誤操作,也只有 X 池受到影響酒来,微服務(wù) Y 還可以繼續(xù)正常地為應(yīng)用程序提供服務(wù)卢未。
Circuit Breakers
Circuit Breakers是一種設(shè)計(jì)模式,可以用來(lái)減少任何下游不可訪問(wèn)或故障對(duì)系統(tǒng)整體的影響堰汉。Circuit Breakers用于檢查外部系統(tǒng)/服務(wù)的可用性辽社,一旦外部系統(tǒng)或服務(wù)宕機(jī),應(yīng)用程序就可以避免再次發(fā)送請(qǐng)求到這些外部系統(tǒng)翘鸭。這種做法其實(shí)也是一種安全措施滴铅,可以避免超時(shí)或Bulkheads模式因某些故障而導(dǎo)致的不必要超時(shí)。如果下游系統(tǒng)宕機(jī)就乓,請(qǐng)求就沒(méi)必要一直等待直至響應(yīng)超時(shí)失息,之后再收到超時(shí)異常的響應(yīng)。相反档址,當(dāng)下游系統(tǒng)處于宕機(jī)過(guò)程時(shí)盹兢,Circuit Breakers讓請(qǐng)求不再嘗試連接,進(jìn)而大大地縮減了響應(yīng)時(shí)間守伸。
Circuit Breakers有內(nèi)置的邏輯來(lái)對(duì)外部系統(tǒng)進(jìn)行必要的健康檢查绎秒,從而確保這些系統(tǒng)正常工作后再開始轉(zhuǎn)發(fā)請(qǐng)求。
異步集成
解耦各個(gè)微服務(wù)之間的通信可以避免多數(shù)的集成性能問(wèn)題尼摹,異步集成方法是一種解耦機(jī)制见芹。如果系統(tǒng)是基于微服務(wù)系統(tǒng)設(shè)計(jì)的剂娄,而且各個(gè)微服務(wù)之間都是點(diǎn)到點(diǎn)的集成,那就需要認(rèn)真思考如何實(shí)現(xiàn)解耦了玄呛。任何標(biāo)準(zhǔn)的消息代理系統(tǒng)都可用于提供發(fā)布—訂閱功能阅懦。
總結(jié)
本文主要向大家介紹了集成到基于微服務(wù)的框架系統(tǒng)所面臨的一些性能挑戰(zhàn),同時(shí)也提出了一些幫助大家避免上述的性能問(wèn)題的系統(tǒng)模式徘铝,簡(jiǎn)而言之耳胎,在考慮模式時(shí),異步集成的方法應(yīng)該是首選惕它,而其他設(shè)計(jì)模式可以根據(jù)具體的集成場(chǎng)景進(jìn)行選擇怕午,從而避免下游系統(tǒng)異常引起的級(jí)聯(lián)副作用,幫助大家更好地解決集成系統(tǒng)的性能挑戰(zhàn)淹魄。
OneAPM 為您提供端到端的 Java 應(yīng)用性能解決方案郁惜,我們支持所有常見(jiàn)的 Java 框架及應(yīng)用服務(wù)器,助您快速發(fā)現(xiàn)系統(tǒng)瓶頸甲锡,定位異常根本原因兆蕉。分鐘級(jí)部署,即刻體驗(yàn)缤沦,Java 監(jiān)控從來(lái)沒(méi)有如此簡(jiǎn)單虎韵。想閱讀更多技術(shù)文章,請(qǐng)?jiān)L問(wèn) OneAPM官方技術(shù)博客 疚俱。
本文轉(zhuǎn)自 OneAPM 官方博客
原文鏈接:https://dzone.com/articles/performance-patterns-in-microservices-based-integr