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

时间:2019-01-13 15:44:05

标签: amazon-web-services aws-lambda

我有一个AWS Lambda函数,该函数处理来自S3的事件。我想在处理之前对其进行汇总,然后让lambda处理该批处理。

如下所示: enter image description here

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

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

2 个答案:

答案 0 :(得分:1)

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

You can also set SQS triggers,但最大批量大小为10。

答案 1 :(得分:1)

您可以做一些事情:

1。进行上游聚合:

让发布者负责发布,并让发布者为每个要处理的对象对象一个事件。如果发布者已经在批量工作,则此方法效果很好。

2。插入自己的聚合步骤:

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

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

3。进行时间汇总:

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

如果处理相当便宜,并且您希望最大程度地减少Lambda调用的次数,则此方法效果很好。触发计划(您在两次调用之间等待的时间)是根据您愿意支付的调用次数与您愿意等待的时间进行权衡而确定的。需要注意的事情:1.如果根本没有事件,那么您仍将在调用Lambda,并且2.如果事件得到的处理速度超出其处理能力,则队列将越来越多,处理速度将下降越来越远。