AWS Lambda 在调用之间挂起

AWS Lambda hangs between invocations

我正在使用以下 3 项服务:Amazon S3、Amazon SQS 和 AWS Lambda.

为处理 CSV 和 EXCEL 文件创建了相同的配置(处理 EXCEL 文件的 lambda 函数只是将它们转换为 CSV 文件并按顺序将它们重新上传到 S3供其他 lambda 函数处理它们)

AWS Lambda 配置:

对于亚马逊 S3:

在“s3:ObjectCreated:*”事件中,S3 将消息发送到已配置的 SQS 队列。 SQS 队列附加了一个 Lambda 触发器。

我有一个外部进程正在将文件上传到我的 S3 存储桶。

这是整个工作流的开始(S3 -->SQS --> Lambda)

这个过程在很短的时间内上传了大约 40 个文件(一些 CSV 文件和一些 EXCEL 文件)。

我正在查看 SQS 队列和 CloudWatch 以查看处理的进展情况,我能够看到正在处理 CSV 文件的 SQS 队列有大约 15 条正在传输的消息,以及正在处理 CSV 文件的大约有 17 条正在传输的消息正在处理 EXCEL 文件的 SQS 队列和 CloudWatch 中的日志正在更新,一切进展顺利。

处理大约 15 秒后 一切停止。两个 lambda 函数都挂了。对于两个 SQS 队列,我仍然看到大约 15 条和 13 条消息在传输中,但在 AWS Lambda 上绝对没有做任何事情。 好像出了点问题。

大约 5 分钟后 什么都不做,两个函数突然开始处理文件。这两个函数处理几个文件大约 15 秒,然后再次沉默。

又过了 5 分钟 什么都不做,这两个函数再次开始处理文件。

这种情况发生了几次,中间有 5 分钟的休息时间。

Lambda 函数没有执行任何外部调用或可能导致它们挂起的操作。等待是在 AWS Lambda 调用之间进行的,因此它不在我的代码中。

例如:

2021-01-22T17:23:56.426+02:00 报告请求 ID:d0a01831-ff93-5a71-83d6-40b50fd0affa 持续时间:453.19 毫秒计费持续时间:454 毫秒内存大小:1024 MB 使用的最大内存:319 MB

2021-01-22T17:29:41.860+02:00 开始 RequestId:752f0eef-6738-5c24-ad52-566b96983c92 版本:$LATEST

是什么导致 AWS Lambda 挂起?

PS:如果有帮助,我可以附上 CloudWatch 日志。

我认为罪魁祸首是“保留并发:1”。 SQS --> Lambda 部分涉及一个名为 event source mapping 的隐形中间人,它轮询队列并为您调用 Lambda。

When messages are available, [The event source mapping] Lambda reads up to 5 batches and sends them to your function.

由于您已将预留并发配置为 1,当事件源映射尝试一次执行 5 次调用时,其中 4 次出现“超出速率”错误。在可见性超时后,消息将被放回队列中。之后,队列将再次触发 lambda 并继续这个“试错”过程。每次 lambda 只能处理 1 条消息,而您看到的“挂起”行为实际上是剩余的 4 条消息等待可见性超时。

您的用例可能会创建一个使用 AWS Step 函数的工作流。您可以将每个步骤分解为单独的 Lambda 函数并跟踪 AWS Step 函数中的每个步骤。这是一个非常好的工具。您可以逐步查看每个步骤。详情见:

Create AWS serverless workflows by using the AWS SDK for Java