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