本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
速率限制強制執行
本主題說明閘道如何在執行時間評估和強制執行速率限制,包括與其他閘道功能的互動、限流回應格式和可觀測性。
與閘道規則的互動
閘道會在閘道規則之前評估速率限制。如果速率限制調節請求,請求永遠不會到達規則評估階段。
堆疊語意
當請求套用多個速率限制時,閘道會使用 AND 邏輯 — 所有速率限制都必須通過才能繼續請求。如果任何單一速率限制拒絕請求,閘道會調節請求。
項目比對和特異性
當速率限制有多個項目時,閘道會為解析的維度值選取最特定的相符項目:
-
精確的值比對優先於
*項目。 -
*值表示「將此速率套用至此維度的所有值」,它充當預設項目。 -
對於多維度速率限制,閘道會使用漸進式結尾退避:它會先嘗試完全相符,然後一次以
*一個維度取代結尾維度,直到找到相符項目為止。
下列範例顯示解析值為 dimensionKeys: ["targetName", "toolName"]時,項目如何與 比對速率限制["my-target", "readData"]:
| 項目維度 | 相符項目? | 為什麼 |
|---|---|---|
|
|
是 (先勾選) |
兩個維度完全相符。最具體。 |
|
|
是 (檢查秒數) |
第一個維度的完全相符,第二個維 |
|
|
是 (最後勾選) |
預設項目。最不具體。 |
第一個相符的項目獲勝。如果沒有符合的項目 (且不存在*預設值),則會略過該請求的速率限制。
評估順序
閘道會依下列順序評估速率限制:
-
閘道會先使用更多維度索引鍵評估速率限制 (更具體的限制優先)。
-
在相同數量的維度內,閘道會先以更緊密 (較低) 的速率評估速率限制。
-
第一次拒絕時評估短路 — 閘道不會評估剩餘速率限制。
與服務受管限制的互動
閘道會強制執行客戶定義的費率限制和服務受管限制。任何請求的有效速率都是兩者的最低值:
-
閘道會先評估客戶定義的速率限制。
-
如果請求通過客戶限制,則會評估服務受管限制。
-
從任一來源拒絕會導致限流。
調節回應
調節請求時,閘道會傳回通訊協定特定的錯誤回應,其中包含回應內文中的retryAfter值。
HTTP 通訊協定:
{ "error": "Rate limit exceeded", "success": false, "limitKey": "rl-abc123/targetName=my-target", "metric": "requests", "retryAfter": 1 }
MCP 通訊協定 (JSON-RPC):
{ "jsonrpc": "2.0", "id": "request-1", "error": { "code": -32003, "message": "Rate limit exceeded", "data": { "limitKey": "rl-abc123/targetName=my-target", "metric": "requests", "retryAfter": 1 } } }
OpenAI 相容通訊協定:
{ "error": { "message": "Rate limit exceeded", "type": "rate_limit_error", "code": "429", "limitKey": "rl-abc123/qualifiedModelId=anthropic.claude-3-sonnet", "metric": "tokens", "retryAfter": 60 } }
人類相容通訊協定:
{ "type": "error", "error": { "type": "rate_limit_error", "message": "Rate limit exceeded", "limitKey": "rl-abc123/qualifiedModelId=anthropic.claude-3-sonnet", "metric": "tokens", "retryAfter": 60 } }
retryAfter 欄位指出發起人在重試之前應該等待多少秒。直接在用戶端重試邏輯中使用此值。
傳播時間
速率限制變更 (建立、更新、刪除) 會在 30 秒內傳播到資料平面。在傳播期間:
-
在傳播完成之前,不會強制執行新的速率限制。
-
更新速率限制會繼續強制執行先前的組態,直到更新傳播為止。
-
刪除的速率限制會繼續強制執行,直到刪除傳播為止。
強制執行準確性和最終一致性
速率限制強制執行最終是一致的,而不是確切的。強制執行準確性是在限制開始接收流量後大約的時刻,並且會隨著流量的持續而改善。因此,您觀察到的準確性取決於您的流量模式。
預期會發生下列行為:
-
冷限制一開始會過度允許。冷限制是新建立或沒有最近流量的冷限制。在短暫的初始期間內,閘道可能會在強制執行收斂之前過度認可 (允許比設定速率更多的請求)。一旦限制低於連續流量,準確度就會提高,並且觀察到的調節速率會趨近於設定的速率。
-
持續的流量會準確強制執行,但短暫爆量可能不會強制執行。針對冷限制的短暫暴增可以通過,而不會受到調節。系統會強制執行與持續流量相同的傳送速率,因為準確度會隨著限制暖機而提高。若要觀察或示範強制執行,請將持續流量傳送至限制幾分鐘,而不是單一短暫高載。例如,對於每秒 4 個請求的限制,閘道可能不會調節第一秒的第 5 個請求。如果您持續每秒傳送 5 個請求,您會在限制暖機後持續看到額外請求受到調節。
-
非常低的速率不太準確。低於每秒大約 1 個請求的速率 (例如,requests-per-minute限制) 較難以精確強制執行,且會顯示更多可變性。偏好精確強制執行很重要的較高速率,並將非常低的限制視為近似值。
-
字符限制收斂速度較慢。只有在模型回應之後,Token-per-minute限制才會更新 (協調) 追蹤的用量總計。正在進行數秒或幾分鐘的請求只會保留預算的預估成本,直到完成為止。這會擴展閘道相對於請求限制可能會過度認可請求的時段。如需詳細資訊,請參閱字符速率限制常見問答集。
設計有關公平使用和後端保護的限制。這表示在持續的時段平滑爆增並保護目標免受雜訊鄰近,而不是在超過閾值時封鎖確切的請求號碼。速率限制不是精確的請求精確閘道。速率限制也不是安全界限,如下節所述。
故障開啟行為
閘道使用故障開啟語意進行速率限制評估。下表說明當速率限制系統發生錯誤時的行為:
| 案例 | 決策 | 理由 |
|---|---|---|
|
速率限制服務逾時 |
允許 |
可用性優先於強制執行。 |
|
維度索引鍵無法從請求中解析 |
略過 (允許) |
速率限制不適用於此請求類型。 |
|
速率限制快取重新整理失敗 |
使用過時的資料重試 |
使用上次已知組態,直到快取復原為止。 |
重要
由於故障開啟行為,請勿僅依賴速率限制做為安全界限。使用流量管理和服務品質的速率限制,並使用身分驗證、授權和 WAF 規則進行安全強制執行。
使用 OpenTelemetry 追蹤範圍
閘道會針對評估客戶費率限制的每個請求,在伺服器跨度上發出 OpenTelemetry (OTEL) 跨度屬性。使用這些屬性進行偵錯和監控。
| 屬性 | 說明 | 範例 |
|---|---|---|
|
|
此請求的強制執行決策。 |
|
|
|
拒絕請求的速率限制 |
|
|
|
已耗盡的指標類型。只有在決策為 時才會出現 |
|
|
|
觸發調節之項目的逗號分隔已解析維度值。只有在決策為 時才會出現 |
|
|
|
為此請求檢查的所有速率限制儲存貯體的排序清單。每個項目會顯示速率限制 ID、指標和已解析的維度值。同時代表 |
|
evaluated 即使允許, 屬性也有助於了解套用至請求的速率限制。清單中的每個項目都遵循格式 {rateLimitId}:{metric}:{resolvedDimVal1,dimVal2,…}。