amazon-web-services - 使用 lambda 批处理 s3 对象
问题描述
用例是每分钟将 1000 个非常小的文件上传到 s3,所有传入的对象都将使用 lambda 处理并存储在单独的存储桶中。但是使用 s3-object-create 作为触发器会产生许多 lambda 调用,并且需要注意并发性。我正在尝试每 5-10 分钟批处理一次新创建的对象。S3 提供批处理操作,但它的报告是每天/每周生成的。有可以帮助我的服务吗?
解决方案
根据AWS 文档,S3 可以将“新对象创建事件”发布到以下目的地:
- 亚马逊社交网络
- 亚马逊 SQS
- AWS 拉姆达
在你的情况下,我会:
- 创建 SQS。
- 配置 S3 存储桶以将 S3 新对象事件发布到 SQS。
- 重新配置您现有的 Lambda 以订阅 SQS。
- 为输入 SQS 事件配置批处理。
目前,SQS-Lambda 订阅的最大批处理大小为 1000 个事件。但是由于您的 Lambda 需要大约 2 秒来处理单个事件,那么您应该从较小的东西开始,否则 Lambda 将超时,因为它无法处理所有事件。
因此,将 X 个项目上传到 S3 将产生X / Y
事件,其中 Y 是 SQS 的最大批量大小。对于 1000 个 S3 项目和 100 个批量大小,它只会调用大约 10 个并发 Lambda 执行。
上面提到的 AWS 文档解释了如何将 S3 事件发布到 SQS。我不会在这里解释它,因为它更多的是关于实现细节。
执行时间处理时间
但是,您可能会遇到处理速度太慢的问题,因为 Lambda 可能会在一个循环中一个接一个地处理事件。
解决方法是使用异步处理和实现取决于您用于 Lambda 的运行时,对于 Node.js,这将很容易实现。
此外,如果您想以其他方式加快处理速度,只需减少最大批处理大小并增加 Lambda 内存配置,因此单次执行将处理较少数量的事件并可以访问更多 CPU 单元。
推荐阅读
- python - Pandas - 将绝对值应用于列
- r - 如果检查输入,是否需要参数化 SQL 搜索?
- objective-c - 无法从 Swift 类调用 Objective C 类委托
- r - 在循环中优化 lm() 函数
- ios - 在 Swift 中形成旋转矩阵时需要帮助
- java - 如何保护 Websocket。Apache Vhost 或 ServerEndpointConfig
- c# - 使用 Mono Cecil 获取类型的属性,包括基类属性
- javascript - 将变量名输出到控制台
- luigi - Luigi 指定要使用的配置
- azure - Azure Devops nuget 工件源和 docker