Sentinel vs Hystrix 限流對比,到底怎么選?
點擊關注公眾號,Java干貨及時送達
Sentinel 是阿里中間件團隊開源的,面向分布式服務架構的輕量級高可用流量控制組件,主要以流量為切入點,從流量控制、熔斷降級、系統(tǒng)負載保護等多個維度來幫助用戶保護服務的穩(wěn)定性。
大家可能會問:Sentinel 和之前常用的熔斷降級庫 Netflix Hystrix 有什么異同呢?
本文將從多個角度對 Sentinel 和 Hystrix 進行對比,幫助大家進行技術選型。
Overview
先來看一下 Hystrix 的官方介紹:
Hystrix is a library that helps you control the interactions between these distributed services by adding latency tolerance and fault tolerance logic. Hystrix does this by isolating points of access between the services, stopping cascading failures across them, and providing fallback options, all of which improve your system’s overall resiliency.
可以看到 Hystrix 的關注點在于以 隔離 和 熔斷 為主的容錯機制,超時或被熔斷的調用將會快速失敗,并可以提供 fallback 機制。
推薦一個 Spring Boot 基礎教程及實戰(zhàn)示例:
https://github.com/javastacks/spring-boot-best-practice
而 Sentinel 的側重點在于:
多樣化的流量控制 熔斷降級 系統(tǒng)負載保護 實時監(jiān)控和控制臺
可以看到兩者解決的問題還是有比較大的不同的,下面我們來分別對比一下。
共同特性
資源模型和執(zhí)行模型上的對比
Hystrix 的資源模型設計上采用了命令模式,將對外部資源的調用和 fallback 邏輯封裝成一個命令對象(HystrixCommand / HystrixObservableCommand),其底層的執(zhí)行是基于 RxJava 實現(xiàn)的。每個 Command 創(chuàng)建時都要指定 commandKey 和 groupKey(用于區(qū)分資源)以及對應的隔離策略(線程池隔離 or 信號量隔離)。
埋點方式有兩種:
try-catch 方式(通過 SphU.entry(...)),用戶在 catch 塊中執(zhí)行異常處理 / fallbackif-else 方式(通過 SphO.entry(...)),當返回 false 時執(zhí)行異常處理 / fallback
從 0.1.1 版本開始,Sentinel 還支持基于注解的資源定義方式,可以通過注解參數(shù)指定異常處理函數(shù)和 fallback 函數(shù)。最新面試題整理好了,點擊Java面試庫小程序在線刷題。
從 0.2.0 版本開始,Sentinel 引入異步調用鏈路支持,可以方便地統(tǒng)計異步調用資源的數(shù)據,維護異步調用鏈路,同時具備了適配異步框架/庫的能力。
Sentinel 提供多樣化的規(guī)則配置方式。除了直接通過 loadRules API 將規(guī)則注冊到內存態(tài)之外,用戶還可以注冊各種外部數(shù)據源來提供動態(tài)的規(guī)則。用戶可以根據系統(tǒng)當前的實時情況去動態(tài)地變更規(guī)則配置,數(shù)據源會將變更推送至 Sentinel 并即時生效。另外,分布式架構系列面試題和答案全部整理好了,微信搜索Java技術棧,在后臺發(fā)送:面試,可以在線閱讀。
隔離設計上的對比
熔斷降級對比
實時指標統(tǒng)計實現(xiàn)對比
Sentinel 目前抽象出了 Metric 指標統(tǒng)計接口,底層可以有不同的實現(xiàn),目前默認的實現(xiàn)是基于 LeapArray 的高性能滑動窗口,后續(xù)根據需要可能會引入 reactive stream 等實現(xiàn)。最新面試題整理好了,點擊Java面試庫小程序在線刷題。
Sentinel 的特色
除了之前提到的兩者的共同特性之外,Sentinel 還提供以下的特色功能:
輕量級、高性能
Sentinel 作為一個功能完備的高可用流量管控組件,其核心 sentinel-core 沒有任何多余依賴,打包后只有不到 200 KB,非常輕量級。開發(fā)者可以放心地引入 sentinel-core 而不需擔心依賴問題。同時,Sentinel 提供了多種擴展點,用戶可以很方便地根據需求去進行擴展,并且無縫地切合到 Sentinel 中。
引入 Sentinel 帶來的性能損耗非常小。只有在業(yè)務單機量級超過 25W QPS 的時候才會有一些顯著的影響(5% - 10% 左右),單機 QPS 不太大的時候損耗幾乎可以忽略不計。
最新 Java 技術教程:https://www.javastack.cn/
流量控制
Sentinel 可以針對不同的調用關系,以不同的運行指標(如 QPS、并發(fā)調用數(shù)、系統(tǒng)負載等)為基準,對資源調用進行流量控制,將隨機的請求調整成合適的形狀。
Sentinel 支持多樣化的流量整形策略,在 QPS 過高的時候可以自動將流量調整成合適的形狀。常用的有:
直接拒絕模式:即超出的請求直接拒絕。 慢啟動預熱模式:當流量激增的時候,控制流量通過的速率,讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限,給冷系統(tǒng)一個預熱的時間,避免冷系統(tǒng)被壓垮。

勻速器模式:利用 Leaky Bucket 算法實現(xiàn)的勻速模式,嚴格控制了請求通過的時間間隔,同時堆積的請求將會排隊,超過超時時長的請求直接被拒絕。

Sentinel 還支持 基于調用關系的限流,包括基于調用方限流、基于調用鏈入口限流、關聯(lián)流量限流等,依托于 Sentinel 強大的調用鏈路統(tǒng)計信息,可以提供精準的不同維度的限流。
Sentinel 0.2.0 開始支持 熱點參數(shù)限流,能夠實時的統(tǒng)計熱點參數(shù)并針對熱點參數(shù)的資源調用進行流量控制。
另外,更全面、更詳細的 Spring Cloud Alibaba 教程可以報名參加棧長的《Spring Cloud Alibaba 實戰(zhàn)課》,最新制作,一次付費,永久免費提供更新。
系統(tǒng)負載保護
Sentinel 對系統(tǒng)的維度提供保護,負載保護算法借鑒了 TCP BBR 的思想。當系統(tǒng)負載較高的時候,如果仍持續(xù)讓請求進入,可能會導致系統(tǒng)崩潰,無法響應。在集群環(huán)境下,網絡負載均衡會把本應這臺機器承載的流量轉發(fā)到其它的機器上去。如果這個時候其它的機器也處在一個邊緣狀態(tài)的時候,這個增加的流量就會導致這臺機器也崩潰,最后導致整個集群不可用。針對這個情況,Sentinel 提供了對應的保護機制,讓系統(tǒng)的入口流量和系統(tǒng)的負載達到一個平衡,保證系統(tǒng)在能力范圍之內處理最多的請求。

實時監(jiān)控與控制面板
Sentinel 提供 HTTP API 用于獲取實時的監(jiān)控信息,如調用鏈路統(tǒng)計信息、簇點信息、規(guī)則信息等。如果用戶正在使用 Spring Boot/Spring Cloud 并使用了 Sentinel Spring Cloud Starter,還可以方便地通過其暴露的 Actuator Endpoint 來獲取運行時的一些信息,如動態(tài)規(guī)則等。未來 Sentinel 還會支持標準化的指標監(jiān)控 API,可以方便地整合各種監(jiān)控系統(tǒng)和可視化系統(tǒng),如 Prometheus、Grafana 等。
Sentinel 控制臺(Dashboard)提供了機器發(fā)現(xiàn)、配置規(guī)則、查看實時監(jiān)控、查看調用鏈路信息等功能,使得用戶可以非常方便地去查看監(jiān)控和進行配置。

生態(tài)
Sentinel 目前已經針對 Servlet、Dubbo、Spring Boot/Spring Cloud、gRPC 等進行了適配,用戶只需引入相應依賴并進行簡單配置即可非常方便地享受 Sentinel 的高可用流量防護能力。未來 Sentinel 還會對更多常用框架進行適配,并且會為 Service Mesh 提供集群流量防護的能力。
總結
最后用表格來進行對比總結:
| Sentinel | Hystrix | |
|---|---|---|
| 隔離策略 | 信號量隔離 | 線程池隔離/信號量隔離 |
| 熔斷降級策略 | 基于響應時間或失敗比率 | 基于失敗比率 |
| 實時指標實現(xiàn) | 滑動窗口 | 滑動窗口(基于 RxJava) |
| 規(guī)則配置 | 支持多種數(shù)據源 | 支持多種數(shù)據源 |
| 擴展性 | 多個擴展點 | 插件的形式 |
| 基于注解的支持 | 支持 | 支持 |
| 限流 | 基于 QPS,支持基于調用關系的限流 | 有限的支持 |
| 流量整形 | 支持慢啟動、勻速器模式 | 不支持 |
| 系統(tǒng)負載保護 | 支持 | 不支持 |
| 控制臺 | 開箱即用,可配置規(guī)則、查看秒級監(jiān)控、機器發(fā)現(xiàn)等 | 不完善 |
| 常見框架的適配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
參考:https://github.com/alibaba/Sentinel/wiki/
更全面、更詳細的 Spring Cloud Alibaba 教程可以報名參加棧長的《Spring Cloud Alibaba 實戰(zhàn)課》,最新制作,一次付費,永久免費提供更新。

關注Java技術棧看更多干貨


