阿里中間件博客 - 關(guān)于限流和降級 Hystrix vs Sentinel

原文鏈接:

文集鏈接:微服務(wù)


Sentinel 是阿里中間件團(tuán)隊研發(fā)的面向分布式服務(wù)架構(gòu)的輕量級高可用流量控制組件,于今年7月正式開源。
Sentinel 主要以流量為切入點,從流量控制、熔斷降級系統(tǒng)負(fù)載保護(hù)等多個維度來幫助用戶提升服務(wù)的穩(wěn)定性。

大家可能會問:Sentinel 和之前經(jīng)常用到的熔斷降級庫 Netflix Hystrix 有什么異同呢?本文將從資源模型和執(zhí)行模型、隔離設(shè)計、熔斷降級、實時指標(biāo)統(tǒng)計設(shè)計等角度將 Sentinel 和 Hystrix 進(jìn)行對比。

總體說明

關(guān)于 Hystrix,可以參見 Spring Cloud 學(xué)習(xí)筆記 - No.4 斷路器 Hystrix

Hystrix 的關(guān)注點在于以 隔離熔斷 為主的容錯機制,超時或被熔斷的調(diào)用將會快速失敗,并可以提供 fallback 機制。

而 Sentinel 的側(cè)重點在于:

  • 多樣化的流量控制
  • 熔斷降級
  • 系統(tǒng)負(fù)載保護(hù)
  • 實時監(jiān)控和控制臺

共同特性

1、資源模型和執(zhí)行模型上的對比

Hystrix 的資源模型設(shè)計上采用了命令模式,將對外部資源的調(diào)用和 fallback 邏輯封裝成一個命令對象(HystrixCommand/ HystrixObservableCommand),其底層的執(zhí)行是基于 RxJava 實現(xiàn)的。
每個 Command 創(chuàng)建時都要指定 commandKey 和 groupKey(用于區(qū)分資源)以及對應(yīng)的隔離策略(線程池隔離 or 信號量隔離)。

  • 線程池隔離模式下需要配置線程池對應(yīng)的參數(shù)(線程池名稱、容量、排隊超時等),然后 Command 就會在指定的線程池按照指定的容錯策略執(zhí)行;
  • 信號量隔離模式下需要配置最大并發(fā)數(shù),執(zhí)行 Command 時 Hystrix 就會限制其并發(fā)調(diào)用。

而 Sentinel 則不一樣,開發(fā)的時候只需要考慮這個方法/代碼是否需要保護(hù),置于用什么來保護(hù),可以任何時候動態(tài)實時的修改。

從 0.1.1 版本開始,Sentinel 還支持基于注解的資源定義方式,可以通過注解參數(shù)指定異常處理函數(shù)和 fallback 函數(shù)。

2、隔離設(shè)計上的對比

隔離是 Hystrix 的核心功能之一。Hystrix 提供兩種隔離策略:線程池隔離(Bulkhead Pattern)和信號量隔離,其中最推薦也是最常用的是線程池隔離。
Hystrix 的線程池隔離針對不同的資源分別創(chuàng)建不同的線程池,不同服務(wù)調(diào)用都發(fā)生在不同的線程池中,在線程池排隊、超時等阻塞情況時可以快速失敗,并可以提供 fallback 機制。線程池隔離的好處是隔離度比較高,可以針對某個資源的線程池去進(jìn)行處理而不影響其它資源,但是代價就是線程上下文切換的 overhead 比較大,特別是對低延時的調(diào)用有比較大的影響。

但是,實際情況下,線程池隔離并沒有帶來非常多的好處。最直接的影響,就是會讓機器資源碎片化。

Hystrix 的信號量隔離限制對某個資源調(diào)用的并發(fā)數(shù)。這樣的隔離非常輕量級,僅限制對某個資源調(diào)用的并發(fā)數(shù),而不是顯式地去創(chuàng)建線程池,所以 overhead 比較小,但是效果不錯。但缺點是無法對慢調(diào)用自動進(jìn)行降級,只能等待客戶端自己超時,因此仍然可能會出現(xiàn)級聯(lián)阻塞的情況。

Sentinel 可以通過并發(fā)線程數(shù)模式的流量控制來提供信號量隔離的功能。并且結(jié)合基于響應(yīng)時間的熔斷降級模式,可以在不穩(wěn)定資源的平均響應(yīng)時間比較高的時候自動降級,防止過多的慢調(diào)用占滿并發(fā)數(shù),影響整個系統(tǒng)。

3、熔斷降級的對比

Sentinel 和 Hystrix 的熔斷降級功能本質(zhì)上都是基于熔斷器模式(Circuit Breaker Pattern)。
Sentinel 與 Hystrix 都支持基于失敗比率(異常比率)的熔斷降級,在調(diào)用達(dá)到一定量級并且失敗比率達(dá)到設(shè)定的閾值時自動進(jìn)行熔斷,此時所有對該資源的調(diào)用都會被 block,直到過了指定的時間窗口后才啟發(fā)性地恢復(fù)。

上面提到過,Sentinel 還支持基于平均響應(yīng)時間的熔斷降級,可以在服務(wù)響應(yīng)時間持續(xù)飆高的時候自動熔斷,拒絕掉更多的請求,直到一段時間后才恢復(fù)。這樣可以防止調(diào)用非常慢造成級聯(lián)阻塞的情況。

4、實時指標(biāo)統(tǒng)計實現(xiàn)的對比

Hystrix 和 Sentinel 的實時指標(biāo)數(shù)據(jù)統(tǒng)計實現(xiàn)都是基于滑動窗口的。

Sentinel 目前抽象出了 Metric 指標(biāo)統(tǒng)計接口,底層可以有不同的實現(xiàn),目前默認(rèn)的實現(xiàn)是基于 LeapArray 的滑動窗口,后續(xù)根據(jù)需要可能會引入 reactive stream 等實現(xiàn)。

Sentinel 特性

1、輕量級、高性能

Sentinel 作為一個功能完備的高可用流量管控組件,其核心 sentinel-core 沒有任何多余依賴,打包后只有不到 200 KB,非常輕量級。

引入 Sentinel 帶來的性能損耗非常小。只有在業(yè)務(wù)單機量級超過 25W QPS 的時候才會有一些顯著的影響(5% - 10% 左右),單機 QPS 不太大的時候損耗幾乎可以忽略不計。

2、流量控制

Sentinel 可以針對不同的調(diào)用關(guān)系,以不同的運行指標(biāo)(如 QPS、并發(fā)調(diào)用數(shù)、系統(tǒng)負(fù)載等)為基準(zhǔn),對資源調(diào)用進(jìn)行流量控制,將隨機的請求調(diào)整成合適的形狀。

Sentinel 支持多樣化的流量整形策略,在 QPS 過高的時候可以自動將流量調(diào)整成合適的形狀。常用的有:

  • 直接拒絕模式:即超出的請求直接拒絕。

  • 慢啟動預(yù)熱模式:當(dāng)流量激增的時候,控制流量通過的速率,讓通過的流量緩慢增加,在一定時間內(nèi)逐漸增加到閾值上限,給冷系統(tǒng)一個預(yù)熱的時間,避免冷系統(tǒng)被壓垮。

    慢啟動預(yù)熱模式

  • 勻速器模式:利用 Leaky Bucket 算法實現(xiàn)的勻速模式,嚴(yán)格控制了請求通過的時間間隔,同時堆積的請求將會排隊,超過超時時長的請求直接被拒絕。Sentinel 還支持基于調(diào)用關(guān)系的限流,包括基于調(diào)用方限流、基于調(diào)用鏈入口限流、關(guān)聯(lián)流量限流等,依托于 Sentinel 強大的調(diào)用鏈路統(tǒng)計信息,可以提供精準(zhǔn)的不同維度的限流。

    勻速器模式

3、系統(tǒng)負(fù)載保護(hù)

Sentinel 對系統(tǒng)的維度提供保護(hù),負(fù)載保護(hù)算法借鑒了 TCP BBR 的思想。當(dāng)系統(tǒng)負(fù)載較高的時候,如果仍持續(xù)讓請求進(jìn)入,可能會導(dǎo)致系統(tǒng)崩潰,無法響應(yīng)。在集群環(huán)境下,網(wǎng)絡(luò)負(fù)載均衡會把本應(yīng)這臺機器承載的流量轉(zhuǎn)發(fā)到其它的機器上去。如果這個時候其它的機器也處在一個邊緣狀態(tài)的時候,這個增加的流量就會導(dǎo)致這臺機器也崩潰,最后導(dǎo)致整個集群不可用。針對這個情況,Sentinel 提供了對應(yīng)的保護(hù)機制,讓系統(tǒng)的入口流量和系統(tǒng)的負(fù)載達(dá)到一個平衡,保證系統(tǒng)在能力范圍之內(nèi)處理最多的請求。

4、實時監(jiān)控和控制面板

Sentinel 提供 HTTP API 用于獲取實時的監(jiān)控信息,如調(diào)用鏈路統(tǒng)計信息、簇點信息、規(guī)則信息等。如果用戶正在使用 Spring Boot/Spring Cloud 并使用了 Sentinel Spring Cloud Starter,還可以方便地通過其暴露的 Actuator Endpoint 來獲取運行時的一些信息,如動態(tài)規(guī)則等。未來 Sentinel 還會支持標(biāo)準(zhǔn)化的指標(biāo)監(jiān)控 API,可以方便地整合各種監(jiān)控系統(tǒng)和可視化系統(tǒng),如 Prometheus、Grafana 等。

Sentinel 控制臺(Dashboard)提供了機器發(fā)現(xiàn)、配置規(guī)則、查看實時監(jiān)控、查看調(diào)用鏈路信息等功能,使得用戶可以非常方便地去查看監(jiān)控和進(jìn)行配置。


Sentinel 控制臺(Dashboard)

5、生態(tài)

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

總結(jié)

Hystrix vs Sentinel

Sentinel 發(fā)布首個生產(chǎn)版本

Github 地址:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容