【问题标题】:Is there an idiomatic way to aggregate events before processing them in AWS Lambda?在 AWS Lambda 中处理事件之前,是否有一种惯用的方法来聚合事件?
【发布时间】:2019-11-16 09:58:34
【问题描述】:

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

如下图所示:

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

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

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    你可以做一些事情:

    1。让上游做聚合:

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

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

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

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

    3。按时间进行聚合:

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

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

    【讨论】:

    • 感谢@MyStackRunnethOver esp。用于讨论每种方法。
    【解决方案2】:

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

    You can also set SQS triggers 但它的最大批量大小限制为 10。

    【讨论】:

    • 我觉得这个时候你不能直接将S3事件发送到一个FIFO队列,你也绝对不能在这个时候将Lambda配置为直接由一个FIFO队列触发。这是一个聪明的解决方案,但 AWS 服务目前不支持它。
    • 感谢@AtharKhan,只要批量最多10个项目,您链接的博客就可以解决问题(这对我来说可能还可以;而且它非常简单,所以我喜欢它),我需要阅读一些 CloudWatch 规则,看看我是否可以让它们做我想做的事情。
    • @igor 指向博客的链接解释了 SQS 触发器,它的批量大小限制为 10。但是我提出的原始解决方案是使用 CloudWatch SQS Metrics 根据您想要的批量大小创建警报。您可以在 FIFO 和标准队列上创建警报。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2020-06-14
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多