首页 > 解决方案 > 使用 lambda 批处理 s3 对象

问题描述

用例是每分钟将 1000 个非常小的文件上传到 s3,所有传入的对象都将使用 lambda 处理并存储在单独的存储桶中。但是使用 s3-object-create 作为触发器会产生许多 lambda 调用,并且需要注意并发性。我正在尝试每 5-10 分钟批处理一次新创建的对象。S3 提供批处理操作,但它的报告是每天/每周生成的。有可以帮助我的服务吗?

标签: amazon-web-servicesamazon-s3aws-lambdaamazon-sqs

解决方案


根据AWS 文档,S3 可以将“新对象创建事件”发布到以下目的地:

  • 亚马逊社交网络
  • 亚马逊 SQS
  • AWS 拉姆达

在你的情况下,我会:

  1. 创建 SQS。
  2. 配置 S3 存储桶以将 S3 新对象事件发布到 SQS。
  3. 重新配置您现有的 Lambda 以订阅 SQS。
  4. 为输入 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 单元。


推荐阅读