本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
實作部分批次回應的最佳實務
本節提供設定 Amazon SQS 事件來源部分批次回應的最佳實務。
-
設定無效字母佇列以避免在無伺服器應用程式架構中建立 snowball 反模式。如需詳細資訊,請參閱 避免 snowball 反模式 一節。
-
設定 Lambda 函數事件來源映射,只顯示失敗的訊息。若要這樣做,請在設定事件來源映射時,將 ReportBatchItemFailures 新增至 FunctionResponseTypes 清單。當 SQS 調用您的 Lambda 函數時, 應實作部分批次回應。考慮使用 Powertools for AWS Lambda Batch Processing 公用程式,它使用內建的部分批次支援來處理 SQS 訊息。
批次處理
-
在 SQS 調用的 Lambda 函數中實作部分批次回應。請考慮使用 Powertools for AWS Lambda Batch Processing 公用程式。此公用程式使用內建的部分批次回應支援來處理 SQS 訊息。如需詳細資訊,請參閱《 AWS Lambda 開發人員指南》中的使用 Amazon SQS 觸發程序報告 Lambda 函數的批次項目失敗。
AWS Lambda 批次處理公用程式的 Powertools
冪等性
-
定義您希望訊息移至無效字母佇列之前交付至來源佇列的次數。透過識別最可能的失敗原因及其估計復原時間,確保您定義的值符合您應用程式的使用案例。若要定義重試次數,請在來源佇列的 RedrivePolicy 上設定 maxReceiveCount 值。如需詳細資訊,請參閱《Amazon SQS API 參考》中的 SetQueueAttributes。此外,請參閱將 Amazon Simple Queue Service 無效字母佇列重新驅動至來源佇列
。 -
確保您的 Lambda 程式碼是等冪的,並且可以多次處理訊息。若要實作冪等性,請考慮使用 Powertools for AWS Lambda Idempotency Utility,這會準備函數的程式碼以支援 Amazon SQS 批次內的個別任務。首先,在事件來源映射中整合 ReportBatchItemFailures。如需詳細資訊,請參閱《 AWS Lambda 開發人員指南》中的實作部分批次回應和如何防止 Amazon SQS 訊息多次叫用我的 Lambda 函數?
AWS Lambda 等冪性公用程式的 Powertools
指標
-
若要在函數中整合業務指標以追蹤任務詳細資訊和失敗的任務,請考慮使用 aws-embedded-metrics 或 Powertools for AWS Lambda Metrics Utility,在處理內嵌指標格式的 SQS 事件時發出操作和業務指標。
AWS Lambda 指標公用程式的 Powertools
-
如果您使用First-In-First-Out(FIFO) 佇列,函數應該會在第一次失敗後停止處理訊息,並在 batchItemFailures 中傳回所有失敗和未處理的訊息。這有助於保留佇列的訊息順序。
注意
若要追蹤使用部分批次處理之應用程式的整體效能,需要程式碼層級效能追蹤。設定批次處理後,無論處理結果為何,Lambda 函數調用通常會成功。
避免 snowball 反模式
Lambda 和 Amazon SQS 無法控制上游微服務寫入 SQS 佇列的訊息。如果有無法處理的訊息,Lambda 會將這些未處理的訊息傳回來源 SQS 佇列,除非已設定個別的無效字母佇列。然後,Lambda 函數會重試未處理的訊息。如果不存在無效字母佇列,傳回 Amazon SQS 佇列的未處理訊息數量最終會超過佇列的有效訊息。
這種類型的雪球反模式 — 其中每個連續的 Lambda 調用會使問題惡化 — 可能會導致以下問題:
-
使用者體驗不佳,因為任務需要比平常更長的時間來處理,或者完全不處理
-
成本增加與 Amazon SQS 佇列中的訊息數量和訊息重試次數呈指數級增長成比例
-
減少應用程式的 Lambda 運算容量,或 AWS 帳戶如果函數的調用請求沒有限制
為了避免在設定部分批次回應時建立 snowball 反模式,最好也要建立無效字母佇列。此單獨的佇列可以儲存未成功處理的訊息,並協助您更好地管理應用程式未處理訊息的生命週期。
如需詳細資訊,請參閱《Amazon SQS 開發人員指南》中的使用 Amazon SQS 主控台設定無效字母佇列。 Amazon SQS