簡體   English   中英

SQS批次中的所有消息是否在達到最大redrive(Retry)策略數后都發送到Dead Letter Queue

[英]Are all the messages in SQS batch sent to Dead Letter Queue after reaching the maximum redrive(Retry) policy number

我有一個 SQS 隊列,該隊列的使用者是 lambda,未處理的消息被發送到重驅動策略為 10 的死信隊列。

我的 SQS 隊列的批處理大小為 5,將特定批處理中的所有消息發送到 DLQ,還是僅將超過 10 次重試嘗試且未處理的消息發送到 DLQ。

如果 5 條消息中的 3 條消息成功處理,則將所有 5 條 go 到 DLQ 或只有 2 條未處理。

將消息發送到 DQL 的過程獨立於 lambda function 或其批處理設置。 SQS 評估是否應根據每條消息將消息發送到 DLQ。 它不取決於您的 lambda function 或 lambda 正在使用的大批量。

所以只有 2 個會被發送到 DLQ,而不是整個批次。

答案高度依賴並且絕對與您的 lambda 實際執行的操作相關。

SQS 如何知道消息是否“成功處理”? 您的 lambda 正在迭代一批消息,只要處理程序中沒有引發錯誤,整個批次就被認為是成功的,並且這些消息被確認並從源 SQS 隊列中刪除。 另一方面,如果在批次的迭代過程中出現任何錯誤,則整個批次都被視為完全失敗,所有消息都將返回到隊列中。

2021 年 11 月 23 日發布, https://aws.amazon.com/about-aws/whats-new/2021/11/aws-lambda-partial-batch-response-sqs-event-source/ AWS 現在支持部分批處理回復。

到目前為止,通過 SQS 輪詢處理的批次要么完全成功,在這種情況下,記錄將從 SQS 隊列中刪除,要么完全失敗,記錄將保留在隊列中以在“可見性”后重新處理超時”期間。 SQS 隊列的 Partial Batch Response 功能只會保留那些無法成功處理的記錄,從而提高處理性能。

https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#services-sqs-batchfailurereporting

為避免重新處理失敗批次中的所有消息,您可以配置事件源映射以僅使失敗的消息再次可見。 為此,在配置事件源映射時,請將值 ReportBatchItemFailures 包含在 FunctionResponseTypes 列表中。 這讓您的 function 返回部分成功,這有助於減少對記錄的不必要重試次數。

報告語法 在事件源映射配置中包含 ReportBatchItemFailures 后,您可以在 function 響應中返回失敗消息 ID 的列表。 例如,假設您有一批 5 條消息,消息 ID 為 id1、id2、id3、id4 和 id5。 您的 function 成功處理了 id1、id3 和 id5。 要使消息 id2 和 id4 在您的隊列中再次可見,您的響應語法應如下所示:

{“batchItemFailures”:[{“itemIdentifier”:“id2”},{“itemIdentifier”:“id4”}]}

TLDR;

lambda 中發生的任何異常的默認行為是將整批消息返回給源。 為了只刪除成功處理的消息並將不成功的消息返回到隊列,您的 function 必須嘗試/捕獲每條消息,保存不成功消息的 id 並返回該有效負載。 這將導致接收計數在不成功的消息上增加,然后根據您的 DLQ 策略,一旦達到單個消息的接收計數,該消息將被轉移到 DLQ。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM