【发布时间】:2022-01-24 17:15:17
【问题描述】:
我的要求是处理在 S3 中创建的文件,并将文件的内容流式传输到 SQS 队列,供其他进程使用。
当在 S3 存储桶中创建新文件时,通知将发布到 SQS 队列,触发 lambda 和用 Python 编写的 lambda 处理文件并将内容发布到 SQS 队列。最大文件大小为 100 MB,因此它可能有 300K 消息,但处理速度非常慢。我不确定问题出在哪里,我已将 lambda 内存限制设置为 10 GB,运行时间设置为 15 分钟。我也将并发限制设置为 100
S3---->SQS--->lambda-->SQS
我已将消息的可见性超时设置为 30 分钟;处理速度非常慢,以至于将文件创建消息移动到死信队列。
【问题讨论】:
-
Lambda 函数是否需要很长时间才能运行?还是 Lambda 函数只是没有足够快地从队列中提取项目?您将文件放入存储桶的速度是否比 100 个并发 Lambda 调用处理它们的速度快?您的 Lambda SQS 集成设置是什么?您需要提供更多信息,并且最好进行一些尽职调查以确定瓶颈在哪里,然后才能真正给您答案。
-
我看到 lambda 运行了 15 分钟。我不确定 aws Lambda 究竟是如何调用函数的。当我将批处理大小设置为 10 条消息时,Lambda 是否会从队列中提取 10 条消息并继续调用相同的函数 10 次来处理所有消息。在我的情况下,lambda 是由 S3 文件创建事件触发的。如果批处理 10 消息由同一个 Lambda 按顺序处理,那么 15 分钟的时间限制是否适用于每个函数调用或处理所有消息批处理。
-
您的问题有点令人困惑,因为您两次引用了 SQS,并且不清楚您是引用两个单独的 SQS 队列还是同一个队列。此外,当您说“处理速度非常慢”时,您并没有提供任何证据——您是否使用
print语句来跟踪任务的进度,然后查看 CloudWatch Logs 以查看时间在哪里消耗?处理您的输入文件可能很慢,或者处理来自第二个 SQS 队列的消息可能很慢 - 请对此进行测试,然后编辑您的问题以显示结果。 -
Lambda 从一个队列读取并发布到一个单独的队列。我看到此错误“任务在 900.10 秒后超时”。这就是为什么我试图了解如何应用 Lambda 最大运行时间,所以当我们有一批 10 条消息时,是每个函数调用还是 10 个函数调用应用 Lambda 运行时间。我假设我的问题是由超时引起的。当 Lambda 收到 10 条消息时,每个文件都会创建事件,因此它必须处理 10 个文件。我认为一些调用在文件处理过程中超时,并且消息被放回队列并再次重新处理。
-
超时用于 lambda 执行。超时设置不关心处理了多少消息。不管 100M 应该在几秒钟内被读取和处理,所以一些分析(测量什么需要什么时间)可能会有所帮助。如果您要从内容中创建很多小 sqs 消息,您可以考虑使用
SendMessageBatch操作发送多个。一次通话的消息
标签: amazon-web-services amazon-s3 aws-lambda amazon-sqs