首页 > 解决方案 > 在 AWS Lambda 中处理事件之前,是否有一种惯用的方法来聚合事件?

问题描述

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

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

理想情况下,我希望能够指定批处理大小和超时(比如说一个偶数,然后 5 秒内什么都没有,我想发送一个 1 事件批处理)。

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

标签: amazon-web-servicesaws-lambda

解决方案


您可以做几件事:

1.让上游做聚合:

让发布者负责发布,并让发布者为每组要处理的对象提供一个事件。如果发布者已经在批量工作,这很有效。

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

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

如果您的每个事件的处理步骤比仅处理事件要昂贵得多,则此方法效果很好。通常,这可以采用 {aggregating lambda} -> {processing batch job} 的形式,因为 Lambda 不适用于非常昂贵的处理。

3. 按时间进行聚合:

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

如果处理成本相当低,并且您希望最大限度地减少 Lambda 调用次数,则此方法效果很好。触发计划(您在两次调用之间等待多长时间)是通过权衡您愿意等待多长时间来处理一个事件与您愿意支付多少次调用来确定的。需要注意的事情:1. 如果您根本没有收到任何事件,您仍然会调用您的 Lambda,并且 2. 如果您收到的事件比处理它们的速度更快,您的队列将越来越多,您的处理将下降越来越落后。


推荐阅读