首页 > 解决方案 > AWS Lambda - 使用超时来确保文件被正确读取?

问题描述

我使用 AWS lambda 作为后端来解析最近上传的文件并维护一个 json“峰值”文件。我遇到的问题是,当用户上传多个文件时,会同时调用维护峰值文件的 lambda 函数。因此,它读取“峰值”文件而不等待前一个实例执行,结果是只有约 1/3 的文件被写入峰值文件。

不幸的是,我不能批量上传到 s3,也不能使用多部分上传,因为我需要在 s3 中的每个单独的文件在它自己的密钥下用于应用程序的其余部分。

我阻止了事件循环,以便在每个文件上传之间有一段时间并且工作正常,但问题是,由于我使用的是 Node JS,我的服务器处于空闲状态,并且需要两倍的时间来执行它的任务真的应该。

我可以做出更好的设计决策吗?我可以使用超时来强制每个 lambda 调用等待吗?

这是我(尝试)上面描述的事件的一步一步:

  1. 用户上传 4 个文件
  2. 我使用 putObject 将文件上传到特定于该用户的 s3 存储桶密钥。
  3. 每次在该 s3 存储桶上执行 putObject 时,都会调用一个 lambda 函数。
  4. lambda 函数从另一个存储桶读取“峰值”文件 - 再次存储在特定于用户的密钥中。
  5. 上传的文件被解析,文件 peaks 被添加到“peaks”文件中。然后我将 peaks 文件写回 s3 存储桶。

您可以看到,在第 4 步和第 5 步中,无法保证 lambda 函数会在我在另一个调用中读取“峰值”文件之前完成。有小费吗?

标签: amazon-web-servicesamazon-s3aws-lambda

解决方案


如果其他人需要一些东西,这就是我最终要做的。

我没有使用 S3 触发器,而是从代码中触发了我的 lambda 函数,并传递了一个包含所需任务信息的有效负载。这种方式也更有效,因为我的目标文件的 getObject 和 putObject 调用的比率减少到 1,并且对于所有上传的文件保持不变。

您可以使用 lambda.invoke({parameters}) 通过节点 js sdk 执行此操作


推荐阅读