昨天了解 Lambda 的基本概念和常見挑戰,今天就來說說 AWS 提供哪些併發策略給開發和維運人員調整。AWS 提供了三種核心機制來管理 Lambda 的併發行為:
下面會更詳細介紹每個機制。
保留併發允許開發人員為特定 Lambda 預留一定數量的併發執行能力,確保關鍵 Lambda 一定能夠獲得資源。這是為「AWS賬戶在每個區域的 Lambda 共享一定數量併發執行次數」的限制做調配,避免重要的系統無法發揮最佳的執行效率。
只要在 Lambda 的 Concurrency 裡面選擇 Reserve concurrency ,並輸入要保留的數量即可。使用 Reserve concurrency 除了可以確保併發數量,還能限制併發上限,避免大量呼叫其他系統 API ,造成其他系統的負擔。
預置併發允許預先初始化一定數量的 Lambda ,讓這些環境處於「熱」狀態,可以立即處理請求,避免冷啟動( Cold Start )的問題。
如果要使用 Provisioned Concurrency , Lambda 必須先設置 Aliases 或 Versions 。以 Versions 為例,只要在 Versions 的tab按下 Publish new version
,並再次按下 Publish
即可發布新版本。
發佈完版本之後,可以看到 Lambda 的版號,也可以在 Configuration 的 tab 看到 Provisioned concurrency ,按下 Edit 然後輸入要預留的 Lambda 數量,即可預先準備好執行環境。
確認要預先準備的 Lambda 數量之後,等待一段時間就可以看到 AWS 把 Lambda 產生好。
測試之後可以發現,有多個 Log stream 都在差不多的時間產生,這代表有多個 Lambda 同時在消化 SQS 裡面的 Queue ,並產生 log 。
這個功能是為了阻止 Lambda 進入無限循環的狀態。這對於事件驅動的應用特別重要,因為在某些情況下,由於資源配置錯誤或代碼缺陷,處理過的事件可能會被發送回調用 Lambda 函數的同一個服務或資源,從而導致無限循環。
按下 Recursive loop detection 旁邊的 Edit ,即可選擇要不要讓 Lambda 反覆的觸發 AWS 的服務。
上面幾個策略可以有效地提高處理 request 的效率,也可以更好的保護第三方系統,除了這些方法之外,調整 timeout 的設定也是一個不錯的方式,這樣可以避免第三方系統出問題時,還耗費一堆時間與對方進行連線。
延伸閱讀