【问题标题】:AWS lambda not processing S3 file fast enoughAWS lambda 处理 S3 文件的速度不够快
【发布时间】: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


【解决方案1】:

将一条消息写入 SQS 需要 10 到 50 毫秒。如果您尝试在单个 Lambda 调用中写入 300,000 条消息,那么最好的情况是 3,000 秒,这比 Lambda 超时时间要长。

一旦 Lambda 超时,它正在处理的任何 SQS 消息都将返回队列,并在其可见性超时到期后交付。

您可以尝试对将消息写入 SQS 的代码进行多线程处理。由于它主要是网络 IO,因此您应该能够线性扩展至十几个线程。然而,这可能只是意味着您的下游消息处理程序过载。

另外,将批处理大小减少到 1。如果队列中有更多消息,SQS 将调用多个 Lambda。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-01-10
  • 2020-05-14
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多