Aws lambda 将SQS Lambda批次拆分为部分成功/部分失败

Aws lambda 将SQS Lambda批次拆分为部分成功/部分失败,aws-lambda,amazon-sqs,Aws Lambda,Amazon Sqs,AWS SQS->Lambda集成允许您批量处理传入消息,您可以在其中配置单个批次中可以接收的最大数量。如果在处理过程中引发异常以指示失败,则不会从传入队列中删除所有消息,并且在可见性超时结束后,另一个lambda可以拾取这些消息进行处理 出于性能原因,是否有办法保持批处理,但允许批处理中的某些消息成功(并从入站队列中删除),而只保留部分未删除的批处理?一个选项是手动将失败的消息发送回队列,然后成功地回复SQS,这样就不会有重复 您可以设置失败计数,这样,如果所有消息都失败,您可以简单地为所有消

AWS SQS->Lambda集成允许您批量处理传入消息,您可以在其中配置单个批次中可以接收的最大数量。如果在处理过程中引发异常以指示失败,则不会从传入队列中删除所有消息,并且在可见性超时结束后,另一个lambda可以拾取这些消息进行处理


出于性能原因,是否有办法保持批处理,但允许批处理中的某些消息成功(并从入站队列中删除),而只保留部分未删除的批处理?

一个选项是手动将失败的消息发送回队列,然后成功地回复SQS,这样就不会有重复

您可以设置失败计数,这样,如果所有消息都失败,您可以简单地为所有消息返回失败状态,否则如果失败计数小于10(10是可以从SQS->Lambda事件获得的最大批处理大小),则您可以单独将失败消息发送回队列,然后回复一条成功消息


此外,为了避免任何可能的无限重试循环,请在将事件发送回队列之前向事件添加属性,例如“重试”计数,并在“重试”时删除该事件大于X。

手动将失败消息重新排队到队列的问题是,您可能会进入无限循环,其中这些项目会永久失败,然后重新排队并再次失败。由于它们被重新发送到队列,因此每次重试计数都会被重置,这意味着它们永远不会失败到死信队列中。您还将失去可见性超时的好处。这也不利于监控,因为除非手动检查日志,否则您永远无法知道自己是否处于不良状态

更好的方法是手动删除成功的项目,然后抛出异常以使批处理的其余部分失败。成功的项目将从队列中删除,所有实际失败的项目将达到其正常的
可见性超时时间
并保留其
接收计数
值,您将能够实际使用和监视死信队列。总的来说,这也比其他方法的工作量少

考虑
  • 仅当出现部分批处理失败时才重写默认行为。如果所有项目都成功了,那么就让默认行为继续下去
  • 由于您正在跟踪每个队列项目的失败情况,因此需要在异常出现时捕获并记录每个异常,以便以后可以看到发生了什么

谢谢,这正是我所想的,请参见@cdzar-answer以避免此解决方案引起的潜在无限重排队。您是否从lambda中手动删除它们?我的理解是,即使你删除了它们,如果你抛出了一个异常,那么一旦可见性超时时间过去,整个批次将再次可用。是的,我的lambda中的代码正在删除部分成功批次工作项中的成功项。当在lambda中抛出异常时,AWS实际上不会对批处理中的项执行任何操作。它只是让他们坐在那里直到他们的可见性超时过期。然后,它们要么被lambda的某个实例再次拾取,要么被移动到DLQ(如果合适的话)。因此,如果您从队列中删除成功的项目,然后抛出异常以表示部分批处理失败,AWS不会将成功的项目放回队列。它真的不了解他们。FIFO队列是这样吗?我在许多队列中使用相同的逻辑,没有问题。我最近开始使用FIFO队列,即使我手动删除成功的项目,整个批次也会重新交付。@Chris我还没有使用FIFO队列,所以我不知道。你能找到你所看到的有文件证明的原因吗?