

# REL05-BP02 限流請求
<a name="rel_mitigate_interaction_failure_throttle_requests"></a>

限流請求以減輕因需求非預期地增加而耗盡資源。系統會處理低於限流速率的請求，並拒絕超過定義限制的請求，且傳回一則訊息，指出請求已遭到限流。

 **預期成果：**由於客戶流量突然增加、洪水攻擊或重試風暴而造成的大量尖峰，可透過請求限流來緩解，讓工作負載能夠繼續正常處理支援的請求量。

 **常見的反模式：**
+  API 端點限流未實作或保留為預設值，而未考量預期的數量。
+  API 端點未經過負載測試，或未測試限流限制。
+  限流請求率，而不考量請求大小或複雜性。
+  測試請求率上限或請求大小上限，但不同時測試兩者。
+  資源不會佈建在測試時建立的相同限制。
+  未針對應用程式對應用程式 (A2A) API 取用者設定或考量使用計畫。
+  水平擴展的佇列取用者未進行最大並行設定。
+  未實作個別 IP 位址的速率限制。

 **建立此最佳實務的優勢：**設定限流限制的工作負載能夠在非預期的數量尖峰情況下正常運作，並成功處理已接受的請求負載。API 和佇列的請求若突然或持續激增將會受到限制，且不會耗盡請求處理資源。速率限制會限流個別請求者，使來自單一 IP 位址或 API 取用者的大量流量不會耗盡資源而影響到其他取用者。

 **未建立此最佳實務時的曝險等級：**高 

## 實作指引
<a name="implementation-guidance"></a>

 服務應設計為處理已知的請求容量；此容量可透過負載測試來建立。如果請求到達率超過限制，會有適當的回應訊號指出請求已受到限流。這可讓取用者處理錯誤並於稍後重試。

 當您的服務需要限流實作時，請考慮實作權杖儲存貯體演算法 (在此演算法中，權杖對於請求具重要性)。權杖會按每秒的限流率重新填入，並依照每個請求一個權杖的比例非同步清空。

![\[說明權杖儲存貯體演算法的圖表。\]](http://docs.aws.amazon.com/zh_tw/wellarchitected/latest/framework/images/token-bucket-algorithm.png)


 

 [Amazon API Gateway](https://aws.amazon.com/api-gateway/) 會根據帳戶和區域限制實作權杖儲存貯體演算法，並且可根據使用計畫對個別用戶端進行設定。此外，[Amazon Simple Queue Service (Amazon SQS)](https://aws.amazon.com/sqs/) 和 [Amazon Kinesis](https://aws.amazon.com/kinesis/) 可以緩衝請求以平滑請求速率，並為可解決的請求提供更高的限流。最後，可以使用 [AWS WAF](https://aws.amazon.com/waf/) 實作速率限制，以針對會產生異常高負載的特定 API 取用者進行限流。

## 實作步驟
<a name="implementation-steps"></a>

 可以使用 API 的限流限制來設定 API Gateway，並在超出限制時傳回 `429 Too Many Requests` 錯誤。可以搭配使用 AWS WAF 與 AWS AppSync 和 API Gateway 端點，以按照 IP 位址啟用速率限制。此外，如果您的系統可容忍非同步處理，您可以將訊息放入佇列或串流中，以加快對服務用戶端的回應速度，進而提升到更高的限流率。

 透過非同步處理，當您將 Amazon SQS 設定為 AWS Lambda 的事件來源時，可以[設定並行上限](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-max-concurrency)，以避免高事件率消耗工作負載或帳戶中其他服務所需的可用帳戶並行執行配額。

 雖然 API Gateway 提供了權杖儲存貯體的受管實作，在您無法使用 API Gateway 的情況下，您可以對服務使用權杖儲存貯體的語言特定開放原始碼實作 (請參閱「資源」中的相關範例)。
+  了解並設定每個區域帳戶層級的 [API Gateway 節流限制](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-throttling.html)、每個階段的 API 以及每個使用方案層級的 API 金鑰。
+  將 [AWS WAF 速率限制規則](https://aws.amazon.com/blogs/security/three-most-important-aws-waf-rate-based-rules/)套用至 API Gateway 和 AWS AppSync 端點，以防止泛洪並封鎖惡意 IP。此外也可在 A2A 取用者的 AWS AppSync API 金鑰上設定速率限制規則。
+  考慮您是否需要比 AWS AppSync API 的速率限制更高的限流控制，如果需要，請在 AWS AppSync 端點前面設定 API Gateway。
+  將 Amazon SQS 佇列設定為 Lambda 佇列取用者的觸發器時，請將[並行上限](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-max-concurrency)設定為足以符合服務層級目標的值，但不會消耗影響其他 Lambda 函數的並行限制。當您透過 Lambda 使用佇列時，請考慮在相同帳戶和區域中的其他 Lambda 函數上設定預留並行。
+  使用 API Gateway 與 Amazon SQS 或 Kinesis 的原生服務整合來緩衝請求。
+  如果您無法使用 API Gateway，請查看語言特定程式庫，為您的工作負載實作權杖儲存貯體演算法。查看範例區段並自行研究，以尋找合適的程式庫。
+  測試您預計要設定的限制，或您打算允許增加的限制，並記錄已測試的限制。
+  請勿將限制提高到您在測試時建立的範圍外。增加限制時，請先確認佈建的資源已等同於或大於測試情境中的資源，然後再套用增加。

## 資源
<a name="resources"></a>

 **相關的最佳實務：**
+  [REL04-BP03 持續工作](rel_prevent_interaction_failure_constant_work.md) 
+  [REL05-BP03 控制和限制重試呼叫](rel_mitigate_interaction_failure_limit_retries.md) 

 **相關文件：**
+  [Amazon API Gateway：調節 API 請求以獲得更佳的輸送量](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-throttling.html) 
+ [AWS WAF：以速率為基礎的規則陳述式](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-type-rate-based.html)
+ [導入使用 Amazon SQS 作為事件來源時的 AWS Lambda 並行上限](https://aws.amazon.com/blogs/compute/introducing-maximum-concurrency-of-aws-lambda-functions-when-using-amazon-sqs-as-an-event-source/)
+ [AWS Lambda：並行上限](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-max-concurrency)

 **相關範例：**
+ [三項最重要的 AWS WAF 以速率為基礎的規則](https://aws.amazon.com/blogs/security/three-most-important-aws-waf-rate-based-rules/)
+ [Java Bucket4j](https://github.com/bucket4j/bucket4j)
+ [Python 權杖儲存貯體](https://pypi.org/project/token-bucket/)
+ [節點權杖儲存貯體](https://www.npmjs.com/package/tokenbucket)
+ [.NET 系統執行緒速率限制](https://www.nuget.org/packages/System.Threading.RateLimiting)

 **相關影片：**
+ [使用 AWS AppSync 實作 GraphQL API 安全最佳實務](https://www.youtube.com/watch?v=1ASMLeJ_15U)

 **相關工具：**
+ [Amazon API Gateway](https://aws.amazon.com/api-gateway/)
+ [AWS AppSync](https://aws.amazon.com/appsync/)
+ [ Amazon SQS](https://aws.amazon.com/sqs/)
+ [Amazon Kinesis](https://aws.amazon.com/kinesis/)
+ [AWS WAF](https://aws.amazon.com/waf/)
+ [AWS 上的虛擬等候室](https://aws.amazon.com/solutions/implementations/virtual-waiting-room-on-aws/)