[推薦] Rate Limiting
Source
https://www.youtube.com/watch?v=8QyygfIloMc 19:59
Summary
- 流量限制是一種控制服務處理流量速率的方法,透過封鎖在特定時間內超過設定限制的請求來實現。這樣做的目的是為了防止單一使用者壟斷資源,例如阻止垃圾訊息洗版、防止登入表單被暴力破解嘗試密碼,或是限制使用者對昂貴 API 端點的存取次數。
- 主要有 3 種演算法
- 固定窗口法(Fixed Window):設定一個固定的時間窗口(如每小時)和允許的請求次數。每次請求增加計數器,新窗口開始時計數器重設為 0。其優點是簡單,但缺點是窗口邊緣可能允許接近兩倍限制的突發流量,且在分佈式系統中可能因時區或同步問題導致窗口邊界不一致。
- 滑動窗口法(Sliding Window):滑動窗口法記錄每個請求的時間戳記,並計算過去某段時間(例如過去 1 小時)內的請求總數,以決定是否允許新請求。它能平滑流量分佈,適合高流量場景,但需要儲存時間戳記,實現複雜且資源密集。
- 令牌桶法(Token Bucket):想像一個桶子以固定速率填充令牌,每個請求消耗一個令牌,當桶子為空時,新請求會被拒絕。它支援突發流量,同時限制長期速率,靈活且適合多種場景,但對用戶來說預測可用請求時間較難,實現也較複雜。
- 為了應付水平擴展或是伺服器重啟的情境,應實作 fail open:如果與持久儲存的連線失敗,應允許所有請求通過,而不是完全封鎖服務
- 在區別每個請求的 source 時也應該選擇有意義的 key 值(如使用者 ID、API 鍵、IP 地址),且請求失敗也應返回有意義的訊息,例如
Http 429
以及Retry-After
標頭
發佈時間
2025-5-6