擴充與併發控制

使用 AWS Lambda 的無伺服器應用程式

Claudio Canales

Senior DevOps Engineer

一張圖看擴充

  • 需求越高 -> 平行執行越多。
  • 每次執行都會用到一個執行環境。
  • 併發=此刻正在執行的次數。

需求暴增 -> 更多環境

使用 AWS Lambda 的無伺服器應用程式

什麼是併發?

  • 一次呼叫=一個工作單元。
  • 併發=現在同時在跑幾個。
  • 若同時有 10 個在跑,併發=10。

平行呼叫

使用 AWS Lambda 的無伺服器應用程式

估算所需併發

  • 經驗法則:concurrency = rps * duration
  • 縮短 duration 可降低併發。
  • 用此估算安全的限制值。

併發公式

使用 AWS Lambda 的無伺服器應用程式

範例:50 rps、200 ms

  • 200 ms=0.2 秒。
  • 50 * 0.2=10 個同時執行。
  • 程式越快,平行次數越少。

併發計算範例

使用 AWS Lambda 的無伺服器應用程式

限制:帳戶池 vs 函式切片

  • 併發上限設在帳戶層級。
  • 為關鍵函式預留一部分額度。
  • 其他函式共用剩餘額度。

帳戶併發池

使用 AWS Lambda 的無伺服器應用程式

Reserved Concurrency:硬性上限

  • 安全閥。
  • 限制平行工作量。
  • 超過上限時會節流。
  • 吵雜函式也耗不光資源。

預留併發上限

使用 AWS Lambda 的無伺服器應用程式

節流:長什麼樣

  • Lambda 在併發上限處開始節流。
  • 呼叫端不會得到正常執行。
  • 你可在監控中看到節流。

節流訊號

使用 AWS Lambda 的無伺服器應用程式

Provisioned Concurrency:預熱容量

  • 預先初始化的一池環境。
  • 常綁在一個別名後。
  • 請求啟動更快。

預置併發的暖池

使用 AWS Lambda 的無伺服器應用程式

冷啟動 vs 預置

冷啟動

  • 一次性的初始化延遲。
  • 第一個請求要付設定成本。

預置

  • 先把初始化工作做完。
  • 第一個請求不用付設定成本。

冷啟動 vs 預置時間軸

使用 AWS Lambda 的無伺服器應用程式

預留 vs 預置(解決不同問題)

  • 預留用來控管負載。
  • 預置用來控管啟動延遲。
  • 許多正式環境同時用兩者。

預留 vs 預置對照

使用 AWS Lambda 的無伺服器應用程式

保護下游系統

  • 資料庫能承受的連線有限。
  • 併發上限可防護它。
  • 否則流量尖峰可能導致停擺。

併發上限保護資料庫

使用 AWS Lambda 的無伺服器應用程式

突發 vs 穩定流量

  • 突發會建立大量平行環境。
  • 處理器慢會拉高併發。
  • 上限可平滑尖峰。
  • 縮短 duration 也是擴充策略。

突發流量 vs 穩態

使用 AWS Lambda 的無伺服器應用程式

失敗與重試會增加負載

  • 重試會放大流量。
  • 併發上限可縮小影響範圍。
  • 失敗迴圈會壓垮相依服務。

重試成倍增加負載

使用 AWS Lambda 的無伺服器應用程式

簡單調校流程

  • 先從量測開始。
  • 出現節流或壓力時設併發上限。
  • 冷啟動影響延遲時加預置容量。

量測 -> 設上限 -> 預熱

使用 AWS Lambda 的無伺服器應用程式

重點整理

  • 併發有助思考如何擴充。
  • 估算:rps * duration
  • 預留設上限控負載;注意節流。
  • 預置可降低冷啟動延遲。

併發重點整理

使用 AWS Lambda 的無伺服器應用程式

一起來練習吧!

使用 AWS Lambda 的無伺服器應用程式

Preparing Video For Download...