sentinel && Hystrix

Sentinel Hystrix
隔離策略 信號量隔離 線程池隔離/信號量隔離
熔斷降級策略 基于響應(yīng)時間或失敗比率 基于失敗比率
實時指標實現(xiàn) 滑動窗口 滑動窗口(基于RxJava)
規(guī)則配置 支持多種數(shù)據(jù)源 支持多種數(shù)據(jù)源
擴展性 多個擴展點 插件的形式
基于注解的支持 支持 支持
限流 基于QPS,支持基于調(diào)用關(guān)系的限流 不支持
流量整形 支持慢啟動油啤,勻速器模式 不支持
系統(tǒng)負載保護 支持 不支持
控制臺 開箱即用具钥,可配置規(guī)則肥败,查看秒級監(jiān)控藕帜。機器發(fā)現(xiàn)等 不完善
常見框架的適配 Servlet、Spring Cloud币喧、Dubbo变汪、gRPC等 Servlet、Spring Cloud Netflix

一.宏觀對比

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:
    關(guān)注點在于以隔離和熔斷為主的容錯機制催首,超時或被熔斷的調(diào)用將會快速失敗扶踊,可以提供failback機制。
  • sentinel
    側(cè)重于流量控制郎任、熔斷降級秧耗、系統(tǒng)負載保護實時監(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 的設(shè)計則更為簡單承绸。相比 Hystrix Command 強依賴隔離規(guī)則,Sentinel 的資源定義與規(guī)則配置的耦合度更低挣轨。Hystrix 的 Command 強依賴于隔離規(guī)則配置的原因是隔離規(guī)則會直接影響 Command 的執(zhí)行军熏。在執(zhí)行的時候 Hystrix 會解析 Command 的隔離規(guī)則來創(chuàng)建 RxJava Scheduler 并在其上調(diào)度執(zhí)行,若是線程池模式則 Scheduler 底層的線程池為配置的線程池刃唐,若是信號量模式則簡單包裝成當前線程執(zhí)行的 Scheduler羞迷。

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

從 0.1.1 版本開始抖甘,Sentinel 還支持基于注解的資源定義方式热鞍,可以通過注解參數(shù)指定異常處理函數(shù)和 fallback 函數(shù)。Sentinel 提供多樣化的規(guī)則配置方式衔彻。除了直接通過 loadRules API 將規(guī)則注冊到內(nèi)存態(tài)之外薇宠,用戶還可以注冊各種外部數(shù)據(jù)源來提供動態(tài)的規(guī)則。用戶可以根據(jù)系統(tǒng)當前的實時情況去動態(tài)地變更規(guī)則配置艰额,數(shù)據(jù)源會將變更推送至 Sentinel 并即時生效澄港。

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

隔離是 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 可以針對不同資源線程池的排隊、超時情況分別進行處理砚亭,但這其實是超時熔斷和流量控制要解決的問題灯变,如果組件具備了超時熔斷和流量控制的能力,線程池隔離就顯得沒有那么必要了捅膘。

Hystrix 的信號量隔離限制對某個資源調(diào)用的并發(fā)數(shù)添祸。這樣的隔離非常輕量級,僅限制對某個資源調(diào)用的并發(fā)數(shù)寻仗,而不是顯式地去創(chuàng)建線程池刃泌,所以 overhead 比較小,但是效果不錯署尤。但缺點是無法對慢調(diào)用自動進行降級耙替,只能等待客戶端自己超時,因此仍然可能會出現(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)用達到一定量級并且失敗比率達到設(shè)定的閾值時自動進行熔斷,此時所有對該資源的調(diào)用都會被 block厨诸,直到過了指定的時間窗口后才啟發(fā)性地恢復(fù)镶殷。上面提到過,Sentinel 還支持基于平均響應(yīng)時間的熔斷降級微酬,可以在服務(wù)響應(yīng)時間持續(xù)飆高的時候自動熔斷绘趋,拒絕掉更多的請求,直到一段時間后才恢復(fù)颗管。這樣可以防止調(diào)用非常慢造成級聯(lián)阻塞的情況陷遮。

4.實時指標統(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特性

1.輕量級和高性能

Sentinel 作為一個功能完備的高可用流量管控組件逢慌,其核心 sentinel-core 沒有任何多余依賴悠轩,打包后只有不到 200 KB,非常輕量級涕癣。開發(fā)者可以放心地引入 sentinel-core 而不需擔心依賴問題哗蜈。同時,Sentinel 提供了多種擴展點坠韩,用戶可以很方便地根據(jù)需求去進行擴展距潘,并且無縫地切合到 Sentinel 中。

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

2.流量控制

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

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

  • 直接拒絕模式:即超出的請求直接拒絕。
  • 慢啟動預(yù)熱模式:當流量激增的時候震鹉,控制流量通過的速率俱笛,讓通過的流量緩慢增加,在一定時間內(nèi)逐漸增加到閾值上限传趾,給冷系統(tǒng)一個預(yù)熱的時間迎膜,避免冷系統(tǒng)被壓垮。


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


3.系統(tǒng)負載保護

Sentinel 對系統(tǒng)的維度提供保護兼贸,負載保護算法借鑒了 TCP BBR 的思想。當系統(tǒng)負載較高的時候吃溅,如果仍持續(xù)讓請求進入溶诞,可能會導(dǎo)致系統(tǒng)崩潰,無法響應(yīng)决侈。在集群環(huán)境下螺垢,網(wǎng)絡(luò)負載均衡會把本應(yīng)這臺機器承載的流量轉(zhuǎn)發(fā)到其它的機器上去。如果這個時候其它的機器也處在一個邊緣狀態(tài)的時候赖歌,這個增加的流量就會導(dǎo)致這臺機器也崩潰枉圃,最后導(dǎo)致整個集群不可用。針對這個情況庐冯,Sentinel 提供了對應(yīng)的保護機制孽亲,讓系統(tǒng)的入口流量和系統(tǒng)的負載達到一個平衡,保證系統(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控制臺(Dashboard)提供了機器發(fā)現(xiàn)、配置規(guī)則痰娱、查看實時監(jiān)控弃榨、查看調(diào)用鏈路信息等功能,使得用戶可以非常方便地去查看監(jiān)控和進行配置梨睁。

5.生態(tài)

Sentinel 目前已經(jīng)針對 Servlet鲸睛、Dubbo、Spring Boot/Spring Cloud坡贺、gRPC 等進行了適配官辈,用戶只需引入相應(yīng)依賴并進行簡單配置即可非常方便地享受 Sentinel 的高可用流量防護能力箱舞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拳亿,隨后出現(xiàn)的幾起案子晴股,更是在濱河造成了極大的恐慌,老刑警劉巖肺魁,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件电湘,死亡現(xiàn)場離奇詭異,居然都是意外死亡鹅经,警方通過查閱死者的電腦和手機寂呛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘾晃,“玉大人贷痪,你說我怎么就攤上這事”奈螅” “怎么了劫拢?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長强胰。 經(jīng)常有香客問我舱沧,道長,這世上最難降的妖魔是什么偶洋? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任狗唉,我火速辦了婚禮,結(jié)果婚禮上涡真,老公的妹妹穿的比我還像新娘分俯。我一直安慰自己,他們只是感情好哆料,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布缸剪。 她就那樣靜靜地躺著,像睡著了一般东亦。 火紅的嫁衣襯著肌膚如雪杏节。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天典阵,我揣著相機與錄音奋渔,去河邊找鬼。 笑死壮啊,一個胖子當著我的面吹牛嫉鲸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歹啼,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼玄渗,長吁一口氣:“原來是場噩夢啊……” “哼座菠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起藤树,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浴滴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后岁钓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體升略,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年屡限,在試婚紗的時候發(fā)現(xiàn)自己被綠了降宅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡囚霸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出激才,到底是詐尸還是另有隱情拓型,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布瘸恼,位于F島的核電站劣挫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏东帅。R本人自食惡果不足惜压固,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靠闭。 院中可真熱鬧帐我,春花似錦、人聲如沸愧膀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檩淋。三九已至芬为,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟀悦,已是汗流浹背媚朦。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留日戈,地道東北人询张。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像浙炼,于是被迫代替她去往敵國和親瑞侮。 傳聞我的和親對象是個殘疾皇子的圆,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容