您好,登錄后才能下訂單哦!
本篇內容介紹了“如何解決微服務架構下請求調用失敗”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
微服務帶來的不安因素
相比單體架構,微服務架構下的服務調用從同一機器內的本地調用變成不同機器間遠程調用,由此也帶來如下不確定因素:
調用的執行是服務提供者,即使服務消費者本身正常,服務提供者也可能因CPU、網絡I/O、磁盤、內存、網卡等各種原因調用失敗,還可能因本身程序執行問題比如GC暫停導致失敗
調用發生在兩臺機器間,所以要經過網絡傳輸,而網絡不可控,丟包、延遲或抖動都可能導致調用失敗。
所以針對服務調用失敗需特殊處理。
超時
微服務下的一次用戶調用可能會被拆成多系統間服務調用,任一次服務調用若發生問題都可能導致用戶調用最終失敗。
一個系統的問題會影響所有調用這個系統所提供服務的服務消費者,導致服務雪崩。
所以針對服務調用都要設置超時時間,避免所依賴服務一直未返回結果,將服務消費者阻死。
超時時間的設定
太短,可能有些服務調用還未及時執行完成就被丟棄
太長,可能導致服務消費者被拖死
需按服務提供者線上真實的服務水平,取99.9%或99.99%的調用都在多少ms內返回為準。
重試
雖設超時時間可及時止損,但服務調用結果畢竟失敗。大部分情況調用失敗都因網絡問題或個別服務提供者節點有問題,若能換個節點再次訪問說不定就成功。
假如一次服務調用失敗概率1%,那連續兩次服務調用失敗概率0.01%,失敗率降低到原來1%。所以經常還要設置一個服務調用超時后的重試次數。
假如某服務調用超時時間設為100ms,重試次數設為1,當服務調用超過100ms后,服務消費者就會立即發起第二次服務調用,而不會再等待第一次調用返回結果。
雙發
假如一次調用不成功概率1%,那連續兩次調用都不成功的概率就是0.01%,一個簡單的提高服務調用成功率的辦法就是每次服務消費者要發起服務調用的時候,都同時發起兩次服務調用,可
提高調用的成功率
兩次服務調用,哪個先返回就采用哪次返回結果,平均響應時間也要比一次調用更快
這就是雙發。
但這樣一次調用會給后端服務兩倍壓力,要消耗的資源也加倍,所以“魯莽”雙發不可取。
更為聰明的雙發,即
“備份請求”(Backup Requests)
服務消費者發起一次服務調用后,在給定的時間內如果沒有返回請求結果,那么服務消費者就立刻發起另一次服務調用。
注意該設定時間通常要比超時時間短得多,比如超時時間取P999,那么備份請求時間取的可能是P99或P90,因為若在P99或者P90時間內調用還沒有返回結果,那么大概率可以認為這次請求屬于慢請求,再次發起調用理論上返回要更快。
在實際線上服務運行時,P999由于長尾請求時間較長的緣故,可能要遠遠大于P99和P90。
比如一個服務的P999是1s,而P99只有200ms、P90只有50ms,這樣的話,如果備份請求時間取的是P90,那么第二次請求等待的時間只有50ms。
備份請求要設置一個最大重試比例,以避免在服務端出現問題時,大部分請求響應時間都會超過P90,導致請求量幾乎翻倍,給服務提供者造成更大的壓力。
可設置成15%
盡量體現備份請求的優勢
不會給服務提供者額外增加太大的壓力
熔斷
前面手段在服務提供者偶發異常時很有效,但若服務提供者故障,短時間內無法恢復,都不能提高服務調用成功率,還會因重試給服務提供者帶來更大的壓力而加劇故障。
就需服務消費者能夠探測到服務提供者發生故障,短時間內停止請求,給服務提供者故障恢復時間,待服務提供者恢復后,再繼續請求。
原理
把客戶端的每次服務調用用斷路器封裝,通過斷路器監控每次服務調用。
若某段時間內,服務調用失敗次數達到一定閾值,斷路器就會被觸發,后續服務調用直接返回,不會再向服務提供者發起請求。
熔斷后,一旦服務提供者恢復
服務調用如何恢復
Hystrix的斷路器包含三種狀態:關閉、打開、半打開
Closed態
正常情況下的斷路器處關閉狀態,偶發的調用失敗也不影響
Open態
當服務調用失敗次數達到閾值,斷路器就會處開啟狀態,后續服務調用直接返回,不會向服務提供者發起請求
Half Open態
當斷路器開啟,每隔一段時間,會進入半打開態,這時會向服務提供者發起探測調用,以確定服務提供者是否恢復正常。
若調用成功,斷路器就關閉
若失敗,斷路器繼續保持開啟態,并等待下個周期重新進入半打開態。
Hystrix會把每次服務調用都用HystrixCommand封裝,實時記錄每次服務調用狀態,包括成功、失敗、超時還是被線程拒絕。
當一段時間內服務調用的失敗率高于閾值,Hystrix的斷路器就會進入進入打開態,新的服務調用直接返回,不會向服務提供者發起調用。
再等待設定時間間隔后,Hystrix的斷路器又會進入半打,新的服務調用又可重新發給服務提供者。若一段時間內服務調用失敗率依然高于閾值,斷路器會重新進入打開態,否則,重置為關閉態。
決定斷路器是否打開失敗率閾值通過如下參數:
HystrixCommandProperties.circuitBreakerErrorThresholdPercentage()
斷路器何時進入半打開態時間間隔通過如下參數:
HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()
斷路器關鍵在于
統計一段時間內服務調用的失敗率
滑動窗口算法
默認情況下,滑動窗口包含10個桶,每個桶時間寬度1s,每桶記錄這1s所有服務調用成功、失敗、超時的及被線程拒絕的次數。當新1s到來,滑動窗口就往前滑動,丟棄最舊桶,把最新桶包進來。
任意時刻,Hystrix都會取滑動窗口內所有服務調用的失敗率作為斷路器開關狀態的判斷依據,這10個桶內記錄的所有失敗的、超時的、被線程拒絕的調用次數之和除以總的調用次數就是滑動窗口內所有服務的調用的失敗率。
“如何解決微服務架構下請求調用失敗”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。