Amazon Simple Queue Service (Amazon SQS) 佇列事件來源的 AWS Lambda 函數的擴展效果不如預期。我想設定最佳的並行效能。
解決方法
**注意:**將 Amazon SQS 佇列設定為事件來源時,Lambda 函數可以最佳地向上擴展至每分鐘 300 個執行個體。標準佇列的並行執行次數上限為 1,250。如果您使用先進先出 (FIFO) 事件來源映射,則函數可以並行縮減至作用中訊息群組的數目。
識別和解決 Lambda 函數調用問題
為防止在擴展時出現錯誤,在發生調用錯誤時,Lambda 會對函數擴展限流。解決問題後,Lambda 會繼續擴展函數。如需詳細資訊,請參閱失敗調用的退避策略。若要解決 Lambda 函數調用錯誤,請參閱 處理 Lambda 中 SQS 事件來源的錯誤,以及如何疑難排解 Lambda 函數失敗?
為 Lambda 函數設定最佳並行
預留並行
如果您在函數上設定預留並行,則 Lambda 會在函數達到預留值時對您的函數限流。事件來源映射不包括預留並行,而且能夠處理的佇列訊息數量,高於傳送至函數的數量。
對於標準 SQS 佇列,函數的最低預留並行必須為 1,250,且必須等於 FIFO 佇列的作用中訊息群組總數。最佳做法是將預留並行設為高於 FIFO 佇列中的訊息群組數目。較低的預留並行可能會導致 FIFO 佇列的處理延遲,並導致函數限流。
**重要:**若要限制並行調用的數目,請對 Amazon SQS 事件來源使用並行上限設定,而不是預留並行。
**預設並行 **
您的 AWS 帳戶的預設並行配額為 1,000,這適用於同一帳戶和 AWS 區域中的所有函數。函數可調整至可用的並行上限。當您的所有函數都使用 1,000 個並行的集區時,Lambda 會對調用限流。
Lambda 會限制函數的擴展速度,以避免流量突然激增而導致的函數過度擴展。Lambda 函數最初會根據並行擴展率進行擴展。因為並行擴展率位於函數層級,所以帳戶中的每個函數都可以獨立於其他函數進行擴展。並行擴展率也與帳戶層級並行限額不同,帳戶層級並行限額會提供適用於函數的並行總量。
**注意:**預設並行與佈建並行不同。如需詳細資訊,請參閱了解預留並行和佈建並行。
並行上限設定
為一個事件來源設定並行上限時,該值僅適用於該特定事件來源。沒有並行上限的其他事件來源,都會使用帳戶的剩餘並行配額或預留的並行。
您可以同時使用並行上限設定和預留並行。最佳做法是將並行上限設定為低於函數的預留並行,以避免函數節流。
確認 Amazon SQS 佇列中有足夠的訊息,以允許 Lambda 函數擴展
如果您將 Amazon SQS 佇列設定為調用 Lambda 函數,則僅當佇列中有訊息時,Lambda 才會擴展調用。
若要使用 Amazon CloudWatch 來檢查佇列中必須處理多少訊息,請檢閱佇列的 ApproximateNumberOfMessagesVisible 指標。
如果指標過低或為 0,則函數無法擴展。
如果指標較高且不存在調用問題,請增加事件通知的批次大小,直到 Duration 指標不再激增為止。如需 Lambda 指標的詳細資訊,請參閱指標類型。
**注意:**標準 Amazon SQS 佇列的批次大小上限為 10,000 筆記錄。對於 FIFO 佇列,批次大小上限為 10 筆記錄。
確認 Amazon SQS 正在將訊息新增至佇列
若要驗證 Amazon SQS 是否將新訊息新增至佇列,請檢閱佇列的 NumberOfMessagesSent 指標。
確認取用者正在進行 ReceiveMessage API 呼叫
若要驗證取用者是否正在進行 ReceiveMessage API 呼叫,請檢閱佇列的 NumberOfMessagesReceived 指標。
**注意:**NumberOfEmptyReceives 指標中的尖峰顯示取用者正在進行 ReceiveMessage API 呼叫,但呼叫未從佇列中傳回訊息。當佇列中沒有任何訊息時,就會發生此問題。
相關資訊
搭配 Amazon SQS 使用 Lambda
管理 AWS Lambda 函數並行