我们假设以下场景:
我通过事件源映射集成了 Lambda 和 SQS。通过以下设置:
我在 lambda 函数中收到了一个包含 10 条消息的事件,我将开始使用线程并行处理它。 10 条消息中的 8 条已成功处理并删除,两条消息处理失败,并且针对此失败创建了处理程序,而没有“爆炸”lambda 函数。所有这一切都发生在可见性超时到期之前。
很快。 lambda 函数将毫无错误地响应。并且整个批次将被删除。但实际上应该有两条消息返回队列。
遇到这种情况该如何处理?
将消息重新发送到队列。但我不认为解决问题的最好方法
首先,如果您使用 SQS 事件源映射,则不应在 Lambda 函数代码中从队列中删除 SQS 消息。您应该让 Lambda 函数返回成功或错误消息,并且根据该消息,Lambda 服务将认为消息已处理,并从队列中删除消息,或者将消息返回到队列以进行处理。再次处理。
在您的场景中,您成功处理 8 条消息,但未能处理 2 条消息,您的 Lambda 函数应实现部分批量响应,这使其能够准确通知 Lambda 服务哪些消息已成功处理,哪些消息未成功处理。 Lambda 服务将使用该信息从队列中删除成功的消息,并且仅将失败的消息重新排队。