Aws lambda 将SQS Lambda批次拆分为部分成功/部分失败
AWS SQS->Lambda集成允许您批量处理传入消息,您可以在其中配置单个批次中可以接收的最大数量。如果在处理过程中引发异常以指示失败,则不会从传入队列中删除所有消息,并且在可见性超时结束后,另一个lambda可以拾取这些消息进行处理Aws lambda 将SQS Lambda批次拆分为部分成功/部分失败,aws-lambda,amazon-sqs,Aws Lambda,Amazon Sqs,AWS SQS->Lambda集成允许您批量处理传入消息,您可以在其中配置单个批次中可以接收的最大数量。如果在处理过程中引发异常以指示失败,则不会从传入队列中删除所有消息,并且在可见性超时结束后,另一个lambda可以拾取这些消息进行处理 出于性能原因,是否有办法保持批处理,但允许批处理中的某些消息成功(并从入站队列中删除),而只保留部分未删除的批处理?一个选项是手动将失败的消息发送回队列,然后成功地回复SQS,这样就不会有重复 您可以设置失败计数,这样,如果所有消息都失败,您可以简单地为所有消
出于性能原因,是否有办法保持批处理,但允许批处理中的某些消息成功(并从入站队列中删除),而只保留部分未删除的批处理?一个选项是手动将失败的消息发送回队列,然后成功地回复SQS,这样就不会有重复 您可以设置失败计数,这样,如果所有消息都失败,您可以简单地为所有消息返回失败状态,否则如果失败计数小于10(10是可以从SQS->Lambda事件获得的最大批处理大小),则您可以单独将失败消息发送回队列,然后回复一条成功消息
此外,为了避免任何可能的无限重试循环,请在将事件发送回队列之前向事件添加属性,例如“重试”计数,并在“重试”时删除该事件大于X。手动将失败消息重新排队到队列的问题是,您可能会进入无限循环,其中这些项目会永久失败,然后重新排队并再次失败。由于它们被重新发送到队列,因此每次重试计数都会被重置,这意味着它们永远不会失败到死信队列中。您还将失去可见性超时的好处。这也不利于监控,因为除非手动检查日志,否则您永远无法知道自己是否处于不良状态 更好的方法是手动删除成功的项目,然后抛出异常以使批处理的其余部分失败。成功的项目将从队列中删除,所有实际失败的项目将达到其正常的
可见性超时时间
并保留其接收计数
值,您将能够实际使用和监视死信队列。总的来说,这也比其他方法的工作量少
考虑
- 仅当出现部分批处理失败时才重写默认行为。如果所有项目都成功了,那么就让默认行为继续下去
- 由于您正在跟踪每个队列项目的失败情况,因此需要在异常出现时捕获并记录每个异常,以便以后可以看到发生了什么