天天看點

如何利用 “叢集流控” 保障微服務的穩定性?

随着業務從單體架構向分布式架構演進以及部署方式的變化,服務之間的依賴關系變得越來越複雜,業務系統也面臨着巨大的高可用挑戰。

作者:宿何

微服務的穩定性一直是開發者非常關注的話題。随着業務從單體架構向分布式架構演進以及部署方式的變化,服務之間的依賴關系變得越來越複雜,業務系統也面臨着巨大的高可用挑戰。應用高可用服務 AHAS (Application High Availability Service) 是經阿裡巴巴内部多年高可用體系沉澱下來的雲産品,以流量與容錯為切入點,從流量控制、不穩定調用隔離、熔斷降級、熱點流量防護、系統自适應保護、叢集流控等多個次元來幫助保障服務的穩定性,同時提供秒級的流量監控分析功能。AHAS 不僅在阿裡内部淘寶、天貓等電商領域有着廣泛的應用,在網際網路金融、線上教育、遊戲、直播行業和其他大型政央企行業也有着大量的實踐。

如何利用 “叢集流控” 保障微服務的穩定性?

流控是保障微服務穩定性最常用也是最直接的一種控制手段。每個系統、服務都有其能承載的容量上限,流控的思路非常簡單,當某個接口的請求 QPS 超出一定的上限後,拒絕多餘的請求,防止系統被突發的流量打垮。市面上最常見的方案是單機次元的流控,比如通過 PTS 性能測試預估某個接口的容量上限是 100 QPS,服務有 10 個執行個體,則配置單機流控 10 QPS。但很多時候,由于流量分布的不确定性,單機次元的流量控制存在一些效果不佳的情況。

如何利用 “叢集流控” 保障微服務的穩定性?

場景: 服務 A 需要頻繁調用服務 B 的查詢接口,但服務 A 和 B 的容量存在差異,服務 B 約定最多給服務 A 提供總共 600 QPS 的查詢能力,通過流控等手段進行控制。

痛點: 若按照單機流控的政策配置,由于調用邏輯、負載均衡政策等原因,A 調用 B 到達每個執行個體的流量分布可能非常不均,部分流量較大的服務 B 執行個體觸發單機流控,但總體限制量尚未達到,導緻 SLA 未達标。這種不均的情況經常會發生在調用某個依賴服務或元件(如資料庫通路)的時候,這也是叢集流控的一個典型場景:精确控制微服務叢集對下遊服務(或資料庫、緩存)的調用總量。

如何利用 “叢集流控” 保障微服務的穩定性?

場景: 在 Nginx/Ingress 網關、API Gateway (Spring Cloud Gateway, Zuul) 進行入口流量控制,希望精确控制某個或某組 API 的流量來起到提前保護作用,多餘流量不會打到後端系統。

痛點: 如果按照單機次元配置,一方面不好感覺網關機器數變化,另一方面網關流量不均可能導緻限流效果不佳;而且從網關入口角度來講,配置總體門檻值是最自然的手段。

AHAS 叢集流控可以精确地控制某個服務接口在整個叢集的實時調用總量,可以解決單機流控因流量不均勻、機器數頻繁變動、均攤門檻值太小導緻限流效果不佳的問題,結合單機流控兜底,更好地發揮流量防護的效果。

對于上面的場景,通過 AHAS 叢集流控,無論是 Dubbo 服務調用、Web API 通路,還是自定義的業務邏輯,均支援精确控制調用總量,而無關調用邏輯、流量分布情況、執行個體分布。既可以支撐數十萬 QPS 大流量控制,也支援分鐘小時級業務次元小流量精确控制。防護觸發後的行為可由使用者自定義(如傳回自定義的内容、對象)。

AHAS 叢集防護具有以下幾大優勢:

場景豐富: 全面覆寫從網關/Mesh 入口流量精确防護、Web/RPC 服務/SQL 調用精确流控,到分鐘小時級業務次元流量控制的場景,支援數十萬 QPS 量級;

低使用成本: 無需特殊接入方式,開箱即用,快速配置;

全自動管控與運維: 自動化管控與配置設定 token server 資源,自動化運維能力保障可用性,使用者無需關注服務端資源準備與配置設定,隻需關注規則配置與業務流程;

低性能損耗: 性能模式下對業務鍊路完全無時延增加,精确模式對業務鍊路的 RT 損耗控制在 3ms 之内,使用者可放心使用;

配套的可觀測能力, 實時了解接口穩定性與規則生效情況。

下面我們就來用一個示例來介紹一下,如何快速将應用接入 AHAS 來玩轉叢集流控能力,保障服務穩定性。

第一步,我們将服務或網關接入 AHAS 流量防護。AHAS 提供多種快速便捷的無侵入接入手段:

如何利用 “叢集流控” 保障微服務的穩定性?

AHAS 流量防護支援 Java/Go/C++/PHP 等多語言原生接入,以及 Nginx/Ingress 網關接入和 Mesh 接入;Java 應用支援全方位的 20+ 種微服務架構/元件(詳情見文末相關連結):

Web 服務端:Spring Web/Spring Boot/Spring Cloud/Tomcat/Jetty/Undertow

Web client:OkHttp/Apache HttpClient

RPC:Dubbo/Feign/gRPC

DAO/緩存:MyBatis/Spring Data JPA/Memcached/Jedis client

MQ consumer:RocketMQ client/Kafka client/RocketMQ client

API Gateway:Spring Cloud Gateway/Zuul 1.x

Reactor 架構

接入 AHAS 成功後,隻要觸發服務調用/接口通路,即可在 AHAS 控制台(詳情見文末相關連結)看到自己的服務,并可以在監控頁面看到自己的接口:

如何利用 “叢集流控” 保障微服務的穩定性?

第二步,我們在應用左側菜單的“叢集流控-叢集配置”頁面,開啟叢集流控功能。測試應用我們可以開啟“試用”叢集,不同的叢集規格可以承載不同的 QPS 量級:

如何利用 “叢集流控” 保障微服務的穩定性?

第三步,我們在實時監控頁面找一個接口,點選右上角的“+”号,新增流控規則(詳情見文末相關連結)。以下示例中,我們對 /doSomething 這個接口配置叢集流控規則,這個接口總的通路量每秒鐘不超過 200 次。規則狀态為“開啟”,代表新增後實時生效。

如何利用 “叢集流控” 保障微服務的穩定性?

點選下一步,我們還可以給選擇的 Web/RPC 調用配置防護規則觸發後的處理邏輯(詳情見文末相關連結),如自定義傳回值。最終配置完成後,我們點選新增按鈕,這條規則就會生效到每個節點。

配置完畢後,我們可以向應用叢集中不同機器發起一定數量的該接口請求,可以發現每秒鐘超過 200 個請求後會自動傳回我們在規則中預設好的傳回行為;同時控制台實時監控頁面也可以看到,多餘的流量被拒絕,接口每秒鐘通過的總量級平穩在 200 QPS:

如何利用 “叢集流控” 保障微服務的穩定性?

通過幾步簡單的配置,我們就可以快速體驗 AHAS 叢集流控給業務流量帶來“如絲般順滑”的保護能力;同時最近 AHAS 還新上線 Nginx/Ingress 網關入口流量防護、Web 請求參數流控(詳情見文末相關連結)等核心功能,歡迎大家點選閱讀原文,在前往 AHAS 控制台進行快速體驗。

相關連結

1)全方位的 20+ 種微服務架構/元件:

https://help.aliyun.com/document_detail/128800.html

2)AHAS 控制台:

https://common-buy.aliyun.com/?commodityCode=ahas_001#/buy

3)新增流控規則:

https://help.aliyun.com/document_detail/174871.html

*4)防護規則觸發後的處理邏輯

https://help.aliyun.com/document_detail/290938.html*

*5)Nginx/Ingress 網關入口流量防護

https://help.aliyun.com/document_detail/209640.html*

*6)Web 請求參數流控

https://help.aliyun.com/document_detail/337922.html*

繼續閱讀