原文鏈接:
文集鏈接:微服務(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)行配置。

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é)

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


