繁体   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