當我達到最大並發 Lambda 函數時會發生什麼情況

當我達到最大並發 Lambda 函數時會發生什麼情況

我的 s3 儲存桶中有 200 個 jsonl (json-lines) 檔案。每個檔案包含 100,000 個要寫入 DynamoDB 的 JSON。

我想使用 Lambda 從 S3 下載文件,並將其批量寫入 DynamoDB(文件已經與表架構完美匹配)。

我有 200 個文件,但我無法同時調用 200 個 lambda - 由於 DynamoDB 每秒只能寫入 10,000 個 WCU,所以我每秒只能寫入 10,000 行。 Lambda 只能持續 300 秒,然後就會逾時。

最好的方法是什麼?

我目前的想法是一次非同步調用 5 個 Lambda,並監視日誌檔案以查看完成了多少個,只有在一個完成後才調用下一個?

或者...

我可以設定並發執行限制將 lambda 函數設為 5,然後非同步呼叫該函數 200 次(每個檔案一次)?當一個 lambda 完成後,AWS 會自動觸發下一個 lambda 嗎?

答案1

來自亞馬遜文檔:

https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html

透過對函數設定並發限制,Lambda 保證分配將專門應用於該函數,無論處理剩餘函數的流量有多少。如果超過該限制,該功能將受到限制。此函數在受到限制時的行為方式取決於事件來源。有關更多信息,請參閱限制行為

然後從處理節流行為的aws文檔: https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html#throtdling-behavior

達到與函數關聯的並發限制後,對該函數的任何進一步呼叫請求都會受到限制,即該呼叫不會執行您的函數。每個受限的呼叫都會增加函數的 Amazon CloudWatch Throttles 指標。 AWS Lambda 以不同方式處理受限制的呼叫請求,具體取決於其來源:

同步呼叫:如果函數被同步呼叫並受到限制,Lambda 將傳回 429 錯誤,並且呼叫服務負責重試。 ThrottledReason 錯誤代碼說明您是否遇到了功能等級限制(如果指定)或帳戶等級限制(請參閱下面的註釋)。每個服務可能有自己的重試策略。例如,CloudWatch Logs 會重試失敗的批次最多五次,重試之間會有延遲。有關事件來源及其呼叫類型的列表,請參閱支援的事件來源。

非同步呼叫:如果您的 Lambda 函數被非同步呼叫並受到限制,AWS Lambda 會自動重試受限的事件,時間最長為 6 小時,重試之間會有延遲。請記住,非同步事件在用於呼叫 Lambda 函數之前先進行排隊。

因此,如果您設定並發限制(所有函數預設為 1000),那麼 AWS 要么會給您 429 狀態代碼(用於請求-回應),要么自動排隊並重試您的函數,最多 6 個小時。

但它沒有指定重試之間的延遲功能如何運作。

相關內容