amazon-web-services - AWS Lambda - 使用超时来确保文件被正确读取?
问题描述
我使用 AWS lambda 作为后端来解析最近上传的文件并维护一个 json“峰值”文件。我遇到的问题是,当用户上传多个文件时,会同时调用维护峰值文件的 lambda 函数。因此,它读取“峰值”文件而不等待前一个实例执行,结果是只有约 1/3 的文件被写入峰值文件。
不幸的是,我不能批量上传到 s3,也不能使用多部分上传,因为我需要在 s3 中的每个单独的文件在它自己的密钥下用于应用程序的其余部分。
我阻止了事件循环,以便在每个文件上传之间有一段时间并且工作正常,但问题是,由于我使用的是 Node JS,我的服务器处于空闲状态,并且需要两倍的时间来执行它的任务真的应该。
我可以做出更好的设计决策吗?我可以使用超时来强制每个 lambda 调用等待吗?
这是我(尝试)上面描述的事件的一步一步:
- 用户上传 4 个文件
- 我使用 putObject 将文件上传到特定于该用户的 s3 存储桶密钥。
- 每次在该 s3 存储桶上执行 putObject 时,都会调用一个 lambda 函数。
- lambda 函数从另一个存储桶读取“峰值”文件 - 再次存储在特定于用户的密钥中。
- 上传的文件被解析,文件 peaks 被添加到“peaks”文件中。然后我将 peaks 文件写回 s3 存储桶。
您可以看到,在第 4 步和第 5 步中,无法保证 lambda 函数会在我在另一个调用中读取“峰值”文件之前完成。有小费吗?
解决方案
如果其他人需要一些东西,这就是我最终要做的。
我没有使用 S3 触发器,而是从代码中触发了我的 lambda 函数,并传递了一个包含所需任务信息的有效负载。这种方式也更有效,因为我的目标文件的 getObject 和 putObject 调用的比率减少到 1,并且对于所有上传的文件保持不变。
您可以使用 lambda.invoke({parameters}) 通过节点 js sdk 执行此操作
推荐阅读
- java - Spring Rest 中的异步 Worker
- elasticsearch - 如果在logstash中以特殊字符开头,如何从输入文件中删除特定行
- javascript - 使用测试对象的全局导入访问 TestCafe `t.testRun` 数据
- ios - BG 处理任务
- php - Flutter Dart Hashing 以正确的方式进行授权(SHA1、SHA256、Base64 格式)(php 到 dart)
- json - Average Sub-Array Data from JSON
- pine-script - 如何在tradingview python / pine编辑器中更改一系列条形的bg颜色
- openstack - pdns4 (powerdns) - 创建从属区域时,不会使用默认值自动创建 SOA 记录
- python - 如何创建用于编码 nltk 频率分布的 pandas 数据帧
- design-patterns - 具有 2 个链接表的 derby 数据库