在 AWS Lambda 中处理事件之前是否有一种惯用的方法来聚合事件?

Igo*_*ski 5 amazon-web-services aws-lambda

我有一个处理来自 S3 的事件的 AWS Lambda 函数。我想在处理之前聚合它们并让 lambda 处理批次。

如下图所示: 在此输入图像描述

理想情况下,我希望能够指定批量大小和超时(比如说一个偶数,然后 5 秒内什么也不做,我想发送一个包含 1 个事件的批次)。

是否有使用 Lambda 或其他 AWS 服务的惯用方法?

MyS*_*ver 5

您可以做以下几件事:

1. 让上游进行聚合:

让发布成为发布者的责任,并让发布者为每组对象提供一个事件来处理。如果发布商已经在批量工作,那么这种方法很有效。

2. 插入您自己的聚合步骤:

  1. 触发每个事件。
  2. 将事件存储在某处。
  3. 如果已存储足够的事件,则清空存储并将所有内容传递到处理步骤。

如果每个事件的处理步骤比仅仅处理事件要昂贵得多,那么这种方法很有效。通常,这可以采取 {聚合 lambda} -> {处理批处理作业} 的形式,因为 Lambda 不适合非常昂贵的处理。

3. 按时间进行聚合:

  1. 将您的事件发送到 SQS 队列。
  2. 触发计时器(例如Cloudwatch events)。
  3. 触发后,清空队列并处理其中的所有内容。如果单次调用处理的内容太多,请立即触发另一个 lambda。

如果处理成本相当低,并且您希望最大限度地减少 Lambda 调用次数,那么这种方法很有效。触发计划(两次调用之间等待的时间)是通过权衡您愿意等待处理事件的时间和您愿意支付的调用次数来确定的。需要注意的事项: 1. 如果您根本没有收到任何事件,您仍然会调用 Lambda;2. 如果您收到事件的速度快于事件的处理速度,您的队列将越来越大,处理速度也会下降越来越落后。


A.K*_*han 1

我认为您可以通过将SQS队列设置为S3通知的目的地来实现批量操作。假设您想要指定批量大小为 20,所有 S3 事件都将发送到 SQS。当您的 SQS 有 20 个项目时,您将创建一个 CloudWatch 规则来触发 Lambda。您的 Lambda 会轮询 SQS 以查找该批次的 20 个项目并对其进行处理。

您还可以设置 SQS 触发器,但它有最大批量大小 10 的限制。