全部產品
Search
文件中心

Alibaba Cloud Service Mesh:限流防護

更新時間:Jun 30, 2024

在面臨高流量衝擊、服務過載、資源耗盡或惡意攻擊的情況下,通過配置限流防護,可以實現對流量的精準控制,從而保護後端服務的穩定性,降低成本並提升使用者體驗。本文介紹限流防護的概念、限流方式以及本地限流和全域限流的實現原理。

限流防護的概念

限流防護是一種限制發送到服務端的請求數量的機制。它指定用戶端在給定時間段內可以向服務端發送的最大請求數,通常表示為一段時間內的請求數,例如每分鐘300個請求或每秒10個請求等。限流的目的是防止服務因來自同一用戶端IP或來自任何用戶端的全域請求而過載。

以每分鐘300個請求的限流機製為例,向服務發送301個請求,限流器將拒絕第301個請求。同時,限流器會返回一個429 HTTP狀態代碼(Too Many Requests),並在請求到達服務之前進行拒絕。

限流防護的方式

網格代理Envoy支援兩種類型的限流防護方式:本地限流和全域限流。本地限流用於限制每個服務執行個體的請求速率。全域限流使用全域的gRPC服務為整個網格提供限流能力。本地限流可以與全域限流結合使用,以提供不同層面的限流功能。

方式

說明

相關文檔

本地限流

  • 基於每個Envoy進程配置,即每個注入了Envoy代理的Pod。相比全域限流來說,本地限流的配置更簡單,不需要額外的組件。本地限流的優先順序高於全域限流,當同時使用本地速率限制器和全域速率限制器時,首先應用本地速率限制器進行限制,如果未達到本地速率限制,則應用全域速率限制器進行限制。樣本情境如下:

    • 假設本地限流對特定用戶端IP的要求節流為每分鐘50個請求,全域要求節流數為每分鐘60個請求。用戶端發送超過50個請求,則本地限流將拒絕該請求,即使全域限流尚未達到限制。

    • 假設本地限流對特定用戶端IP的要求節流為每分鐘50個請求,全域要求節流數為每分鐘40個請求。用戶端發送超過40個請求,雖然未達到本地限流,但是已達到全域限流,因此該請求被拒絕。

  • 本地限流如果有多個副本,則每個副本都有各自的速率限制器,也就是說如果您在一個副本上被限流,在另一個副本上可能不會被限流。

在流量管理中心配置本地限流

全域(或分布式)限流

  • 允許跨多個服務對請求進行請求速率限制,這種方式基於叢集中所有服務共用集中的限流服務實現。通常這種全域限流服務需要一個外部組件,例如Redis資料庫等。

  • 全域限流的典型用例是當多個請求端向較少數量的服務端發送請求時,在這種情況下,多個客戶請求端可能會壓垮服務端,而全域限流可以協助防止級聯故障。例如,您可以在入口網關配置全域限流,並控制進入網格的請求總數。一旦這些請求在網格內時,您可以使用本地限流來管理髮送到特定服務的請求數量。

使用ASMGlobalRateLimiter對應用服務入口流量配置全域限流

本地限流的工作原理

Envoy代理使用令牌桶演算法實現本地限流。令牌桶演算法是一種限制發送到服務端的請求數量的方法,基於一定數量的令牌桶。儲存桶以恒定的速率不斷填充令牌,當向服務發送請求時,會從儲存桶中刪除一個令牌。如果儲存桶為空白,則請求將被拒絕。通常需要指定以下內容:

  • 桶被填充的速率(填充間隔)。

  • 每個填充間隔添加到桶中的令牌數。

預設情況下,當速率限制器拒絕請求,並設定x-envoy-ratelimited響應標題時,Envoy會發送狀態代碼為429的HTTP響應。您也可以將速率限制器配置為返回自訂HTTP狀態碼,並配置其他響應標題。

此外,使用速率限制器有以下兩個重要概念:

  • 啟用速率限制器:表示正在對速率限制器進行配置,但速率限制器並未應用於請求。

  • 執行速率限制器:表示對請求應用或執行速率限制器。

將這兩個值表示為傳入請求的百分比,例如可以設定為10%的請求啟用速率限制器,並為5%的請求強制執行。按照這種方式,可以逐步推出限流,並在對所有請求強制執行之前對其進行測試。

全域限流的工作原理

在Envoy代理中,全域限流是一種用於控制整個服務網格中請求速率的機制。它基於Envoy的限流服務(Rate Limit Service)實現。該服務可以集中處理來自整個服務網格中的流量,並根據預先定義的規則和配額來限制請求的速率。

全域限流的配置涉及兩個部分:Envoy的rate_limits過濾器和限流服務的配置。

  • rate_limits過濾器中包含actions列表。Envoy會嘗試將每個請求與rate_limits過濾器中的每個action進行匹配。每個action會產生一個descriptor描述符。描述符是與action對應的一組描述符條目。每個描述符條目是一個索引值對,通常表示為"descriptor-key-1": "descriptor-value-1""descriptor-key-2": "descriptor-value-2"等形式。更多資訊,請參見config-http-filters-rate-limit

  • 限流服務的配置則能夠匹配每個請求所產生的描述符條目。針對特定的一組描述符條目,限流服務的配置能夠指定其對應的請求速率限制。限流服務通過與Redis緩衝互動來決定是否對請求進行限流,並將限流決策響應給Envoy代理。

通過結合rate_limits過濾器和限流服務的配置,可以實現全域限流策略。rate_limits過濾器根據配置的action產生描述符,並將其發送到限流服務。限流服務根據描述符的資訊來決定特定的限制,並返回相應的限流響應。這樣的配置能夠全面控制請求的速率,保護後端服務免受突發高負載請求的影響。