溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何解決微服務(wù)架構(gòu)下請求調(diào)用失敗

發(fā)布時(shí)間:2021-10-20 15:08:56 來源:億速云 閱讀:292 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“如何解決微服務(wù)架構(gòu)下請求調(diào)用失敗”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

微服務(wù)帶來的不安因素

相比單體架構(gòu),微服務(wù)架構(gòu)下的服務(wù)調(diào)用從同一機(jī)器內(nèi)的本地調(diào)用變成不同機(jī)器間遠(yuǎn)程調(diào)用,由此也帶來如下不確定因素:

  • 調(diào)用的執(zhí)行是服務(wù)提供者,即使服務(wù)消費(fèi)者本身正常,服務(wù)提供者也可能因CPU、網(wǎng)絡(luò)I/O、磁盤、內(nèi)存、網(wǎng)卡等各種原因調(diào)用失敗,還可能因本身程序執(zhí)行問題比如GC暫停導(dǎo)致失敗

  • 調(diào)用發(fā)生在兩臺機(jī)器間,所以要經(jīng)過網(wǎng)絡(luò)傳輸,而網(wǎng)絡(luò)不可控,丟包、延遲或抖動都可能導(dǎo)致調(diào)用失敗。

所以針對服務(wù)調(diào)用失敗需特殊處理。

超時(shí)

微服務(wù)下的一次用戶調(diào)用可能會被拆成多系統(tǒng)間服務(wù)調(diào)用,任一次服務(wù)調(diào)用若發(fā)生問題都可能導(dǎo)致用戶調(diào)用最終失敗。

一個(gè)系統(tǒng)的問題會影響所有調(diào)用這個(gè)系統(tǒng)所提供服務(wù)的服務(wù)消費(fèi)者,導(dǎo)致服務(wù)雪崩。

所以針對服務(wù)調(diào)用都要設(shè)置超時(shí)時(shí)間,避免所依賴服務(wù)一直未返回結(jié)果,將服務(wù)消費(fèi)者阻死。

超時(shí)時(shí)間的設(shè)定

  • 太短,可能有些服務(wù)調(diào)用還未及時(shí)執(zhí)行完成就被丟棄

  • 太長,可能導(dǎo)致服務(wù)消費(fèi)者被拖死

需按服務(wù)提供者線上真實(shí)的服務(wù)水平,取99.9%或99.99%的調(diào)用都在多少ms內(nèi)返回為準(zhǔn)。

重試

雖設(shè)超時(shí)時(shí)間可及時(shí)止損,但服務(wù)調(diào)用結(jié)果畢竟失敗。大部分情況調(diào)用失敗都因網(wǎng)絡(luò)問題或個(gè)別服務(wù)提供者節(jié)點(diǎn)有問題,若能換個(gè)節(jié)點(diǎn)再次訪問說不定就成功。

假如一次服務(wù)調(diào)用失敗概率1%,那連續(xù)兩次服務(wù)調(diào)用失敗概率0.01%,失敗率降低到原來1%。所以經(jīng)常還要設(shè)置一個(gè)服務(wù)調(diào)用超時(shí)后的重試次數(shù)。

假如某服務(wù)調(diào)用超時(shí)時(shí)間設(shè)為100ms,重試次數(shù)設(shè)為1,當(dāng)服務(wù)調(diào)用超過100ms后,服務(wù)消費(fèi)者就會立即發(fā)起第二次服務(wù)調(diào)用,而不會再等待第一次調(diào)用返回結(jié)果。

雙發(fā)

假如一次調(diào)用不成功概率1%,那連續(xù)兩次調(diào)用都不成功的概率就是0.01%,一個(gè)簡單的提高服務(wù)調(diào)用成功率的辦法就是每次服務(wù)消費(fèi)者要發(fā)起服務(wù)調(diào)用的時(shí)候,都同時(shí)發(fā)起兩次服務(wù)調(diào)用,可

  • 提高調(diào)用的成功率

  • 兩次服務(wù)調(diào)用,哪個(gè)先返回就采用哪次返回結(jié)果,平均響應(yīng)時(shí)間也要比一次調(diào)用更快

這就是雙發(fā)。

但這樣一次調(diào)用會給后端服務(wù)兩倍壓力,要消耗的資源也加倍,所以“魯莽”雙發(fā)不可取。

更為聰明的雙發(fā),即

“備份請求”(Backup Requests)

服務(wù)消費(fèi)者發(fā)起一次服務(wù)調(diào)用后,在給定的時(shí)間內(nèi)如果沒有返回請求結(jié)果,那么服務(wù)消費(fèi)者就立刻發(fā)起另一次服務(wù)調(diào)用。

注意該設(shè)定時(shí)間通常要比超時(shí)時(shí)間短得多,比如超時(shí)時(shí)間取P999,那么備份請求時(shí)間取的可能是P99或P90,因?yàn)槿粼赑99或者P90時(shí)間內(nèi)調(diào)用還沒有返回結(jié)果,那么大概率可以認(rèn)為這次請求屬于慢請求,再次發(fā)起調(diào)用理論上返回要更快。

在實(shí)際線上服務(wù)運(yùn)行時(shí),P999由于長尾請求時(shí)間較長的緣故,可能要遠(yuǎn)遠(yuǎn)大于P99和P90。

比如一個(gè)服務(wù)的P999是1s,而P99只有200ms、P90只有50ms,這樣的話,如果備份請求時(shí)間取的是P90,那么第二次請求等待的時(shí)間只有50ms。

備份請求要設(shè)置一個(gè)最大重試比例,以避免在服務(wù)端出現(xiàn)問題時(shí),大部分請求響應(yīng)時(shí)間都會超過P90,導(dǎo)致請求量幾乎翻倍,給服務(wù)提供者造成更大的壓力。

可設(shè)置成15%

  • 盡量體現(xiàn)備份請求的優(yōu)勢

  • 不會給服務(wù)提供者額外增加太大的壓力

熔斷

前面手段在服務(wù)提供者偶發(fā)異常時(shí)很有效,但若服務(wù)提供者故障,短時(shí)間內(nèi)無法恢復(fù),都不能提高服務(wù)調(diào)用成功率,還會因重試給服務(wù)提供者帶來更大的壓力而加劇故障。

就需服務(wù)消費(fèi)者能夠探測到服務(wù)提供者發(fā)生故障,短時(shí)間內(nèi)停止請求,給服務(wù)提供者故障恢復(fù)時(shí)間,待服務(wù)提供者恢復(fù)后,再繼續(xù)請求。

原理

把客戶端的每次服務(wù)調(diào)用用斷路器封裝,通過斷路器監(jiān)控每次服務(wù)調(diào)用。

若某段時(shí)間內(nèi),服務(wù)調(diào)用失敗次數(shù)達(dá)到一定閾值,斷路器就會被觸發(fā),后續(xù)服務(wù)調(diào)用直接返回,不會再向服務(wù)提供者發(fā)起請求。

熔斷后,一旦服務(wù)提供者恢復(fù)

服務(wù)調(diào)用如何恢復(fù)

Hystrix的斷路器包含三種狀態(tài):關(guān)閉、打開、半打開

  • Closed態(tài)

正常情況下的斷路器處關(guān)閉狀態(tài),偶發(fā)的調(diào)用失敗也不影響

  • Open態(tài)

當(dāng)服務(wù)調(diào)用失敗次數(shù)達(dá)到閾值,斷路器就會處開啟狀態(tài),后續(xù)服務(wù)調(diào)用直接返回,不會向服務(wù)提供者發(fā)起請求

  • Half Open態(tài)

當(dāng)斷路器開啟,每隔一段時(shí)間,會進(jìn)入半打開態(tài),這時(shí)會向服務(wù)提供者發(fā)起探測調(diào)用,以確定服務(wù)提供者是否恢復(fù)正常。

若調(diào)用成功,斷路器就關(guān)閉

若失敗,斷路器繼續(xù)保持開啟態(tài),并等待下個(gè)周期重新進(jìn)入半打開態(tài)。

如何解決微服務(wù)架構(gòu)下請求調(diào)用失敗

Hystrix會把每次服務(wù)調(diào)用都用HystrixCommand封裝,實(shí)時(shí)記錄每次服務(wù)調(diào)用狀態(tài),包括成功、失敗、超時(shí)還是被線程拒絕。

當(dāng)一段時(shí)間內(nèi)服務(wù)調(diào)用的失敗率高于閾值,Hystrix的斷路器就會進(jìn)入進(jìn)入打開態(tài),新的服務(wù)調(diào)用直接返回,不會向服務(wù)提供者發(fā)起調(diào)用。

再等待設(shè)定時(shí)間間隔后,Hystrix的斷路器又會進(jìn)入半打,新的服務(wù)調(diào)用又可重新發(fā)給服務(wù)提供者。若一段時(shí)間內(nèi)服務(wù)調(diào)用失敗率依然高于閾值,斷路器會重新進(jìn)入打開態(tài),否則,重置為關(guān)閉態(tài)。

決定斷路器是否打開失敗率閾值通過如下參數(shù):

HystrixCommandProperties.circuitBreakerErrorThresholdPercentage()

斷路器何時(shí)進(jìn)入半打開態(tài)時(shí)間間隔通過如下參數(shù):

HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()

斷路器關(guān)鍵在于

統(tǒng)計(jì)一段時(shí)間內(nèi)服務(wù)調(diào)用的失敗率

滑動窗口算法

如何解決微服務(wù)架構(gòu)下請求調(diào)用失敗

默認(rèn)情況下,滑動窗口包含10個(gè)桶,每個(gè)桶時(shí)間寬度1s,每桶記錄這1s所有服務(wù)調(diào)用成功、失敗、超時(shí)的及被線程拒絕的次數(shù)。當(dāng)新1s到來,滑動窗口就往前滑動,丟棄最舊桶,把最新桶包進(jìn)來。

任意時(shí)刻,Hystrix都會取滑動窗口內(nèi)所有服務(wù)調(diào)用的失敗率作為斷路器開關(guān)狀態(tài)的判斷依據(jù),這10個(gè)桶內(nèi)記錄的所有失敗的、超時(shí)的、被線程拒絕的調(diào)用次數(shù)之和除以總的調(diào)用次數(shù)就是滑動窗口內(nèi)所有服務(wù)的調(diào)用的失敗率。

“如何解決微服務(wù)架構(gòu)下請求調(diào)用失敗”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI