Alibaba Sentinel

sentinel-logo

Sentinel 是什么

Sentinel 是面向分布式服務(wù)架構(gòu)的輕量級(jí)流量控制組件蜘矢,主要以流量為切入點(diǎn)妈候,從限流、流量整形立哑、熔斷降級(jí)夜惭、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度來(lái)幫助您保障微服務(wù)的穩(wěn)定性。

2012年起步刁憋,主要功能是入口流量控制滥嘴,在阿里內(nèi)部覆蓋了所有核心場(chǎng)景。2018年開(kāi)源至耻,發(fā)展至今已經(jīng)可以提供各種維度若皱、各種角度的風(fēng)騷的流量控制功能镊叁。

Sentinel流量整形實(shí)際效果

在本地環(huán)境使用 ab 對(duì)喜茶 GO 小程序菜單接口進(jìn)行30線程并發(fā)壓測(cè)
整形前
ab-test
整形后
ab-test2

對(duì)比流量整形前后,在服務(wù)提供同樣QPS處理能力的情況下走触,平均RT從整形前的493-1730ms穩(wěn)定到了468-599ms晦譬,cpu從80%降至50%,削峰填谷效果明顯互广。

先回顧下Hystrix

Hystrix的核心功能:

  • 資源隔離
  • 熔斷
  • 降級(jí)

兩種資源隔離策略:

線程池(默認(rèn))

通過(guò)HystrixCommand為調(diào)用依賴的api分配定制化的線程池敛腌,請(qǐng)求與調(diào)用線程分離,既異步調(diào)用

信號(hào)量

通過(guò)HystrixCommand為調(diào)用依賴的api分配信號(hào)量惫皱,請(qǐng)求與調(diào)用使用相同線程像樊,既同步調(diào)用

3.png
4.png
5.png
6.png

Sentinel與Hystrix的差異

Hystrix 的關(guān)注點(diǎn)在于以隔離和熔斷為主的容錯(cuò)機(jī)制,超時(shí)或被熔斷的調(diào)用將會(huì)快速失敗旅敷,并可以提供 fallback 機(jī)制生棍。

而 Sentinel

7.png

他的側(cè)重點(diǎn)在于:

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

在熔斷策略上,Hystrix的兩種資源隔離策略無(wú)法同時(shí)滿足:低開(kāi)銷+靈活的超時(shí)控制媳谁,而Sentinel可以同時(shí)配置并發(fā)線程數(shù)控制+響應(yīng)時(shí)間超時(shí)熔斷

8.png

Sentinel 的核心概念

使用 Sentinel 來(lái)進(jìn)行資源保護(hù)涂滴,主要分為幾個(gè)步驟:

  1. 定義資源
  2. 定義規(guī)則
  3. 檢驗(yàn)規(guī)則是否生效

資源

資源是 Sentinel 的關(guān)鍵概念。它可以是 Java 應(yīng)用程序中的任何內(nèi)容晴音,例如柔纵,由應(yīng)用程序提供的服務(wù),或由應(yīng)用程序調(diào)用的其它應(yīng)用提供的服務(wù)锤躁,甚至可以是一段代碼搁料。在接下來(lái)的文檔中,我們都會(huì)用資源來(lái)描述代碼塊进苍。

只要通過(guò) Sentinel API 定義的代碼加缘,就是資源,能夠被 Sentinel 保護(hù)起來(lái)觉啊。大部分情況下,可以使用方法簽名沈贝,URL杠人,甚至服務(wù)名稱作為資源名來(lái)標(biāo)示資源。

規(guī)則

圍繞資源的實(shí)時(shí)狀態(tài)設(shè)定的規(guī)則宋下,可以包括流量控制規(guī)則嗡善、熔斷降級(jí)規(guī)則以及系統(tǒng)保護(hù)規(guī)則,或是自定義規(guī)則学歧。所有規(guī)則可以動(dòng)態(tài)實(shí)時(shí)調(diào)整罩引。

流量控制規(guī)則(FlowRule)

兩種統(tǒng)計(jì)類型
  • 并發(fā)線程數(shù)流量控制:并發(fā)線程數(shù)限流用于保護(hù)業(yè)務(wù)線程數(shù)不被耗盡。Sentinel 并發(fā)線程數(shù)限流不負(fù)責(zé)創(chuàng)建和管理線程池枝笨,而是簡(jiǎn)單統(tǒng)計(jì)當(dāng)前請(qǐng)求上下文的線程數(shù)目袁铐,如果超出閾值揭蜒,新的請(qǐng)求會(huì)被立即拒絕,效果類似于信號(hào)量隔離剔桨。

  • QPS流量控制:當(dāng) QPS 超過(guò)某個(gè)閾值的時(shí)候屉更,則采取措施進(jìn)行流量控制。流量控制的效果包括以下幾種:

    • 直接拒絕
      默認(rèn)的流量控制方式洒缀,當(dāng)QPS超過(guò)任意規(guī)則的閾值后瑰谜,新的請(qǐng)求就會(huì)被立即拒絕,拒絕方式為拋出FlowException树绩。這種方式適用于對(duì)系統(tǒng)處理能力確切已知的情況下萨脑,比如通過(guò)壓測(cè)確定了系統(tǒng)的準(zhǔn)確水位時(shí)。

    • 冷啟動(dòng)(Warm Up)
      當(dāng)系統(tǒng)長(zhǎng)期處于低水位的情況下饺饭,當(dāng)流量突然增加時(shí)渤早,直接把系統(tǒng)拉升到高水位可能瞬間把系統(tǒng)壓垮。通過(guò)"冷啟動(dòng)"砰奕,讓通過(guò)的流量緩慢增加蛛芥,在一定時(shí)間內(nèi)逐漸增加到閾值上限,給冷系統(tǒng)一個(gè)預(yù)熱的時(shí)間军援,避免冷系統(tǒng)被壓垮仅淑。
      通常冷啟動(dòng)的過(guò)程系統(tǒng)允許通過(guò)的 QPS 曲線如下圖所示:

9.png
  • 勻速排隊(duì)(流量整形)
    該方式會(huì)嚴(yán)格控制請(qǐng)求通過(guò)的間隔時(shí)間,也即是讓請(qǐng)求以均勻的速度通過(guò)胸哥,對(duì)應(yīng)的是漏桶算法涯竟。這種方式主要用于處理間隔性突發(fā)的流量,例如消息隊(duì)列空厌。想象一下這樣的場(chǎng)景庐船,在某一秒有大量的請(qǐng)求到來(lái),而接下來(lái)的幾秒則處于空閑狀態(tài)嘲更,我們希望系統(tǒng)能夠在接下來(lái)的空閑期間逐漸處理這些請(qǐng)求筐钟,而不是在第一秒直接拒絕多余的請(qǐng)求。

該方式的作用如下圖所示:

10.png

使用Sentinel的這種策略, 簡(jiǎn)單點(diǎn)說(shuō), 就是使用一個(gè)時(shí)間段(比如20s的時(shí)間)處理某一瞬時(shí)產(chǎn)生的大量請(qǐng)求, 起到一個(gè)削峰填谷的作用, 從而充分利用系統(tǒng)的處理能力, 下圖能很形象的展示這種場(chǎng)景: X軸代表時(shí)間, Y軸代表系統(tǒng)處理的請(qǐng)求.

11.png

三種流控模式

  • 根據(jù)調(diào)用方限流

    • default(直接模式):表示不區(qū)分調(diào)用者赋朦,來(lái)自任何調(diào)用者的請(qǐng)求都將進(jìn)行限流統(tǒng)計(jì)篓冲。如果這個(gè)資源名的調(diào)用總和超過(guò)了這條規(guī)則定義的閾值,則觸發(fā)限流宠哄。

    • {some_origin_name}:表示針對(duì)特定的調(diào)用者壹将,只有來(lái)自這個(gè)調(diào)用者的請(qǐng)求才會(huì)進(jìn)行流量控制。例如 NodeA 配置了一條針對(duì)調(diào)用者caller1的規(guī)則毛嫉,那么當(dāng)且僅當(dāng)來(lái)自 caller1 對(duì) NodeA 的請(qǐng)求才會(huì)觸發(fā)流量控制诽俯。

    • other:表示針對(duì)除 {some_origin_name} 以外的其余調(diào)用方的流量進(jìn)行流量控制。例如承粤,資源NodeA配置了一條針對(duì)調(diào)用者 caller1 的限流規(guī)則暴区,同時(shí)又配置了一條調(diào)用者為 other 的規(guī)則闯团,那么任意來(lái)自非 caller1 對(duì) NodeA 的調(diào)用,都不能超過(guò) other 這條規(guī)則定義的閾值颜启。
      同一個(gè)資源名可以配置多條規(guī)則偷俭,規(guī)則的生效順序?yàn)椋簕some_origin_name} > other > default

  • 根據(jù)調(diào)用鏈路入口限流:鏈路限流
    只限流指定的入口資源產(chǎn)生的流量。比如有A缰盏、B涌萤、C資源,調(diào)用鏈路為A->C口猜,B->C负溪,可以對(duì)C進(jìn)行鏈路限流,指定入口資源為A济炎,那么A->C會(huì)被限流川抡,B->C不會(huì)

  • 具有關(guān)系的資源流量控制:關(guān)聯(lián)流量控制
    當(dāng)關(guān)聯(lián)的資源達(dá)到閥值,就限流自己须尚。比如有A崖堤、B資源,設(shè)置A資源為B資源的關(guān)聯(lián)資源耐床,則當(dāng)A超過(guò)閾值時(shí)密幔,B就被限流(A不會(huì)被限流)。常用于避免讀寫(xiě)資源爭(zhēng)搶導(dǎo)致的性能損耗撩轰。

熔斷降級(jí)規(guī)則 (DegradeRule)

  • 平均響應(yīng)時(shí)間

  • 異常比例

  • 異常數(shù)

系統(tǒng)保護(hù)規(guī)則 (SystemRule)

Sentinel 系統(tǒng)自適應(yīng)限流從整體維度對(duì)應(yīng)用入口流量進(jìn)行控制胯甩,結(jié)合應(yīng)用的 Load、CPU 使用率堪嫂、總體平均 RT缸棵、入口 QPS 和并發(fā)線程數(shù)等幾個(gè)維度的監(jiān)控指標(biāo)悼做,通過(guò)自適應(yīng)的流控策略拒担,讓系統(tǒng)的入口流量和系統(tǒng)的負(fù)載達(dá)到一個(gè)平衡追驴,讓系統(tǒng)盡可能跑在最大吞吐量的同時(shí)保證系統(tǒng)整體的穩(wěn)定性。

訪問(wèn)控制規(guī)則 (AuthorityRule)

很多時(shí)候恶复,我們需要根據(jù)調(diào)用方來(lái)限制資源是否通過(guò)娇唯,這時(shí)候可以使用 Sentinel 的訪問(wèn)控制(黑白名單)的功能。黑白名單根據(jù)資源的請(qǐng)求來(lái)源(origin)限制資源是否通過(guò)寂玲,若配置白名單則只有請(qǐng)求來(lái)源位于白名單內(nèi)時(shí)才可通過(guò);若配置黑名單則請(qǐng)求來(lái)源位于黑名單時(shí)不通過(guò)梗摇,其余的請(qǐng)求通過(guò)拓哟。

熱點(diǎn)規(guī)則 (ParamFlowRule)

何為熱點(diǎn)?熱點(diǎn)即經(jīng)常訪問(wèn)的數(shù)據(jù)伶授。很多時(shí)候我們希望統(tǒng)計(jì)某個(gè)熱點(diǎn)數(shù)據(jù)中訪問(wèn)頻次最高的 Top K 數(shù)據(jù)断序,并對(duì)其訪問(wèn)進(jìn)行限制流纹。比如:

商品 ID 為參數(shù),統(tǒng)計(jì)一段時(shí)間內(nèi)最常購(gòu)買的商品 ID 并進(jìn)行限制
用戶 ID 為參數(shù)违诗,針對(duì)一段時(shí)間內(nèi)頻繁訪問(wèn)的用戶 ID 進(jìn)行限制
熱點(diǎn)參數(shù)限流會(huì)統(tǒng)計(jì)傳入?yún)?shù)中的熱點(diǎn)參數(shù)漱凝,并根據(jù)配置的限流閾值與模式,對(duì)包含熱點(diǎn)參數(shù)的資源調(diào)用進(jìn)行限流诸迟。熱點(diǎn)參數(shù)限流可以看做是一種特殊的流量控制茸炒,僅對(duì)包含熱點(diǎn)參數(shù)的資源調(diào)用生效。

定制自己的持久化規(guī)則

提供了開(kāi)放的接口阵苇,您可以通過(guò)實(shí)現(xiàn) DataSource 接口的方式壁公,來(lái)自定義規(guī)則的存儲(chǔ)數(shù)據(jù)源。通常我們的建議有:

  • 整合動(dòng)態(tài)配置系統(tǒng)绅项,如 ZooKeeper紊册、Nacos、Apollo 等快耿,動(dòng)態(tài)地實(shí)時(shí)刷新配置規(guī)則
  • 結(jié)合 RDBMS囊陡、NoSQL、VCS 等來(lái)實(shí)現(xiàn)該規(guī)則
  • 配合 Sentinel Dashboard 使用

Sentinel工作原理概覽

在 Sentinel 里面掀亥,所有的資源都對(duì)應(yīng)一個(gè)資源名稱(resourceName)撞反,每次資源調(diào)用都會(huì)創(chuàng)建一個(gè) Entry 對(duì)象。Entry 可以通過(guò)對(duì)主流框架的適配自動(dòng)創(chuàng)建铺浇,也可以通過(guò)注解的方式或調(diào)用 SphU API 顯式創(chuàng)建痢畜。Entry 創(chuàng)建的時(shí)候,同時(shí)也會(huì)創(chuàng)建一系列功能插槽(slot chain)鳍侣,這些插槽有不同的職責(zé)丁稀,例如:

  • NodeSelectorSlot 負(fù)責(zé)收集資源的路徑,并將這些資源的調(diào)用路徑倚聚,以樹(shù)狀結(jié)構(gòu)存儲(chǔ)起來(lái)线衫,用于根據(jù)調(diào)用路徑來(lái)限流降級(jí);
  • ClusterBuilderSlot 則用于存儲(chǔ)資源的統(tǒng)計(jì)信息以及調(diào)用者信息惑折,例如該資源的 RT, QPS, thread count 等等授账,這些信息將用作為多維度限流,降級(jí)的依據(jù)惨驶;
  • StatisticSlot 則用于記錄白热、統(tǒng)計(jì)不同緯度的 runtime 指標(biāo)監(jiān)控信息;
  • FlowSlot 則用于根據(jù)預(yù)設(shè)的限流規(guī)則以及前面 slot 統(tǒng)計(jì)的狀態(tài)粗卜,來(lái)進(jìn)行流量控制屋确;
  • AuthoritySlot 則根據(jù)配置的黑白名單和調(diào)用來(lái)源信息,來(lái)做黑白名單控制;
  • DegradeSlot 則通過(guò)統(tǒng)計(jì)信息以及預(yù)設(shè)的規(guī)則攻臀,來(lái)做熔斷降級(jí)焕数;
  • SystemSlot 則通過(guò)系統(tǒng)的狀態(tài),例如 load1 等刨啸,來(lái)控制總的入口流量堡赔;

總體的框架如下:

12.jpeg

Sentinel 將 ProcessorSlot 作為 SPI 接口進(jìn)行擴(kuò)展(1.7.2 版本以前 SlotChainBuilder 作為 SPI),使得 Slot Chain 具備了擴(kuò)展的能力设联。您可以自行加入自定義的 slot 并編排 slot 間的順序善已,從而可以給 Sentinel 添加自定義的功能。

13.png

如何使用Sentinel

wiki:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
Quick Start https://github.com/alibaba/Sentinel/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97#%E6%9C%AC%E5%9C%B0-demo
Sentinel Demo集錦:https://github.com/alibaba/Sentinel/tree/master/sentinel-demo
Spring Cloud Alibaba Sentinel:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel

參考:https://github.com/alibaba/Sentinel/wiki

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仑荐,一起剝皮案震驚了整個(gè)濱河市雕拼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粘招,老刑警劉巖啥寇,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異洒扎,居然都是意外死亡辑甜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門袍冷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)磷醋,“玉大人,你說(shuō)我怎么就攤上這事胡诗〉讼撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵煌恢,是天一觀的道長(zhǎng)骇陈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瑰抵,這世上最難降的妖魔是什么你雌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮二汛,結(jié)果婚禮上婿崭,老公的妹妹穿的比我還像新娘。我一直安慰自己肴颊,他們只是感情好氓栈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著婿着,像睡著了一般颤绕。 火紅的嫁衣襯著肌膚如雪幸海。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天奥务,我揣著相機(jī)與錄音,去河邊找鬼袜硫。 笑死氯葬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婉陷。 我是一名探鬼主播帚称,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秽澳!你這毒婦竟也來(lái)了闯睹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤担神,失蹤者是張志新(化名)和其女友劉穎楼吃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體妄讯,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孩锡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亥贸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躬窜。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖炕置,靈堂內(nèi)的尸體忽然破棺而出荣挨,到底是詐尸還是另有隱情,我是刑警寧澤朴摊,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布默垄,位于F島的核電站,受9級(jí)特大地震影響仍劈,放射性物質(zhì)發(fā)生泄漏厕倍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一贩疙、第九天 我趴在偏房一處隱蔽的房頂上張望讹弯。 院中可真熱鬧,春花似錦这溅、人聲如沸组民。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)臭胜。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耸三,已是汗流浹背乱陡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仪壮,地道東北人憨颠。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像积锅,于是被迫代替她去往敵國(guó)和親爽彤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355