Sentinel?是阿里中間件團隊研發(fā)的面向分布式服務(wù)架構(gòu)的輕量級高可用流量控制組件兵睛,最近正式開源洒敏。Sentinel 主要以流量為切入點,從流量控制滚秩、熔斷降級、系統(tǒng)負載保護等多個維度來幫助用戶保護服務(wù)的穩(wěn)定性榕吼。大家可能會問:Sentinel 和之前常用的熔斷降級庫 Netflix Hystrix 有什么異同呢您朽?本文將從多個角度對 Sentinel 和 Hystrix 進行對比,幫助大家進行技術(shù)選型仍源。?
Hystrix 的關(guān)注點在于以隔離和熔斷為主的容錯機制,超時或者熔斷的調(diào)用會快速失敗舔涎,并可以提供fallback機制笼踩,而Sentinel 的側(cè)重點在與:
多樣化的流量控制
熔斷升級
系統(tǒng)負載保護
實時監(jiān)控和控制臺
可以看到兩者解決的問題還是有比較大的不同的,下面我們來分別對比一下
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 的設(shè)計則更為簡單嫌吠。相比 Hystrix Command 強依賴隔離規(guī)則止潘,Sentinel 的資源定義與規(guī)則配置的耦合度更低。Hystrix 的 Command 強依賴于隔離規(guī)則配置的原因是隔離規(guī)則會直接影響 Command 的執(zhí)行辫诅。在執(zhí)行的時候 Hystrix 會解析 Command 的隔離規(guī)則來創(chuàng)建 RxJava Scheduler 并在其上調(diào)度執(zhí)行凭戴,若是線程池模式則 Scheduler 底層的線程池為配置的線程池,若是信號量模式則簡單包裝成當(dāng)前線程執(zhí)行的 Scheduler炕矮。而 Sentinel 并不指定執(zhí)行模型么夫,也不關(guān)注應(yīng)用是如何執(zhí)行的。Sentinel 的原則非常簡單:根據(jù)對應(yīng)資源配置的規(guī)則來為資源執(zhí)行相應(yīng)的限流/降級/負載保護策略肤视。在 Sentinel 中資源定義和規(guī)則配置是分離的档痪。用戶先通過 Sentinel API 給對應(yīng)的業(yè)務(wù)邏輯定義資源(埋點),然后可以在需要的時候配置規(guī)則钢颂。埋點方式有兩種:
try-catch 方式(通過 SphU.entry(...))钞它,用戶在 catch 塊中執(zhí)行異常處理 / fallback
if-else 方式(通過 SphO.entry(...))拜银,當(dāng)返回 false 時執(zhí)行異常處理 / fallback
Sentinel 提供多樣化的規(guī)則配置方式殊鞭。除了直接通過?loadRules?API 將規(guī)則注冊到內(nèi)存態(tài)之外,用戶還可以注冊各種外部數(shù)據(jù)源來提供動態(tài)的規(guī)則尼桶。用戶可以根據(jù)系統(tǒng)當(dāng)前的實時情況去動態(tài)地變更規(guī)則配置操灿,數(shù)據(jù)源會將變更推送至 Sentinel 并即時生效。
隔離是 Hystrix 的核心功能之一泵督。Hystrix 提供兩種隔離策略:線程池隔離(Bulkhead Pattern)和信號量隔離趾盐,其中最推薦也是最常用的是線程池隔離。Hystrix 的線程池隔離針對不同的資源分別創(chuàng)建不同的線程池小腊,不同服務(wù)調(diào)用都發(fā)生在不同的線程池中救鲤,在線程池排隊、超時等阻塞情況時可以快速失敗秩冈,并可以提供 fallback 機制本缠。線程池隔離的好處是隔離度比較高,可以針對某個資源的線程池去進行處理而不影響其它資源入问,但是代價就是線程上下文切換的 overhead 比較大丹锹,特別是對低延時的調(diào)用有比較大的影響。
但是芬失,實際情況下楣黍,線程池隔離并沒有帶來非常多的好處。首先就是過多的線程池會非常影響性能棱烂∽馄考慮這樣一個場景,在 Tomcat 之類的 Servlet 容器使用 Hystrix,本身 Tomcat 自身的線程數(shù)目就非常多了(可能到幾十或一百多)窜锯,如果加上 Hystrix 為各個資源創(chuàng)建的線程池张肾,總共線程數(shù)目會非常多(幾百個線程),這樣上下文切換會有非常大的損耗锚扎。另外吞瞪,線程池模式比較徹底的隔離性使得 Hystrix 可以針對不同資源線程池的排隊、超時情況分別進行處理驾孔,但這其實是超時熔斷和流量控制要解決的問題芍秆,如果組件具備了超時熔斷和流量控制的能力,線程池隔離就顯得沒有那么必要了翠勉。
Sentinel 可以通過并發(fā)線程數(shù)模式的流量控制來提供信號量隔離的功能妖啥。這樣的隔離非常輕量級,僅限制對某個資源調(diào)用的并發(fā)數(shù)对碌,而不是顯式地去創(chuàng)建線程池荆虱,所以 overhead 比較小,但是效果不錯朽们。并且結(jié)合基于響應(yīng)時間的熔斷降級模式怀读,可以在不穩(wěn)定資源的平均響應(yīng)時間比較高的時候自動降級,防止過多的慢調(diào)用占滿并發(fā)數(shù)骑脱,影響整個系統(tǒng)菜枷。而 Hystrix 的信號量隔離比較簡單,無法對慢調(diào)用自動進行降級叁丧,只能等待客戶端自己超時啤誊,因此仍然可能會出現(xiàn)級聯(lián)阻塞的情況。
熔斷降級對比 sentinel和Hystrix的熔斷降級本質(zhì)都是基于熔斷器模式
?Sentinel 與 Hystrix 都支持基于失敗比率(異常比率) 的熔斷降級?此時所有對該資源的調(diào)用都會被 block拥娄,直到過了指定的時間窗口后才啟發(fā)性地恢復(fù)蚊锹。上面提到過,Sentinel 還支持基于平均響應(yīng)時間的熔斷降級稚瘾,可以在服務(wù)響應(yīng)時間持續(xù)飆高的時候自動熔斷牡昆,拒絕掉更多的請求,直到一段時間后才恢復(fù)孟抗。這樣可以防止調(diào)用非常慢造成級聯(lián)阻塞的情況迁杨。
實時指標統(tǒng)計實現(xiàn)對比
Hystrix 和 Sentinel 的實時指標數(shù)據(jù)統(tǒng)計實現(xiàn)都是基于滑動窗口的。Hystrix 1.5 之前的版本是通過環(huán)形數(shù)組實現(xiàn)的滑動窗口凄硼,通過鎖配合 CAS 的操作對每個桶的統(tǒng)計信息進行更新铅协。Hystrix 1.5 開始對實時指標統(tǒng)計的實現(xiàn)進行了重構(gòu),將指標統(tǒng)計數(shù)據(jù)結(jié)構(gòu)抽象成了響應(yīng)式流(reactive stream)的形式摊沉,方便消費者去利用指標信息狐史。同時底層改造成了基于 RxJava 的事件驅(qū)動模式,在服務(wù)調(diào)用成功/失敗/超時的時候發(fā)布相應(yīng)的事件,通過一系列的變換和聚合最終得到實時的指標統(tǒng)計數(shù)據(jù)流骏全,可以被熔斷器或 Dashboard 消費苍柏。
Sentinel 目前抽象出了 Metric 指標統(tǒng)計接口,底層可以有不同的實現(xiàn)姜贡,目前默認的實現(xiàn)是基于LeapArray的滑動窗口试吁,后續(xù)根據(jù)需要可能會引入 reactive stream 等實現(xiàn)。
Sentinel 的特色
除了之前提到的兩者的共同特性之外楼咳,Sentinel 還提供以下的特色功能:
輕量級熄捍,高性能?
Sentinel 作為一個功能完備的高可用流量管控組件,其核心sentinel-core沒有任何多余依賴母怜,打包后只有不到200K余耽,非常輕量級,開發(fā)者可以放心引入?sentinel-core?而不需擔(dān)心依賴問題 苹熏,同時sentinel提供多種擴展點碟贾,用戶可以很方便的根據(jù)需求去進行擴展,而且無縫切換到Sentinel中
引入Sentinel帶來的性能損耗非常小轨域。只有在業(yè)務(wù)單機量級超過 25W QPS 的時候才會有一些顯著的影響(5% - 10% 左右)袱耽,單機 QPS 不太大的時候損耗幾乎可以忽略不計。
流量控制
Sentinel可以針對不同的調(diào)用 以不同的運行指標?如 QPS疙挺、并發(fā)調(diào)用數(shù)扛邑、系統(tǒng)負載等)為基準怜浅,對資源調(diào)用進行流量控制铐然,將隨機的請求調(diào)整成合適的形狀。
Sentinel 支持多樣化的流量整形策略恶座,在 QPS 過高的時候可以自動將流量調(diào)整成合適的形狀搀暑。常用的有:
直接拒絕模式:即超出的請求直接拒絕。
慢啟動預(yù)熱模式: 當(dāng)流量激增的時候跨琳,控制流量通過的速率自点,讓通過的流量緩緩的增加,在一定時間內(nèi)逐漸增加到閾值上限脉让,給冷系統(tǒng)一個預(yù)熱的時間桂敛,避免冷系統(tǒng)被壓垮。
勻速器模式?利用 Leaky Bucket 算法實現(xiàn)的勻速模式溅潜,嚴格控制了請求通過的時間間隔术唬,同時堆積的請求將會排隊,超過超時時長的請求直接被拒絕滚澜。
Sentinel? ?Hystrix
隔離策略基于并發(fā)數(shù)線程池隔離/信號量隔離
熔斷降級策略基于響應(yīng)時間或失敗比率基于失敗比率
實時指標實現(xiàn)滑動窗口滑動窗口(基于 RxJava)
規(guī)則配置支持多種數(shù)據(jù)源支持多種數(shù)據(jù)源
擴展性多個擴展點插件的形式
基于注解的支持即將發(fā)布支持
調(diào)用鏈路信息支持同步調(diào)用不支持
限流基于 QPS / 并發(fā)數(shù)粗仓,支持基于調(diào)用關(guān)系的限流不支持
流量整形支持慢啟動、勻速器模式不支持
系統(tǒng)負載保護支持不支持
實時監(jiān)控 API各式各樣較為簡單
控制臺開箱即用,可配置規(guī)則借浊、查看秒級監(jiān)控塘淑、機器發(fā)現(xiàn)等不完善
常見框架的適配Servlet、Spring Cloud蚂斤、Dubbo存捺、gRPC 等Servlet、Spring Cloud Netflix
文章出處 https://blog.csdn.net/educast/article/details/88735339