Envoy Rate limit 介紹

Chung-chun Lo
Skyler Record
Published in
5 min readJan 28, 2023

Envoy 當作 Proxy 當然少不了 Rate limit 的功能,首先我們先來談談什麼是 Reat limit。

Rate limit 是一種網絡安全技術,用於限制特定IP地址或用戶在特定時間內能夠發出的請求數量。這種技術可以用於防止大量請求對服務器帶來壓力,保護服務器免受攻擊。

在實現 Rate limit 時,通常會使用以下兩種算法:

  • Leaky bucket:將請求放入漏桶中,漏桶的容量為限制的請求數。當請求超過限制時,則拒絕請求。
  • Token bucket:將 token 放入桶中,桶的容量為限制的請求數。當請求到達時,如果桶中有足夠的令牌,則允許請求,否則拒絕請求。

在使用 rate limit 時,還需要考慮以下幾個重要的參數:

  • 限制的請求數:即在特定時間內允許的最大請求數。
  • 限制的時間窗口:即在特定時間內限制請求數。
  • 循環速率:即在指定時間內重置限制的請求數。

在 Envoy 中 Rate limit 主要分為兩種:

  • Global Rate limit:主要可針對 network level 和 http level 進行限制,如果要使用 Global Rate limit 需要額外連接一個 rate limit server。
  • Local Rate limit:可針對單一的 route 進行限制,採用的是 token bucket 機制並且不需要額外連接 rate limit server

Local Rate Limit

先來看一段官方 sandbox 的範例

route:
cluster: service
typed_per_filter_config:
envoy.filters.http.local_ratelimit: "@type": type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
stat_prefix: http_local_rate_limiter
token_bucket:
max_tokens: 2
tokens_per_fill: 2
fill_interval: 5s
filter_enabled:
runtime_key: local_rate_limit_enabled
default_value:
numerator: 100
denominator: HUNDRED
filter_enforced:
runtime_key: local_rate_limit_enforced
default_value:
numerator: 100
denominator: HUNDRED
response_headers_to_add:
- append_action: OVERWRITE_IF_EXISTS_OR_ADD
header:
key: x-local-rate-limit
value: 'true'

有關 token bucket 的欄位意義如下

  • max_tokens:token bucket 的最大值,也是一開始所具備的 token 數量
  • tokens_per_fill:token bucket 每次填充的 token 數量
  • fill_interval:填充 token 的時間間隔

filter_enable 代表是否要啟用 filter 如啟用的話對於 request 檢查 rate limit 的百分比為多少,filter_enable 只是啟用並統計但並不會強制執行 rate limit 限制,默認為 0。

filter_enforced 代表強制執行 rate limit 的 request 的百分比,默認為 0。

當我們做了以上的設定後等於五秒內只能有兩筆 request ,這時如果在五秒內發出五筆 request 會發現只有前面兩筆 request 可以正常執行,剩下的皆被 rate limit 阻擋。

❯ for i in {1..5}; do curl -si localhost:10000 | grep -E "x-local-rate-limit|429|local_rate_limited"; done
HTTP/1.1 429 Too Many Requests
x-local-rate-limit: true
local_rate_limited
HTTP/1.1 429 Too Many Requests
x-local-rate-limit: true
local_rate_limited
HTTP/1.1 429 Too Many Requests
x-local-rate-limit: true
local_rate_limited

使用 Envoy 官網 SandBox 範例可以讓我們更加的清楚 local rate limit 的運作方式,今天的 rate limit 先介紹到這裡,下次我們再來談談 envoy 的 global rate limit。

參考文章

--

--