為什麼我的 Lambda 函數正在重試有效的 Amazon SQS 訊息,並將它們放入我的無效字母佇列中?

1 分的閱讀內容
0

我將 AWS Lambda 函數配置為處理 Amazon Simple Queue Service (Amazon SQS) 佇列中的訊息。我的部分有效 Amazon SQS 訊息經多次接收,直至最大接收計算,最後移至我的無效字母佇列。

簡短描述

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

為避免有效消息被放置在無效字母佇列中,您的函數代碼必須為冪等並且能夠多次處理訊息。如需詳細資訊,請參閱 如何避免 Amazon SQS 訊息多次調用我的 Lambda 函數?

解決方案

確認您的 Lambda 函數碼為冪等的

有關冪等最佳實務和範例函數邏輯,請參閱 如何將我的 Lambda 函數設為冪等?

確認您的 Amazon SQS 佇列的可見性逾時至少比 Lambda 函數的逾時設定長六倍

將來源佇列的 可見性逾時 設定為至少超過函數逾時的六倍。如果函數在處理前一個批次時受到限流,則額外的時間可讓您的函數重新處理批次。

如需詳細資訊,請參閱 Amazon SQS 開發人員手冊中的 設定可見性逾時

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

確認來源佇列的重新驅動策略上的最大接收計算屬性設定為至少五個

將來源佇列的 重新驅動原策略 上的 最大接收計算 設定為至少五個。如果您的函數傳回錯誤,或者因為達到 最大並行性 而無法調用,則處理可能會成功進行額外嘗試。至少五個的 最大接收計算 可讓您的訊息在傳送至無效字母佇列前有更多處理機會。

若要更新最大並行性設定限制,請參閱 設定 Amazon SQS 事件來源的最大並行性

如需詳細資訊,請參閱 Amazon SQS 開發人員手冊中的 無效字母佇列如何運作? 以及 避免訊息處理不一致

檢查 Lambda 函數的限流和保留並行性

Lambda 函數有時會受到限流,以保護您的資源和下游應用程式。即使 Lambda 自動調整擴展 以適應傳入流量,但是您的函數仍然會因各種原因受到限流。

使用 Lambda 主控台 檢查 保留並行的設定。如果未設定保留並行,則函數會使用 未保留並行。黨對函數的調用超過未保留並行, 會發生限流。

**注意:**如果您已配置零保留並行的函數,則該函數會受到限制,因它無法處理任何事件。請確定將該值增加到大於零的數字。

如果相同 AWS 區域中的其他函數正在使用該並行限制,則可能會發生限流。受到限流的 Lambda 函數會將 SQS 訊息傳送至無效字母佇列。

避免重新處理失敗批次中的所有 SQS 訊息

處理包括 Lambda 已成功處理訊息的批次時,對於發生錯誤的 Lambda 函數,所有 SQS 訊息都會顯示在無效字母佇列中。接著,Lambda 會再次重試整個 SQS 訊息批次。

若要避免重新處理失敗批次中的所有 SQS 訊息,請使用 函數回應類型 清單中的 報表批處理項目失敗 值來設定事件來源映射。這可以讓您的函數傳回部分成功,並減少重試次數。如需詳細資訊,請參閱 報告批次項目失敗

識別並解決您的 Lambda 函數傳回的任何錯誤

依照說明進行操作 如何排除 Lambda 函數錯誤中的故障?只有函數沒有傳回錯誤時,您的函數才會自動從佇列中刪除訊息。

相關資訊

如何請求增加 Lambda 函數的並行限制?

如何排除「速率超出」和 429「TooManyRequestsException」錯誤的 Lambda 函數限流中的故障?

AWS 官方
AWS 官方已更新 1 年前