為什麼我的 Lambda 功能重試有效的 Amazon SQS 訊息,並將它們放在我的無效信件佇列中?

上次更新日期:2021 年 11 月 1 日

我將 AWS Lambda 功能配置為在 Amazon Simple Queue Service (Amazon SQS) 佇列中處理訊息。現在,我的一些有效的 Amazon SQS 訊息被多次接收到到 maxReceiveCount,最終在我的無效信件佇列中。為什麼會發生這種情況,以及如何確保我的 Lambda 功能處理所有有效的 Amazon SQS 訊息?

簡短描述

如果您的 Lambda 功能受到限制、傳回錯誤或在讀取 Amazon SQS 訊息批次時沒有回應,則訊息會返回至您的佇列。可見性逾時發生之後,Lambda 功能會再次收到訊息批次。如果您的功能無法多次處理有效訊息,則 Amazon SQS 會將訊息傳送到您的無效信件佇列 (如果您已設定訊息)。

為了防止有效的訊息被放置在無效信件佇列中,您的功能代碼必須是冪等的,並且能夠多次處理訊息。

解決方案

驗證您的 Lambda 功能的代碼是冪等的

有關冪等最佳實務和範例功能邏輯,請參閱 如何使我的 Lambda 功能冪等?

確認 Amazon SQS 佇列的可見性逾時時間至少比 Lambda 功能的逾時設定長六倍

將來源佇列的可見性逾時設定為至少超過功能逾時的六倍。如果功能在處理上一個批次時節流,則額外的時間允許您的功能重試處理批次。

如需詳細資訊,請參閱 Amazon SQS 開發人員指南中的可見性逾時

注意:如果您的功能因佇列的可見性逾時不夠長而未接收訊息,則這些訊息將不會記錄在 Amazon CloudWatch Logs 中。

確認來源佇列的重新驅動政策上至少設定為五個 maxReceiveCount 屬性

將來源佇列的重新驅動政策上的 maxReceiveCount 設定為至少五個。如果您的功能回傳一個錯誤,或者因為它處於最大並發性而無法調用,則處理可能會成功進行額外的嘗試。至少五個的 maxReceiveCount 讓您的郵件在傳送到無效信件佇列之前,有更多的處理機會。

如需詳細資訊,請參閱《Amazon SQS 開發人員指南》中的無效信件佇列如何運作?,以及避免訊息處理不一致

辨識並解決您的 Lambda 功能傳回的任何錯誤

遵循如何對 Lambda 功能故障進行疑難排解?中的指示 只有在功能沒有回傳錯誤時,您的功能才會自動從佇列中刪除訊息。


此文章是否有幫助?


您是否需要帳單或技術支援?