1. 程式人生 > >限流和降級(下) | 如何打造平臺穩定性能力(二)

限流和降級(下) | 如何打造平臺穩定性能力(二)

監控系統 兩個 服務業 流程 成功 ron href 統計 整體

摘要: 上一期我們談到了阿裏巴巴早期是通過通過在 Nginx 上實現的擴展組件TMD(taobao missile defense淘寶×××防禦系統)實現了接入層限流的主要工作,TMD系統可通過域名類限流、cookie限流、黑名單以及一些安全策略等很好的實現了在接入層的限流措施。

上一期我們談到了阿裏巴巴早期是通過通過在 Nginx 上實現的擴展組件TMD(taobao missile defense淘寶×××防禦系統)實現了接入層限流的主要工作,TMD系統可通過域名類限流、cookie限流、黑名單以及一些安全策略等很好的實現了在接入層的限流措施。

但對於服務層,TMD就無能為力了。對於實現服務的限流控制,傳統的實現方式通常用spring的AOP機制,對需要限流的接口定義一個advice攔截器,但這套方案在實際應用場景中還是會發現不少問題。

一、Sentinel 簡介
第二期我們將分享到阿裏巴巴是如何解決服務層限流時遇到的問題的。在今年7月底的Aliware Open Sourec深圳站的活動上,阿裏巴巴宣布開源面向分布式服務架構的輕量級限流降級框架 Sentinel。Sentinel正如它英文的意思“哨兵”一樣,為整個服務化體系的穩定運行行使著警戒任務,是對資源調用的控制平臺,主要涵蓋了授權、限流、降級、調用統計監控四大功能。

授權:通過配置白名單和黑名單的方式分布式系統的接口和方法進行調用權限的控制;
限流:對特定資源進行調用的保護,防止資源的過度使用;
降級:判斷依賴的資源的響應情況,但依賴的資源響應時間過長時進行自動降級,並且在指定的時間後自動恢復調用;

監控:提供了全面的運行狀態監控,實時監控資源的調用情況,如QPS、響應時間、限流降級等信息;
Sentinel 平臺有兩個基礎概念,資源和策略,對特定的資源采取不同的控制策略,起到保障應用穩定性的作用。Sentinel 提供了多個默認切入點,比如服務調用時,數據庫、緩存等資源訪問時,覆蓋了大部分應用場景,保證對應用的低侵入性,同時也支持硬編碼或者自定義AOP的方式來支持特定的使用需求。

二、Sentinel 限流的實現原理
Sentinel 平臺架構圖如下,需要通過Sentinel 實現限流功能的應用中都嵌入Sentinel 客戶端,通過Sentinel 客戶端中提供對服務調用和各資源訪問缺省實現的切入點,使得應用完全不需要對實現限流的服務或資源進行單獨的AOP配置和實現,同時不僅可以限制自己的應用調用別的應用,也可以限制別的應用調用我的應用。通過這些資源埋點實時計算當前服務的QPS,也可通過現有的監控系統獲取到應用所在服務器的相關系統監控指標,用於限流規則配置中的閥值比對。

技術分享圖片

?Sentinel 平臺架構示意圖

Sentinel控制臺會從客戶端拉取資源實時的運行監控數據如QPS、響應時間等,並展示在控制臺的監控面板上。控制臺給運維人員提供了針對服務、緩存、數據庫等資源訪問設置各種限流規則,並將設置好的規則發送到規則配置中心後,再有服務器將規則推送到相關的Sentinel客戶端,讓設置的規則最終在應用運行狀態是時快速生效。

三、Sentinel 降級的實現原理
Sentinel平臺除了限流的核心功能外,還提供了降級的功能。我們知道,在服務調用鏈上,存在服務間的強弱依賴,即有些業務請求處理過程中,有些服務是否正常被調研或成功處理了服務請求,對於整個業務請求不會產生決定性的影響,比如交易鏈路中快遞優惠這個服務,這類服務調用鏈中就會標記為弱依賴的服務。

設想一下,如果在雙11活動啟動後,大量的用戶訂單請求湧入平臺,此時發現平臺的整體水位已經像平臺最大處理能力的水位逼近時,除了限流可以起到第一層的保護作用外,我們還可以將那些之前標記為弱依賴的服務平滑下線,也就是讓訂單創建的處理流程中去掉那些弱依賴的服務調用,達到將節省出的系統資源更好地服務於核心服務的運行;又或者在大促時,某核心服務依賴某一個非核心的服務,但發現因為這個非核心服務的處理性能和服務響應時間較長,導致了當前核心服務的處理出現了瓶頸,這時為了保證核心服務的正常處理,就需要在核心服務業務邏輯中對於那個非核心服務的調用暫時停止。這樣類似的場景就稱為服務降級,即從服務調用者的角度,對所依賴的下遊服務采取停止調用的措施,以保證當前服務的處理效率。

要實現服務降級,需要在應用或服務實現中,首先留下可供服務降級進行服務是否調用切換的邏輯。一般在代碼中采用static值的方式,作為業務邏輯分支的判斷條件,通過對這些static值的修改,實現服務調用邏輯的變化。同樣可以通過Sentinel控制臺提供的降級規則的配置功能,當對某個服務的方法響應時間一旦超過閥值後,就意味著調用的這個服務已經出現了處理性能的問題,則會自動切換到降級模式,降級持續的時間可自定義設置。

四、Sentinel 限流的實現原理
總結來說,Sentinel平臺所提供的限流和降級功能,是今天阿裏巴巴集團如此龐大、復雜的服務化平臺穩定運行的關鍵,不管是在雙11這樣的大促活動中,還是幾乎每天都有基於服務化體系構建起來的新興業務上線,整個服務化平臺能夠穩定運行直觀重要。從技術角度來說,企業如果要構建自身的服務化平臺,如何保障平臺穩定性運行的重要能力是服務化平臺建設中一定要考慮的問題。

限流和降級是從服務自身做好保護的角度來避免平臺級的故障。在分布式服務環境下, 我們不可忽略的一個問題是最大程度的增加機器的利用率,通常會采用超配的方式,但這個過程中往往會出現超配服務器上的應用對資源進行爭搶,使得個別或局部應用出現服務響應慢甚至掛起,從而給整個業務鏈路帶來更大的風險的情況。此時,流量調度的角色是至關重要的。下一期我們將從流量調度的角度看看如何提升平臺的穩定性。

原文鏈接

本文為雲棲社區原創內容,未經允許不得轉載。

限流和降級(下) | 如何打造平臺穩定性能力(二)