【发布时间】:2021-10-30 19:15:34
【问题描述】:
我有一个具有 Lambda 函数作为消费者的 AWS SQS 队列(标准,非 FIFO)。
每当我向队列发送一堆消息(通常一次大约 10 条)时,lambda 只接收大约 2 条消息(在 CloudWatch Logs 中验证)。其他人从队列中消失。
Lambda 批量大小设置为 1,因此我希望所有 10 条消息都位于队列中并被 Lambda 一条一条地拾取,但这并没有发生。我正在使用 CloudWatch 检查 Lambda 正在做什么,并且没有丢失消息的痕迹。
我在 Lambda 中通过记录 event.Records 数组的大小(始终为 1)验证它每次只收到一条消息。
队列还有一个死信队列。最初,Maximum Receives 设置为 1。当我将其增加到 3 时,队列 Visibility timeout 后接收到的消息更多,但仍然只有几条。
我的队列设置
- 可见性超时:2 分钟
- 交付延迟:0 秒
- 接收消息等待时间:5 秒
- 消息保留期:4 天
- 最大消息大小:256kb
我想知道为什么这些消息没有被处理,而是消失了?
【问题讨论】:
-
documentation 建议:“为了让您的函数有时间处理每批记录,将源队列的可见性超时设置为您在函数上配置的超时的至少 6 倍。如果您的函数在处理前一批时您的函数执行受到限制,额外的时间允许 Lambda 重试。” Lambda 函数上设置的超时时间是多少?在 CloudWatch Logs 中,您是否看到消息失败并被发送到死信队列的原因?
-
Lambda 超时时间为 90 秒。所以我想我应该将可见性超时设置为 9 分钟?奇怪的是消息在 Lambda 中没有失败。每当 lambda 接收到一条消息时,我都会记录,而消失的消息也不会显示在日志中。
-
通常,这类问题的答案是 Lambda 函数没有处理所有
event.Records条目(很多人硬编码只处理第一条消息)。但是,您的情况似乎并非如此。您可以尝试断开 SQS 队列作为 Lambda 函数的触发器,以确认消息在队列中正确累积(并且没有其他任何东西在消耗它们)。 -
我在我的测试队列中这样做了,当我向它发送 10 条消息时,所有 10 条消息都显示出来了。
-
当您将一个 Lambda 函数连接到您的测试队列时,该函数是否接收到 所有 消息?您是否可以尝试暂时断开 Lambda 函数与非测试队列的连接,以查看消息是否都保留在队列中?因为一定有什么东西抓住了他们!
标签: amazon-web-services aws-lambda amazon-sqs