速率限制是一種簡單但非常有效的技術,用于保護API免遭無意和惡意的過度使用。如果沒有速率限制,任何人都可以用請求轟炸服務器并導致吞噬資源的流量高峰,“餓死”其他用戶,并使服務無響應。本文介紹了速率限制以及限制到達 API 和服務的請求數量的重要性。我們解釋什么是速率限制及其工作原理,并介紹可用于為您的用例采用速率限制的不同類型的算法。
速率限制是限制用戶可以對特定 API 或服務發出的請求數量的做法。您可以限制用戶在特定時間范圍內重復執行某項操作(即嘗試登錄帳戶或發送消息)的頻率。如果有人達到他們的限制,服務器將開始拒絕其他請求。速率限制既是網絡安全預防措施,也是軟件質量保證 (QA)的關鍵部分。公司使用速率限制來:
從技術上講,速率限制是流量整形的一種形式。這種做法讓您可以控制流量的流動和分配,以防止基礎設施過載或出現故障。大多數具有速率限制的系統的上限都遠高于即使是高容量用戶也可以實際要求的上限。最常見的例子是社交媒體消息傳遞。所有社交媒體網站都對您可以發送給其他用戶的直接消息的數量設置了上限。如果有人決定向其他配置文件發送一千條消息,速率限制就會啟動并阻止用戶在一段時間內發送消息。
以下列出了為什么速率限制是任何健康服務的重要方面的主要原因:
為了設置速率限制,管理員對用戶在特定時間范圍內可以向服務器或 API 發出的請求數量設置上限。通常,限速機制跟蹤兩個關鍵因素:
速率限制的主要指標是每秒事務數 (TPS)。如果單個 IP 地址在特定時間段內發出過多請求(即超過其 TPS 限制),則速率限制會阻止服務器或 API 響應。用戶收到一條錯誤消息,并且在計時器重置之前無法發送進一步的請求。
速率限制總是依賴于某種形式的節流機制來減慢或阻止請求。管理員在服務器端或客戶端實施速率限制,具體取決于哪種策略更適合用例:
許多管理員還根據用戶名設置速率限制。這種方法可以防止暴力攻擊者嘗試從多個 IP 地址登錄。
讓我們看看可用于控制對服務器或 API 的訪問的不同類型的速率限制。請記住,您可以將不同類型組合成一個混合策略。例如,您可以限制基于 IP 地址和特定時間間隔的請求數量。
基于時間的速率限制
基于時間的速率限制在預定義的時間間隔上運行。例如,服務器可以將請求限制為每個時間段的特定數量(例如每分鐘 100 個)。基于時間的速率限制通常適用于所有用戶。您可以將這些限制設置為固定(計時器倒計時,無論用戶何時以及是否提出請求)或滑動(倒計時在有人發出第一個請求時開始)。
地理速率限制
地理速率限制限制來自特定區域的請求數量。在運行基于位置的廣告系列時,這些上限是一個很好的選擇。管理員可以限制來自目標受眾之外的請求并提高目標區域的可用性。
這些速率限制也有助于防止可疑流量。例如,您可以預測某個地區的用戶在晚上 11:00 到早上 8:00 之間不太活躍。您為這次設置了較低的速率限制,這進一步限制了任何希望引起惡意流量問題的攻擊者。
基于用戶的速率限制
基于用戶的速率限制控制單個用戶在特定時間范圍內可以執行的操作數。例如,服務器可能會將每個用戶每天可以進行的登錄嘗試次數限制為 100 次。
基于用戶的限制是最常見的速率限制類型。大多數系統跟蹤用戶的 IP 地址或 API 密鑰(或兩者)。如果用戶超過設定的速率限制,應用程序會拒絕任何進一步的請求,直到每用戶計數器重置。請記住,這種類型的速率限制需要系統維護每個用戶的使用統計信息。此類設置通常會導致運營開銷并增加總體IT 成本。
并發率限制
并發率限制控制系統在特定時間范圍內允許的并行會話數。例如,一個應用程序可能會在一分鐘內阻止超過 1000 個會話。
服務器速率限制
服務器速率限制可幫助管理員在不同服務器之間分擔工作負載。例如,如果您運行一個包含五臺服務器的分布式架構,您可以使用速率限制為每臺設備設置一個上限。
如果其中一臺服務器達到其上限,則設備會將其路由到另一臺服務器或丟棄請求。這種策略對于實現高可用性和防止針對特定服務器的 DoS 攻擊至關重要。
API 基于端點的速率限制
這些速率限制基于用戶嘗試訪問的特定 API 端點。例如,出于安全或過載考慮,管理員可能會將對特定端點的請求限制為每分鐘 50 個。
速率限制算法
以下是公司實施速率限制所依賴的最常見算法:
以下是實施速率限制的分步指南(盡管設置限制的確切方式取決于您的特定技術棧):
對于大多數用例來說,實施速率限制是一個簡單的過程。例如,如果您使用 Nginx 作為 Web 服務器并希望在服務器級別設置速率限制,您將使用 ngx_http_limit_req_module模塊。只需將以下代碼添加到 Nginx 配置文件中,即可根據用戶的 IP 地址設置速率限制:
HTTP { limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s; ... 服務器 { ... 位置/促銷/ { limit_req zone=one burst=5; } }
上面的代碼平均每秒允許不超過 2 個請求,而突發不能超過 5 個請求。
速率限制對于 API、應用程序和網站的安全性和質量至關重要。未能限制請求數量會使您容易受到基于流量的攻擊并導致性能不佳(這會導致更高的跳出率、客戶保留問題等)。考慮到實施此預防措施有多么容易,對于大多數用例來說,設置速率限制是一個無需動腦筋的決定。