原文鏈接:
文集鏈接:微服務
Sentinel 是阿里中間件團隊研發的面向分布式服務架構的輕量級高可用流量控制組件,於今年7月正式開源。
Sentinel 主要以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度來幫助用戶提升服務的穩定性。
大家可能會問:Sentinel 和之前經常用到的熔斷降級庫 Netflix Hystrix 有什么異同呢?本文將從資源模型和執行模型、隔離設計、熔斷降級、實時指標統計設計等角度將 Sentinel 和 Hystrix 進行對比。
總體說明
關於 Hystrix,可以參見 Spring Cloud 學習筆記 - No.4 斷路器 Hystrix
Hystrix 的關注點在於以 隔離 和 熔斷 為主的容錯機制,超時或被熔斷的調用將會快速失敗,並可以提供 fallback 機制。
而 Sentinel 的側重點在於:
- 多樣化的流量控制
- 熔斷降級
- 系統負載保護
- 實時監控和控制台
共同特性
1、資源模型和執行模型上的對比
Hystrix 的資源模型設計上采用了命令模式,將對外部資源的調用和 fallback 邏輯封裝成一個命令對象(HystrixCommand/ HystrixObservableCommand),其底層的執行是基於 RxJava 實現的。
每個 Command 創建時都要指定 commandKey 和 groupKey(用於區分資源)以及對應的隔離策略(線程池隔離 or 信號量隔離)。
- 線程池隔離模式下需要配置線程池對應的參數(線程池名稱、容量、排隊超時等),然后 Command 就會在指定的線程池按照指定的容錯策略執行;
- 信號量隔離模式下需要配置最大並發數,執行 Command 時 Hystrix 就會限制其並發調用。
而 Sentinel 則不一樣,開發的時候只需要考慮這個方法/代碼是否需要保護,置於用什么來保護,可以任何時候動態實時的修改。
從 0.1.1 版本開始,Sentinel 還支持基於注解的資源定義方式,可以通過注解參數指定異常處理函數和 fallback 函數。
2、隔離設計上的對比
隔離是 Hystrix 的核心功能之一。Hystrix 提供兩種隔離策略:線程池隔離(Bulkhead Pattern)和信號量隔離,其中最推薦也是最常用的是線程池隔離。
Hystrix 的線程池隔離針對不同的資源分別創建不同的線程池,不同服務調用都發生在不同的線程池中,在線程池排隊、超時等阻塞情況時可以快速失敗,並可以提供 fallback 機制。線程池隔離的好處是隔離度比較高,可以針對某個資源的線程池去進行處理而不影響其它資源,但是代價就是線程上下文切換的 overhead 比較大,特別是對低延時的調用有比較大的影響。
但是,實際情況下,線程池隔離並沒有帶來非常多的好處。最直接的影響,就是會讓機器資源碎片化。
Hystrix 的信號量隔離限制對某個資源調用的並發數。這樣的隔離非常輕量級,僅限制對某個資源調用的並發數,而不是顯式地去創建線程池,所以 overhead 比較小,但是效果不錯。但缺點是無法對慢調用自動進行降級,只能等待客戶端自己超時,因此仍然可能會出現級聯阻塞的情況。
Sentinel 可以通過並發線程數模式的流量控制來提供信號量隔離的功能。並且結合基於響應時間的熔斷降級模式,可以在不穩定資源的平均響應時間比較高的時候自動降級,防止過多的慢調用占滿並發數,影響整個系統。
3、熔斷降級的對比
Sentinel 和 Hystrix 的熔斷降級功能本質上都是基於熔斷器模式(Circuit Breaker Pattern)。
Sentinel 與 Hystrix 都支持基於失敗比率(異常比率)的熔斷降級,在調用達到一定量級並且失敗比率達到設定的閾值時自動進行熔斷,此時所有對該資源的調用都會被 block,直到過了指定的時間窗口后才啟發性地恢復。
上面提到過,Sentinel 還支持基於平均響應時間的熔斷降級,可以在服務響應時間持續飆高的時候自動熔斷,拒絕掉更多的請求,直到一段時間后才恢復。這樣可以防止調用非常慢造成級聯阻塞的情況。
4、實時指標統計實現的對比
Hystrix 和 Sentinel 的實時指標數據統計實現都是基於滑動窗口的。
Sentinel 目前抽象出了 Metric 指標統計接口,底層可以有不同的實現,目前默認的實現是基於 LeapArray 的滑動窗口,后續根據需要可能會引入 reactive stream 等實現。
Sentinel 特性
1、輕量級、高性能
Sentinel 作為一個功能完備的高可用流量管控組件,其核心 sentinel-core 沒有任何多余依賴,打包后只有不到 200 KB,非常輕量級。
引入 Sentinel 帶來的性能損耗非常小。只有在業務單機量級超過 25W QPS 的時候才會有一些顯著的影響(5% - 10% 左右),單機 QPS 不太大的時候損耗幾乎可以忽略不計。
2、流量控制
Sentinel 可以針對不同的調用關系,以不同的運行指標(如 QPS、並發調用數、系統負載等)為基准,對資源調用進行流量控制,將隨機的請求調整成合適的形狀。
Sentinel 支持多樣化的流量整形策略,在 QPS 過高的時候可以自動將流量調整成合適的形狀。常用的有:
-
直接拒絕模式:即超出的請求直接拒絕。
-
慢啟動預熱模式:當流量激增的時候,控制流量通過的速率,讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限,給冷系統一個預熱的時間,避免冷系統被壓垮。
慢啟動預熱模式 -
勻速器模式:利用 Leaky Bucket 算法實現的勻速模式,嚴格控制了請求通過的時間間隔,同時堆積的請求將會排隊,超過超時時長的請求直接被拒絕。Sentinel 還支持基於調用關系的限流,包括基於調用方限流、基於調用鏈入口限流、關聯流量限流等,依托於 Sentinel 強大的調用鏈路統計信息,可以提供精准的不同維度的限流。
勻速器模式
3、系統負載保護
Sentinel 對系統的維度提供保護,負載保護算法借鑒了 TCP BBR 的思想。當系統負載較高的時候,如果仍持續讓請求進入,可能會導致系統崩潰,無法響應。在集群環境下,網絡負載均衡會把本應這台機器承載的流量轉發到其它的機器上去。如果這個時候其它的機器也處在一個邊緣狀態的時候,這個增加的流量就會導致這台機器也崩潰,最后導致整個集群不可用。針對這個情況,Sentinel 提供了對應的保護機制,讓系統的入口流量和系統的負載達到一個平衡,保證系統在能力范圍之內處理最多的請求。
4、實時監控和控制面板
Sentinel 提供 HTTP API 用於獲取實時的監控信息,如調用鏈路統計信息、簇點信息、規則信息等。如果用戶正在使用 Spring Boot/Spring Cloud 並使用了 Sentinel Spring Cloud Starter,還可以方便地通過其暴露的 Actuator Endpoint 來獲取運行時的一些信息,如動態規則等。未來 Sentinel 還會支持標准化的指標監控 API,可以方便地整合各種監控系統和可視化系統,如 Prometheus、Grafana 等。
Sentinel 控制台(Dashboard)提供了機器發現、配置規則、查看實時監控、查看調用鏈路信息等功能,使得用戶可以非常方便地去查看監控和進行配置。

5、生態
Sentinel 目前已經針對 Servlet、Dubbo、Spring Boot/Spring Cloud、gRPC 等進行了適配,用戶只需引入相應依賴並進行簡單配置即可非常方便地享受 Sentinel 的高可用流量防護能力。未來 Sentinel 還會對更多常用框架進行適配,並且會為 Service Mesh 提供集群流量防護的能力。
總結

Sentinel 發布首個生產版本
Github 地址: