是阿裡巴巴開源的,面向分布式服務架構的流量控制元件,主要以流量為切入點,從限流、流量整形、熔斷降級、系統自适應保護等多個次元來幫助開發者保障微服務的穩定性。Sentinel 承接了阿裡巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺、冷啟動、消息削峰填谷、叢集流量控制、實時熔斷下遊不可用服務等,是保障微服務高可用的利器,原生支援 Java/Go/C++ 等多種語言,并且提供 Istio/Envoy 全局流控支援來為 Service Mesh 提供高可用防護的能力。
近期,
Sentinel Go 0.3.0正式釋出,帶來了
熔斷降級特性支援,可以針對 Go 服務中的不穩定調用進行自動熔斷,避免出現級聯錯誤/雪崩,是保障服務高可用重要的一環。結合 Sentinel Go 已經提供的 gRPC、Gin、Dubbo 等架構元件的适配子產品,開發者可以快速在 Web、RPC 調用層面配置熔斷降級規則來保護自身服務的穩定性。同時 0.3.0 版本也帶來了 etcd 動态資料源子產品,開發者可以友善地通過 etcd 來動态調整熔斷降級政策。
為什麼需要熔斷降級
一個服務常常會調用别的子產品,可能是另外的一個遠端服務、資料庫,或者第三方 API 等。例如,支付的時候,可能需要遠端調用銀聯提供的 API;查詢某個商品的價格,可能需要進行資料庫查詢。然而,這個被依賴服務的穩定性是不能保證的。如果依賴的服務出現了不穩定的情況,請求的響應時間變長,那麼調用服務的方法的響應時間也會變長,線程會産生堆積,最終可能耗盡業務自身的線程池,服務本身也變得不可用。

現代微服務架構都是分布式的,由非常多的服務組成。不同服務之間互相調用,組成複雜的調用鍊路。以上的問題在鍊路調用中會産生放大的效果。複雜鍊路上的某一環不穩定,就可能會層層級聯,最終導緻整個鍊路都不可用。是以我們需要對不穩定的服務進行熔斷降級,暫時切斷不穩定調用,避免局部不穩定因素導緻整體的雪崩。
Sentinel Go 熔斷降級特性基于熔斷器模式的思想,在服務出現不穩定因素(如響應時間變長,錯誤率上升)的時候暫時切斷服務的調用,等待一段時間再進行嘗試。一方面防止給不穩定服務“雪上加霜”,另一方面保護服務的調用方不被拖垮。Sentinel 支援兩種熔斷政策:基于響應時間(慢調用比例)和基于錯誤(錯誤比例/錯誤數),可以有效地針對各種不穩定的場景進行防護。
下面我們介紹一下 Sentinel 流控降級的一些最佳實踐。
流控降級最佳實踐
在服務提供方(Service Provider)的場景下,我們需要保護服務提供方不被流量洪峰打垮。我們通常根據服務提供方的服務能力進行流量控制,或針對特定的服務調用方進行限制。為了保護服務提供方不被激增的流量拖垮影響穩定性,我們可以結合前期的容量評估,通過 Sentinel 配置 QPS 模式的流控規則,當每秒的請求量超過設定的門檻值時,會自動拒絕多餘的請求。
在服務調用端(Service Consumer)的場景下,我們需要保護服務調用方不被不穩定的依賴服務拖垮。借助 Sentinel 的信号量隔離政策(并發數流控規則),限制某個服務調用的并發量,防止大量慢調用擠占正常請求的資源;同時,借助熔斷降級規則,當異常比率或業務慢調用比例超過某個門檻值後将調用自動熔斷,直到一段時間過後再嘗試恢複。熔斷期間我們可以提供預設的處理邏輯(fallback),熔斷期間的調用都會傳回 fallback 的結果,而不會再去嘗試本已非常不穩定的服務。需要注意的是,即使服務調用方引入了熔斷降級機制,我們還是需要在 HTTP 或 RPC 用戶端配置請求逾時時間,來做一個兜底的保護。
同時 Sentinel 還提供
全局次元的系統自适應保護能力,結合系統的 Load、CPU 使用率以及服務的入口 QPS、響應時間和并發量等幾個次元的監控名額,通過自适應的流控政策,讓系統的入口流量和系統的負載達到一個平衡,讓系統盡可能跑在最大吞吐量的同時保證系統整體的穩定性。系統規則可以作為整個服務的一個兜底防護政策,保障服務不挂。
Let's start hacking!
Sentinel Go 版本正在快速演進中,我們非常歡迎感興趣的開發者參與貢獻,一起來主導未來版本的演進。Sentinel Go 版本的演進離不開社群的貢獻。若您有意願參與貢獻,歡迎聯系我們加入 Sentinel 貢獻小組一起成長(Sentinel 開源讨論釘釘群:30150716)。
同時,一年一度的阿裡巴巴程式設計之夏(Alibaba Summer of Code)開始啦!如果你是在校的學生,有興趣參與 Sentinel 項目的開發和演進,不要錯過此次機會,歡迎 pick 感興趣的 issue 送出提案:
https://github.com/alibaba/Sentinel/issues/1497Now let's start hacking!