并非所有 SQS 消息最终都在 Lambda 中:大多数都消失了

Not all SQS messages end up in Lambda: most just disappear

我有一个 AWS SQS 队列(标准,非 FIFO),它具有作为消费者的 Lambda 函数。

每当我向队列发送一堆消息(通常一次大约 10 条)时,只有大约 2 条被 lambda 接收(在 CloudWatch Logs 中验证)。其他人从队列中消失。

Lambda 批处理大小设置为 1,因此我希望所有 10 条消息都位于队列中并被 Lambda 一条一条地提取,但这并没有发生。我正在使用 CloudWatch 检查 Lambda 正在做什么,没有丢失消息的踪迹。

我在 Lambda 中通过记录 event.Records 数组的大小(始终为 1)验证它每次只收到一条消息。

Queue 还有一个Dead Letter Queue。最初 Maximum Receives 设置为 1。当我将其增加到 3 时,在队列 Visibility timeout 之后接收了更多消息,但仍然只有少数。

我的队列设置

我想知道为什么邮件没有得到处理,而是消失了?

消息丢失的典型原因是 Amazon SQS 触发的 Lambda 函数没有正确处理传递给该函数的所有记录

确保代码遍历 even 参数中传递的所有 Records,因为可以在每个 Lambda 调用中提供多条消息。

原来这与Lambda函数的预留并发有关。我的并发设置为 1,这导致了问题。

我的期望 SQS 消息将保留在队列中,直到有可用的 Lambda 函数来提取它们。

现实中 Lambda 未提取的消息,因为函数受到限制,并且在可见性超时后被视为失败消息。

关于这个问题有一篇很棒的博客post:https://data.solita.fi/lessons-learned-from-combining-sqs-and-lambda-in-a-data-project/