實作部分批次回應的最佳實務 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

實作部分批次回應的最佳實務

本節提供設定 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 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