

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Lambda Web 函數的擴展行為
<a name="web-functions-scaling"></a>

Lambda 會在流量到達時自動擴展 Web 函數的端點。它可擴展兩個維度：
+ **環境數量** – Lambda 新增更多執行環境，最多可達 `maxEnvironments`。
+ **每個環境的並行請求** – 每個環境一次處理多個請求。Lambda 會根據您的資源使用量來管理每個環境的動態並行限制。您可以使用 控制此動態限制的上限`maxConcurrencyPerEnvironment`。如需詳細資訊，請參閱[動態每個環境並行限制](#web-functions-scaling-dynamic-concurrency)。

您也可以在端點`rateLimit`上設定 ，以限制其請求到達率。這是選用設定，會在請求到達您的環境之前套用。

端點會從零擴展。沒有流量時，Lambda 不會執行任何環境。此頁面說明端點的擴展設定、相關帳戶配額，以及如何選擇可最佳化成本或效能的值。

## 執行環境
<a name="web-functions-scaling-environments"></a>

執行環境是執行 HTTP 伺服器的隔離運算執行個體。每個環境都有自己的記憶體、檔案系統和處理空間。如需 Lambda 如何初始化、重複使用和關閉執行環境，請參閱 [執行環境生命週期](web-functions-env-lifecycle.md)。

Lambda 會根據流量自動建立和移除環境：
+ 當流量增加時，Lambda 會建立其他環境以滿足流量需求。
+ 當流量減少時，Lambda 會耗盡未充分利用的環境並移除它們。
+ 當沒有流量時，Lambda 會移除所有環境。端點會擴展至零。

沒有最小或預留環境設定。當流量到達時，端點一律會從零擴展。為了避免小流量增加時冷啟動，Lambda 會視需要自動擴展執行環境，以維護傳入流量的備用容量 （前端）。當環境未充分利用時，Lambda 會將環境縮減至零。

## 動態每個環境並行限制
<a name="web-functions-scaling-dynamic-concurrency"></a>

動態每個環境並行限制是單一執行環境同時處理之請求數量的 Lambda 受管限制。根據函數的資源用量，Lambda 會自動調整此限制，以最佳化效率和效能。當現有環境接近其限制時，Lambda 會擴展新的環境。當限制防止所有現有環境接受更多請求時，會請求佇列，等待下一個可用的環境。

您不會直接設定動態限制。反之，您可以透過在修訂版`maxConcurrencyPerEnvironment`上設定 來套用上限。Lambda 的動態限制可以低於此值，但絕不會超過它。例如，如果您將 `maxConcurrencyPerEnvironment` 設定為 32，Lambda 會將最多 32 個並行請求路由到任何環境，即使環境具有更多容量。

大多數應用程式都可以依賴動態限制，而無需變更 `maxConcurrencyPerEnvironment`。如需何時進行變更的指引，請參閱 [選擇擴展設定](#web-functions-scaling-optimization)。

## 擴展設定
<a name="web-functions-scaling-settings"></a>

三個設定控制 Lambda 如何擴展您的 Web 函數。您可以在端點或修訂版上設定每個設定。


| 設定 | 在 上設定 | 有效範圍 | 預設 | 說明 | 
| --- | --- | --- | --- | --- | 
| maxConcurrencyPerEnvironment | 修訂 | 1–128 | 64 | Lambda 受管動態每個環境並行限制的上限。Lambda 會自動調整每個環境的實際並行，因此大多數應用程式可以依賴動態限制，而無需變更此值。 | 
| maxEnvironments | Endpoint | 選用。2–10，000 | 無 | 限制每個 中端點的執行環境數量 AWS 區域。控制水平擴展。即使maxEnvironments未設定 ，端點環境擴展一律受可用帳戶 vCPU 配額的限制。 | 
| rateLimit | Endpoint | 選用。0–10，000 | 無 | 限制每個 中端點的請求到達率，以每秒請求數為單位 AWS 區域。最多 1，000 的值必須是 100 的倍數，而超過 1，000 的值必須是 1，000 的倍數。值 0 會封鎖所有流量。超過有效速率限制的請求會收到 HTTP 429 （太多請求） 回應。未設定時，端點的到達率會受限於每個端點的 帳戶費率配額。 | 

`maxEnvironments` 和 `rateLimit`是選用的端點屬性。您可以在不建立新修訂的情況下更新它們。根據預設，不會設定 。大型 `maxEnvironments` 不保證端點可以擴展到遠處。環境擴展一律受到帳戶區域 vCPU 配額的限制。0 `rateLimit`的 會封鎖所有流量。如需詳細資訊，請參閱[限流](#web-functions-scaling-throttling)。端點請求率一律受帳戶的請求率配額限制，即使 `rateLimit` 未設定。如需配額，請參閱下一節。

若要變更 `maxEnvironments`或 `rateLimit`，`aws lambda-web update-web-function-endpoint`請使用 `--scaling-config`或 `--throttle-config` 參數執行 ，例如 `--scaling-config '{"maxEnvironments": 50}'`或 `--throttle-config '{"rateLimit": 8000}'`。省略參數以保留其目前值。若要清除您設定的值，請傳遞空物件，例如 `--scaling-config '{}'`。如需詳細資訊，請參閱 [更新端點](web-functions-endpoints.md#web-functions-endpoint-update)。 `maxConcurrencyPerEnvironment` 是修訂設定。若要變更它，請建立新的修訂。新修訂是否接收流量取決於端點的自動部署模式。如需詳細資訊，請參閱[建立修訂](web-functions-revisions.md#web-functions-revisions-create)。

## 帳戶配額
<a name="web-functions-scaling-quotas"></a>

這些配額適用於每個 AWS 區域。除了選擇性設定的端點限制之外，它們一律適用。
+ 每個端點速率限制 – 每秒 10，000 個請求 (RPS)。
+ 帳戶總速率限制 – 區域中所有端點的 100，000 RPS。
+ 帳戶 vCPU 限制 – 區域中所有端點的 2，000 vCPUs。每個執行環境都會使用 2 vCPUs，因此此配額會限制 AWS 區域 帳戶內每個 的環境總數。

如需目前配額值以及如何請求增加，請參閱 [Lambda Web 函數](gettingstarted-limits.md#web-functions-quotas)。

## 擴展設定如何互動
<a name="web-functions-scaling-interaction"></a>

這三個擴展設定會獨立運作，以判斷端點的擴展。除了帳戶配額之外，每個端點都會獨立擴展，甚至是屬於相同 Web 函數的端點。

並行容量總計  
您可以將端點的處理中請求尖峰數量視為 Lambda 目前允許的動態每個環境並行限制的大約 `maxEnvironments` 倍。端點一次可處理的最多是 `maxEnvironments` × `maxConcurrencyPerEnvironment`。只有在它執行`maxEnvironments`環境且每個都處理`maxConcurrencyPerEnvironment`請求時，才會達到該數字。如果`maxEnvironments`未設定 ，端點會擴展以滿足需求，最高可達帳戶 vCPU 配額。

總請求率限制  
`rateLimit` 會限制每秒請求數，與並行容量無關。Lambda 會針對超出速率限制的請求傳回 HTTP 429，即使環境具有提供這些請求的容量。

向上擴展  
在所有環境達到動態並行限制之前，Lambda 會擴展更多環境，最高可達 `maxEnvironments`。端點達到 `maxEnvironments`或帳戶 vCPU 配額時，會停止擴展。如果端點無法向上擴展，且所有現有環境都已充分利用，Lambda 會立即使用 HTTP 429 （太多請求） 回應調節新請求。Lambda 不會將限流請求排入佇列。如果新的執行環境正在初始化， 會請求佇列，而不是立即調節。

暫時過度拍攝  
在修訂權重變更、內部機群循環和其他操作事件期間，Lambda 可能會暫時超過 `maxEnvironments`以排定可用性的優先順序。此過衝是短暫的，Lambda 會自動返回設定的限制。當您選擇 時，您不必為這些操作事件編列空間預算`maxEnvironments`。

**Example 範例：容量計算**  
您可以為 Web 函數設定下列設定：  
+ `maxEnvironments` = 10
+ `maxConcurrencyPerEnvironment` = 64
+ `rateLimit` = 8000
這些設定會分別限制並行 （一次傳送中的請求） 和請求率 （每秒接受的請求）。透過最多 10 個環境和每個最多 64 個並行請求，端點最多可提供約 640 個並行請求 (10 × 64)。動態限制通常較低，因此持續並行通常較少。端點首先達到的限制取決於每個請求需要多長時間。    
並行繫結端點  
假設每個請求需要 200 毫秒，例如，因為它等待資料庫查詢。有 640 個請求正在傳輸中，端點每秒完成最多約 3，200 個請求 (640 ÷ 0.2 秒），低於 8，000 個 RPS`rateLimit`。當所有 10 個環境都充分利用時，Lambda 會使用 HTTP 429 調節新請求。若要提供更多流量，請增加 `maxEnvironments`。  
Request-rate-bound端點  
假設每個請求需要 10 毫秒。在每秒 8，000 個請求中，大約有 80 個請求正在處理中 (8，000 × 0.01 秒），遠低於 640。Lambda 會針對超過 8，000 RPS 的請求傳回 HTTP 429，即使環境具有提供這些請求的能力。若要接受更多請求，請將 提高`rateLimit`到每個端點 10，000 個 RPS 配額。

## 限流
<a name="web-functions-scaling-throttling"></a>

當傳入請求率超過 `rateLimit`設定時，Lambda 會針對過多請求傳回 HTTP 429 （太多請求） 回應。速率限制會套用至每個端點的整個端點 AWS 區域。

當所有環境都充分利用時，Lambda 也會傳回 HTTP 429 回應，因為已達到端點`maxEnvironments`或帳戶已達到其 vCPU 配額。如需詳細資訊，請參閱[擴展設定如何互動](#web-functions-scaling-interaction)。

當同時初始化太多執行環境時，Lambda 也可以傳回具有`Platform.EndpointConcurrentInitThrottle`錯誤類型的 HTTP 429。此調節不會增加調節指標。如需其他調節類型遞增的指標，請參閱 [搭配 Lambda Web Functions 使用 CloudWatch 指標](web-functions-monitoring-metrics.md)。

當端點的 `rateLimit`為 0 時，Lambda 會傳回 HTTP 503 （服務無法使用） 而不是 HTTP 429，標頭為 `lambda-web-error-type` `Platform.EndpointDisabled`。Lambda 也可以在卸載負載以保護服務時傳回 HTTP 503。重試沒有具有退避和抖動`lambda-web-error-type`標頭的 503。具有 的 503 `Platform.EndpointDisabled` 會持續執行，直到您`rateLimit`將 設定為非零值為止。

Lambda 會每秒測量速率限制。可接受超過限制的短暫暴增。超過限制的持續流量會導致限流。

當您的應用程式收到 HTTP 429 回應時，請在用戶端程式碼中使用抖動實作指數退避，以重試限流請求。

## 向上擴展和向下擴展
<a name="web-functions-scaling-lifecycle"></a>

### 向上擴展
<a name="web-functions-scaling-scale-up"></a>

當流量增加且現有環境接近動態每個環境並行限制時，Lambda 會建立額外的執行環境。每個新環境都會在提供請求之前初始化。如需初始化步驟和啟動時間限制，請參閱 [初始化 （冷啟動）](web-functions-env-lifecycle.md#web-functions-env-lifecycle-init)。

當新的環境初始化時，Lambda 會將請求路由到具有可用容量的現有環境。當環境沒有容量時，請求會在 Lambda 初始化新的 （冷啟動） 時等待。Lambda 只會在 中[限流](#web-functions-scaling-throttling)套用其中一個限制時傳回 HTTP 429，例如 `maxEnvironments`或帳戶 vCPU 配額。

### 縮減規模
<a name="web-functions-scaling-scale-down"></a>

當流量減少時，Lambda 會識別未充分利用的環境並將其移除。Lambda 會先耗盡環境，再將其移除。它會停止將新請求路由到環境，讓傳輸中的請求盡最大努力完成，並傳送 `SIGTERM`。如需詳細資訊，請參閱[執行環境生命週期](web-functions-env-lifecycle.md)。

當沒有流量時，Lambda 會縮減到零環境。之後的下一個請求會啟動新的環境 （冷啟動）。

## 選擇擴展設定
<a name="web-functions-scaling-optimization"></a>

當您選擇端點 `rateLimit`、端點 和修訂版 的值時`maxEnvironments`，請考慮下列事項`maxConcurrencyPerEnvironment`。

選擇 `rateLimit`  
預設值為無，這表示端點的請求率受到每個端點 10，000 個 RPS 配額和 100，000 個帳戶 RPS 配額的限制。當您想要限制端點可從帳戶 RPS 配額中宣告的數量時，請考慮設定`rateLimit`值，該配額由所有端點共用。  
設定 `rateLimit`也可能有助於將總流量限制為下游相依性。

選擇 `maxEnvironments`  
預設值為無，這表示端點的環境計數僅受到帳戶 vCPU 配額的限制。當您想要限制端點可從帳戶 vCPU 配額中宣告的數量時，請考慮設定 `maxEnvironments`值，該配額由所有端點共用。  
設定`maxEnvironments`值時，請考慮監控端點的環境計數，以便在接近`maxEnvironments`限制時收到提醒，並採取動作來避免在一段時間內有機成長的應用程式限流。  
設定 的低值`maxEnvironments`有助於限制端點執行環境的成本。考慮將低值用於非關鍵的興趣專案。

選擇 `maxConcurrencyPerEnvironment`  
修訂版`maxConcurrencyPerEnvironment`是 Lambda 受管動態每個環境並行限制的上限。預設值為 64，大多數使用者不應選取最佳值。  
對於記憶體繫結的應用程式，設定`maxConcurrencyPerEnvironment`低於預設值有助於實現更可預測的行為。  
對於 CPU 繫結應用程式，設定`maxConcurrencyPerEnvironment`低於預設值可能會減少 CPU 爭用並改善暖環境的穩定狀態延遲，但也可能導致更頻繁的冷啟動。如果 Lambda 的受管動態並行限制限制了環境的流量，則設定`maxConcurrencyPerEnvironment`高於預設值可能會沒有作用。  
對於 I/O 繫結應用程式，設定`maxConcurrencyPerEnvironment`高於預設值可能會提高每個環境的使用率並降低成本。

監控下列 CloudWatch 指標，以判斷您的擴展設定是否適當。如需指標定義，請參閱 [搭配 Lambda Web Functions 使用 CloudWatch 指標](web-functions-monitoring-metrics.md)。
+ `EndpointRequestThrottles` 和 `AccountRequestThrottles` – 如果 `EndpointRequestThrottles` 持續大於零，請增加 `rateLimit`，直到每個端點配額達到 10，000 RPS。當帳戶達到區域中的請求率配額時， `AccountRequestThrottles`會增加。若要減少這些調節，請在其他端點`rateLimit`上請求增加或減少配額。
+ `EndpointActiveEnvironmentThrottles` 和 `AccountActiveVCPUArm64Throttles` – 當 `maxEnvironments`或帳戶 vCPU 配額阻止額外的橫向擴展時，這些指標會增加。若要減少這些調節，請增加`maxEnvironments`或請求增加 vCPU 配額。
+ `EndpointActiveEnvironments` 和 `EnvironmentConcurrentRequests` – 如果作用中環境接近 `maxEnvironments`，或每個環境的並行請求保持在 附近`maxConcurrencyPerEnvironment`，請增加相關設定。
+ 應用程式延遲 – 使用應用程式指標、結構化日誌或前門的延遲測量來測量延遲。如果延遲隨著每個環境並行增加而增加，請減少 `maxConcurrencyPerEnvironment`以減少每個環境的爭用，並將負載分散到更多環境。

## MultiRegion 和 PerRegion 端點的擴展
<a name="web-functions-scaling-multi-region"></a>

對於具有 **MultiRegion** 或 **PerRegion** 端點的 Web 函數，擴展設定會獨立套用於端點運作的每個 AWS 區域 。

每個區域都會建立和管理自己的執行環境集區。一個區域中的流量不會消耗另一個區域的擴展容量。

## 擴展範例
<a name="web-functions-scaling-examples"></a>

Lambda 會擴展您的端點，以維持高於目前負載的前端空間。總空間是傳入請求負載與暖執行環境可以提供的總請求負載之間的差異。它會吸收小流量增加，而無需等待新的環境啟動。容量會逐步增加，因為每個新環境只會在初始化完成後新增容量。當端點達到限制時，容量會停止增加，Lambda 會調節超出端點可接受範圍的請求。

下列範例顯示端點如何處理流量暴增，以及當負載達到每種類型的限制時其行為。圖表說明一般行為，不會繪製來擴展。

### 處理流量暴增
<a name="web-functions-scaling-examples-burst"></a>

當負載逐漸增加時，頭頂空間會吸收增加，同時 Lambda 會在背景擴展新的環境。當負載上升的速度比頭部空間可以吸收的速度快時，暖環境無法處理所有傳入的請求。Lambda 會啟動新的環境，以處理頭頂上方的負載，而這些請求會等待新的環境冷啟動。新環境準備就緒後，Lambda 會在新負載上方還原標頭空間。

![傳入負載的圖表會逐漸上升，然後大幅上升。暖環境支援的 RPS 會逐步上升。頭部會吸收柔和的上升。在急劇上升期間，高於暖容量的請求會在冷啟動時等待。](https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/web-functions-scaling-burst.png)


### 達到每個端點請求率限制
<a name="web-functions-scaling-examples-rate"></a>

請求率限制會限制端點可接受多少負載，因此容量不會超過它。當負載接近每個端點速率配額或您的`rateLimit`設定時，頭頂空間會縮小。當載入超過限制時，Lambda 會針對超出限制的請求傳回 HTTP 429。若要接受更多請求，請將 提高`rateLimit`至每個端點的費率配額。

![暖環境支援的 RPS 圖表，在載入達到每個端點請求速率限制的步驟中上升，然後保持不變。頭頂空間會隨著負載增加而變窄，超過限制的請求也會受到調節。](https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/web-functions-scaling-rps-limit.png)


### 達到 maxEnvironments
<a name="web-functions-scaling-examples-max-environments"></a>

在此範例中， `maxEnvironments` 低於請求率限制。當端點達到 時`maxEnvironments`，Lambda 會停止新增執行環境。負載可能會持續增加，因此標頭會縮小。當負載超過環境可處理的負載時，Lambda 會使用 HTTP 429 調節新請求，即使請求速率仍低於速率限制。若要允許更多容量，請增加 `maxEnvironments`。

![暖環境支援的 RPS 圖表，逐步上升至 maxEnvironments，低於請求率限制，然後保持不變。頭頂空間會隨著負載增加而變窄，超過該容量的請求也會受到調節。](https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/web-functions-scaling-max-environments.png)


### 達到帳戶 vCPU 配額
<a name="web-functions-scaling-examples-vcpu"></a>

帳戶中的所有端點都會在每個端點中共用 vCPU 配額 AWS 區域。其他端點使用的環境可減少此端點可擴展的程度。在此範例中，端點可用的 vCPU 配額低於其`maxEnvironments`設定及其請求率限制。當帳戶達到配額時，Lambda 會停止新增環境，並調節超過可用容量的請求，即使端點尚未達到自己的限制。若要允許更多容量，請請求增加 vCPU 配額。

![暖環境支援的 RPS 圖表，逐步提升至端點可用的 vCPU 配額。maxEnvironments 設定和請求率限制都較高。超出配額的請求會受到調節。](https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/web-functions-scaling-vcpu-quota.png)
