API 的調(diào)用穩(wěn)定性被視為數(shù)據(jù)服務(wù)的最重要的指標(biāo)。該指標(biāo)的影響因素是多種多樣的,「袋鼠云數(shù)據(jù)服務(wù)平臺 DataAPI」不僅多次對于調(diào)用性能和穩(wěn)定性進行壓測和調(diào)優(yōu),而且還提供了多種配置項優(yōu)化手段供客戶進行自行調(diào)優(yōu)。但是當(dāng)遇到不可預(yù)期的大流量或其他突然情況時還是會遇到 API 調(diào)用失敗的情況。
當(dāng)隨著流量的不斷增長,達(dá)到或超過服務(wù)本身的可承載范圍,系統(tǒng)服務(wù)的自我保護機制的建立就顯得很重要了。「袋鼠云數(shù)據(jù)服務(wù)平臺 DataAPI」將 API 調(diào)用和微服務(wù)流量控制概念相結(jié)合,推出了熔斷降級功能,最大程度保證 API 調(diào)用的穩(wěn)定性和系統(tǒng)可用性。
本文希望可以用最通俗的解釋和貼切的實例帶大家了解什么是熔斷降級。
熔斷降級概述
一般提到微服務(wù)系統(tǒng)流量保護,都會提起限流、熔斷、降級三種手段,其實他們都是系統(tǒng)容錯的重要設(shè)計模式。
限流、熔斷、降級
● 限流
限流是一種對系統(tǒng)被請求頻率以及內(nèi)部部分功能的執(zhí)行頻率進行限制的措施,防止因突發(fā)的流量激增,導(dǎo)致整個系統(tǒng)不可用。限流主要是防御保護手段,從流量源頭開始控制流量、規(guī)避問題。
● 熔斷
熔斷機制是一種自動化的應(yīng)對措施,當(dāng)流量過大或下游服務(wù)出現(xiàn)問題時,可以自動斷開與下游服務(wù)的交互,以防止故障的進一步擴散。同時,熔斷機制還可以自我診斷下游系統(tǒng)的錯誤是否已經(jīng)修正,或者上游流量是否減少至正常水平,以實現(xiàn)自我恢復(fù)。
熔斷更像是自動化補救手段,可能發(fā)生在服務(wù)無法支撐大量請求或服務(wù)發(fā)生其他故障時,對請求進行限制處理,同時還可嘗試性的進行恢復(fù)。
● 服務(wù)降級
主要是針對非核心業(yè)務(wù)功能,而核心業(yè)務(wù)如果流程超過預(yù)估的峰值,就需要進行限流。降級一般考慮的是分布式系統(tǒng)的整體性,從源頭上切斷流量的來源。降級更像是一種預(yù)估手段,在預(yù)計流量峰值前提下,提前通過配置功能降低服務(wù)體驗,或暫停次要功能,保證系統(tǒng)主要流程功能平穩(wěn)響應(yīng)。
熔斷降級
限流和熔斷也可以看作是一種服務(wù)降級的手段。微服務(wù)架構(gòu)下,服務(wù)和服務(wù)之間的調(diào)用通常關(guān)注的是流量,開發(fā)者需要從流量路由、流量控制、流量整形、熔斷降級、系統(tǒng)自適應(yīng)過載保護、熱點流量防護等多個維度來保障微服務(wù)的穩(wěn)定性。其中熔斷降級更趨向于在微服務(wù)調(diào)用鏈路中保障重點鏈路或者重點服務(wù)的穩(wěn)定性。
如下圖,當(dāng) serviceD 發(fā)生異常不可用時會影響到 serviceA、B、G、F,如不加以管控,最終可能會導(dǎo)致整個微服務(wù)全部癱瘓。熔斷要做的事情就是達(dá)到某個錯誤閾值后停止再調(diào)用 serviceD 服務(wù);降級則會返回開發(fā)者自定義的降級內(nèi)容,至少保證鏈路的整體可用。
熔斷規(guī)則介紹
「袋鼠云數(shù)據(jù)服務(wù)平臺 DataAPI」目前提供三種熔斷策略,每個 API 可以且僅可關(guān)聯(lián)一個熔斷策略,策略類型分別為:
● 慢調(diào)用比例(SLOW_REQUEST_RATIO)
選擇以慢調(diào)用比例作為閾值,需要設(shè)置允許的慢調(diào)用 RT(即最大的響應(yīng)時間),請求的響應(yīng)時間大于該值則統(tǒng)計為慢調(diào)用。當(dāng)單位統(tǒng)計時長(statIntervalMs)內(nèi)請求數(shù)目大于設(shè)置的最小請求數(shù)目,并且慢調(diào)用的比例大于閾值,則接下來的熔斷時長內(nèi)請求會自動被熔斷。
經(jīng)過熔斷時長后熔斷器會進入探測恢復(fù)狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求響應(yīng)時間小于設(shè)置的慢調(diào)用 RT 則結(jié)束熔斷,若大于設(shè)置的慢調(diào)用 RT 則會再次被熔斷。
● 異常比例(ERROR_RATIO)
當(dāng)單位統(tǒng)計時長(statIntervalMs)內(nèi)請求數(shù)目大于設(shè)置的最小請求數(shù)目,并且異常的比例大于閾值,則接下來的熔斷時長內(nèi)請求會自動被熔斷。
經(jīng)過熔斷時長后熔斷器會進入探測恢復(fù)狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求成功完成(沒有錯誤)則結(jié)束熔斷,否則會再次被熔斷。異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。
● 異常數(shù)(ERROR_COUNT)
當(dāng)單位統(tǒng)計時長內(nèi)的異常數(shù)目超過閾值之后會自動進行熔斷。經(jīng)過熔斷時長后熔斷器會進入探測恢復(fù)狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求成功完成(沒有錯誤)則結(jié)束熔斷,否則會再次被熔斷。
DataAPI 對于熔斷降級的應(yīng)用
接下來通過實例為大家介紹熔斷降級在「袋鼠云數(shù)據(jù)服務(wù)平臺 DataAPI」內(nèi)的應(yīng)用。
熔斷
數(shù)據(jù)服務(wù)的熔斷降級是基于 Sentinel 框架實現(xiàn)的。Sentinel 對于資源的定義更偏向于服務(wù)級別,不過也提供了對于指定代碼或內(nèi)容進行資源定義。所以 DataAPI 是通過定義 APIID 作為唯一資源來進行熔斷閾值的判斷和具體熔斷動作的實施。同時,通過控制資源名稱的生成規(guī)則,測試 API 和正式 API 實現(xiàn)了環(huán)境隔離。
在開發(fā)實現(xiàn)的過程中,最大的難點在于 Sentinel 原生支持限流策略的集群控制,但是不支持熔斷策略的集群控制。DataAPI 采用的方法是采用主節(jié)點的方式去實現(xiàn)集群的控制,主要有以下兩點內(nèi)容。
● 熔斷規(guī)則如何只加載到主節(jié)點上
首先,熔斷策略基于內(nèi)存是通過 DegradeRuleManager 加載的,既然是基于內(nèi)存那么必然要做持久化動作,否則程序重啟規(guī)則就會清空。這里采用了 MySQL 建立熔斷規(guī)則表的方式進行規(guī)則詳情的修改操作。
其次啟動時通過 nacos 獲取 gateway 實例列表并選取主節(jié)點,調(diào)用 nacos 的 namingService.getAllInstance 方法可以獲取到所有的 gateway 實例。選取第一個健康的 gateway 實例為主節(jié)點,將主節(jié)點 ip 信息以 key value 的形式存儲到 redis 中,主節(jié)點重新選舉時會更新此 redis key,gateway 集群所有實例每次啟動先判斷當(dāng)前節(jié)點是否為主節(jié)點,只有主節(jié)點才會進行熔斷策略的初始化加載動作。
這里針對主節(jié)點的選舉 DataAPI 是做了自動選舉的,即使當(dāng)前主節(jié)點宕機,也可以通過每分鐘一次的定時器獲取到存活的節(jié)點實例并重新選取主節(jié)點,保證高可用。當(dāng)主節(jié)點發(fā)生變更后也會發(fā)送 redis 通知給到所有節(jié)點,新的主節(jié)點收到通知后會從 MySQL 獲取當(dāng)前最新的熔斷策略加載進內(nèi)存,不過此動作會清空之前的流量統(tǒng)計,時間窗口會重置。
最后,策略的修改如何同步到主節(jié)點。數(shù)據(jù)服務(wù)采用的是 redis channel 通知的方式,每臺 gateway 都監(jiān)聽 channel 消息,只有判斷當(dāng)前節(jié)點為主節(jié)點的 gateway 才進行內(nèi)存規(guī)則的 load 操作。
● 集群閾值判定
通過主節(jié)點進行規(guī)則加載和閾值判斷,集群所有示例都正常執(zhí)行 API 請求,只有閾值判斷會發(fā)起 http 請求到主節(jié)點進行判斷,并返回是否通過結(jié)果,整體工作流程圖如下:
閾值判定一共分為兩種模式:
· 錯誤模式,也可細(xì)分為錯誤數(shù)或者錯誤率
· 慢調(diào)用模式,指慢調(diào)用請求占比
由于判斷主節(jié)點為實例B,但是錯誤發(fā)生在實例A/C,所以在實例B是需要手動去產(chǎn)生異常或者慢調(diào)用的。當(dāng)節(jié)點請求發(fā)生異常后主節(jié)點收到異常標(biāo)志位,則手動拋出異常,這時候 Sentinel 是可以感知的并且異常數(shù)會加一。慢調(diào)用則是通過修改請求的 complateTime 讓計數(shù)器能夠判斷到慢調(diào)用來實現(xiàn)。
降級
用于可在 API 編輯頁面進行降級內(nèi)容的配置,配置條件為需先配置熔斷策略,當(dāng)熔斷器處于開啟狀態(tài)時 gateway 會返回完全由用戶自定義的降級內(nèi)容,該內(nèi)容必須為 json 格式。
降級最主要解決的是資源不足和訪問量增加的矛盾,在有限的資源情況下,可以應(yīng)對高并發(fā)大量請求。尤其當(dāng) API 配置被訪問的數(shù)據(jù)源無法承載大流量時,在有限的資源情況下,想要達(dá)到以上效果就需要對一些服務(wù)功能進行一些限制但是又不是完全的不可用狀態(tài),系統(tǒng)將返回預(yù)設(shè)的值,保證整個系統(tǒng)能夠平穩(wěn)運行。
降級的代碼實現(xiàn)相對簡單,判斷條件生效后,通過重寫 ServerWebExchange 對象的 Response 即可。
《數(shù)棧產(chǎn)品白皮書》下載地址:https://www.dtstack.com/resources/1004?src=szsm
《數(shù)據(jù)治理行業(yè)實踐白皮書》下載地址:https://www.dtstack.com/resources/1001?src=szsm文章來源:http://www.zghlxwxcb.cn/news/detail-752010.html
想了解或咨詢更多有關(guān)大數(shù)據(jù)產(chǎn)品、行業(yè)解決方案、客戶案例的朋友,瀏覽袋鼠云官網(wǎng):https://www.dtstack.com/?src=szbky文章來源地址http://www.zghlxwxcb.cn/news/detail-752010.html
到了這里,關(guān)于企業(yè)如何通過熔斷降級增強服務(wù)穩(wěn)定性和系統(tǒng)可用性?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!