摘要:上一期我們談到了阿里巴巴早期是通過通過在 Nginx 上實(shí)現(xiàn)的擴(kuò)展組件TMD(taobao missile defense淘寶導(dǎo)彈防御系統(tǒng))實(shí)現(xiàn)了接入層限流的主要工作,TMD系統(tǒng)可通過域名類限流、cookie限流、黑名單以及一些安全策略等很好的實(shí)現(xiàn)了在接入層的限流措施。
上一期我們談到了阿里巴巴早期是通過通過在 Nginx 上實(shí)現(xiàn)的擴(kuò)展組件TMD(taobao missile
defense淘寶導(dǎo)彈防御系統(tǒng))實(shí)現(xiàn)了接入層限流的主要工作,TMD系統(tǒng)可通過域名類限流、cookie限流、黑名單以及一些安全策略等很好的實(shí)現(xiàn)了在接入層的限流措施。
但對于服務(wù)層,TMD就無能為力了。對于實(shí)現(xiàn)服務(wù)的限流控制,傳統(tǒng)的實(shí)現(xiàn)方式通常用spring的AOP機(jī)制,對需要限流的接口定義一個advice攔截器,但這套方案在實(shí)際應(yīng)用場景中還是會發(fā)現(xiàn)不少問題。詳細(xì)問題可通過以下的傳送門,進(jìn)行了解。
一、Sentinel 簡介
第二期我們將分享到阿里巴巴是如何解決服務(wù)層限流時遇到的問題的。在今年7月底的Aliware Open
Sourec深圳站的活動上,阿里巴巴宣布開源面向分布式服務(wù)架構(gòu)的輕量級限流降級框架
Sentinel。Sentinel正如它英文的意思“哨兵”一樣,為整個服務(wù)化體系的穩(wěn)定運(yùn)行行使著警戒任務(wù),是對資源調(diào)用的控制平臺,主要涵蓋了授權(quán)、限流、降級、調(diào)用統(tǒng)計(jì)監(jiān)控四大功能。
授權(quán):通過配置白名單和黑名單的方式分布式系統(tǒng)的接口和方法進(jìn)行調(diào)用權(quán)限的控制;
限流:對特定資源進(jìn)行調(diào)用的保護(hù),防止資源的過度使用;
降級:判斷依賴的資源的響應(yīng)情況,但依賴的資源響應(yīng)時間過長時進(jìn)行自動降級,并且在指定的時間后自動恢復(fù)調(diào)用;
監(jiān)控:提供了全面的運(yùn)行狀態(tài)監(jiān)控,實(shí)時監(jiān)控資源的調(diào)用情況,如QPS、響應(yīng)時間、限流降級等信息;
Sentinel 平臺有兩個基礎(chǔ)概念,資源和策略,對特定的資源采取不同的控制策略,起到保障應(yīng)用穩(wěn)定性的作用。Sentinel
提供了多個默認(rèn)切入點(diǎn),比如服務(wù)調(diào)用時,數(shù)據(jù)庫、緩存等資源訪問時,覆蓋了大部分應(yīng)用場景,保證對應(yīng)用的低侵入性,同時也支持硬編碼或者自定義AOP的方式來支持特定的使用需求。
二、Sentinel 限流的實(shí)現(xiàn)原理
Sentinel 平臺架構(gòu)圖如下,需要通過Sentinel 實(shí)現(xiàn)限流功能的應(yīng)用中都嵌入Sentinel 客戶端,通過Sentinel
客戶端中提供對服務(wù)調(diào)用和各資源訪問缺省實(shí)現(xiàn)的切入點(diǎn),使得應(yīng)用完全不需要對實(shí)現(xiàn)限流的服務(wù)或資源進(jìn)行單獨(dú)的AOP配置和實(shí)現(xiàn),同時不僅可以限制自己的應(yīng)用調(diào)用別的應(yīng)用,也可以限制別的應(yīng)用調(diào)用我的應(yīng)用。通過這些資源埋點(diǎn)實(shí)時計(jì)算當(dāng)前服務(wù)的QPS,也可通過現(xiàn)有的監(jiān)控系統(tǒng)獲取到應(yīng)用所在服務(wù)器的相關(guān)系統(tǒng)監(jiān)控指標(biāo),用于限流規(guī)則配置中的閥值比對。

?Sentinel 平臺架構(gòu)示意圖
Sentinel控制臺會從客戶端拉取資源實(shí)時的運(yùn)行監(jiān)控?cái)?shù)據(jù)如QPS、響應(yīng)時間等,并展示在控制臺的監(jiān)控面板上。控制臺給運(yùn)維人員提供了針對服務(wù)、緩存、數(shù)據(jù)庫等資源訪問設(shè)置各種限流規(guī)則,并將設(shè)置好的規(guī)則發(fā)送到規(guī)則配置中心后,再有服務(wù)器將規(guī)則推送到相關(guān)的Sentinel客戶端,讓設(shè)置的規(guī)則最終在應(yīng)用運(yùn)行狀態(tài)是時快速生效。
三、Sentinel 降級的實(shí)現(xiàn)原理
Sentinel平臺除了限流的核心功能外,還提供了降級的功能。我們知道,在服務(wù)調(diào)用鏈上,存在服務(wù)間的強(qiáng)弱依賴,即有些業(yè)務(wù)請求處理過程中,有些服務(wù)是否正常被調(diào)研或成功處理了服務(wù)請求,對于整個業(yè)務(wù)請求不會產(chǎn)生決定性的影響,比如交易鏈路中快遞優(yōu)惠這個服務(wù),這類服務(wù)調(diào)用鏈中就會標(biāo)記為弱依賴的服務(wù)。
設(shè)想一下,如果在雙11活動啟動后,大量的用戶訂單請求涌入平臺,此時發(fā)現(xiàn)平臺的整體水位已經(jīng)像平臺最大處理能力的水位逼近時,除了限流可以起到第一層的保護(hù)作用外,我們還可以將那些之前標(biāo)記為弱依賴的服務(wù)平滑下線,也就是讓訂單創(chuàng)建的處理流程中去掉那些弱依賴的服務(wù)調(diào)用,達(dá)到將節(jié)省出的系統(tǒng)資源更好地服務(wù)于核心服務(wù)的運(yùn)行;又或者在大促時,某核心服務(wù)依賴某一個非核心的服務(wù),但發(fā)現(xiàn)因?yàn)檫@個非核心服務(wù)的處理性能和服務(wù)響應(yīng)時間較長,導(dǎo)致了當(dāng)前核心服務(wù)的處理出現(xiàn)了瓶頸,這時為了保證核心服務(wù)的正常處理,就需要在核心服務(wù)業(yè)務(wù)邏輯中對于那個非核心服務(wù)的調(diào)用暫時停止。這樣類似的場景就稱為服務(wù)降級,即從服務(wù)調(diào)用者的角度,對所依賴的下游服務(wù)采取停止調(diào)用的措施,以保證當(dāng)前服務(wù)的處理效率。
要實(shí)現(xiàn)服務(wù)降級,需要在應(yīng)用或服務(wù)實(shí)現(xiàn)中,首先留下可供服務(wù)降級進(jìn)行服務(wù)是否調(diào)用切換的邏輯。一般在代碼中采用static值的方式,作為業(yè)務(wù)邏輯分支的判斷條件,通過對這些static值的修改,實(shí)現(xiàn)服務(wù)調(diào)用邏輯的變化。同樣可以通過Sentinel控制臺提供的降級規(guī)則的配置功能,當(dāng)對某個服務(wù)的方法響應(yīng)時間一旦超過閥值后,就意味著調(diào)用的這個服務(wù)已經(jīng)出現(xiàn)了處理性能的問題,則會自動切換到降級模式,降級持續(xù)的時間可自定義設(shè)置。
四、Sentinel 限流的實(shí)現(xiàn)原理
總結(jié)來說,Sentinel平臺所提供的限流和降級功能,是今天阿里巴巴集團(tuán)如此龐大、復(fù)雜的服務(wù)化平臺穩(wěn)定運(yùn)行的關(guān)鍵,不管是在雙11這樣的大促活動中,還是幾乎每天都有基于服務(wù)化體系構(gòu)建起來的新興業(yè)務(wù)上線,整個服務(wù)化平臺能夠穩(wěn)定運(yùn)行直觀重要。從技術(shù)角度來說,企業(yè)如果要構(gòu)建自身的服務(wù)化平臺,如何保障平臺穩(wěn)定性運(yùn)行的重要能力是服務(wù)化平臺建設(shè)中一定要考慮的問題。
限流和降級是從服務(wù)自身做好保護(hù)的角度來避免平臺級的故障。在分布式服務(wù)環(huán)境下,
我們不可忽略的一個問題是最大程度的增加機(jī)器的利用率,通常會采用超配的方式,但這個過程中往往會出現(xiàn)超配服務(wù)器上的應(yīng)用對資源進(jìn)行爭搶,使得個別或局部應(yīng)用出現(xiàn)服務(wù)響應(yīng)慢甚至掛起,從而給整個業(yè)務(wù)鏈路帶來更大的風(fēng)險(xiǎn)的情況。此時,流量調(diào)度的角色是至關(guān)重要的。下一期我們將從流量調(diào)度的角度看看如何提升平臺的穩(wěn)定性。