【问题标题】:How to trigger AWS Lambda just once on multiple S3 notifications如何在多个 S3 通知上仅触发一次 AWS Lambda
【发布时间】:2019-11-16 14:36:47
【问题描述】:

我们正在设计一个管道。我们得到一些进入 S3 存储桶的原始文件,然后我们应用一个模式,然后将它们保存为 parquet。

到目前为止,我们正在为每个写入的文件触发 lambda 函数,但理想情况下,我们希望仅在写入所有文件后才开始此过程。我们怎样才能只触发一次 lambda?

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda


    【解决方案1】:

    我鼓励您使用一种替代方案,以保持发布者(无论谁在写作)和订阅者(​​您)之间的分离。出版商会告诉你什么时候写的;您有责任选择何时处理这些事情。这里的简洁模式是让发布者分批编写其文件并发布 ma​​nifests 供您触发:即一个列表,上面写着“我刚刚写了所有这些东西,你可以在这些中找到它们地方”。由于您没有那个/不能更改发布者,我建议如下:

    1. 将发布者的通知发送至SQS queue

    2. 安排您的 lambda 按计划运行;多久取决于您愿意延迟摄入多长时间。如果您希望数据在发布和被系统摄取之间最多延迟 5 分钟,请将您的 lambda 设置为每 4 分钟触发一次。您可以为此使用 Cloudwatch 通知。

    3. 当您的 lambda 运行时,轮询队列。继续前进,直到您累积了最大数量的通知 X,您想一次性处理,或者队列为空。

    4. 进程。如果停止轮询时队列不为空,则立即触发另一个 lambda 执行。

    以上注意事项:

    1. 正如所写,它不是并行的,因此如果您的 lambda 执行速度低于队列填满的速度,您需要 1. 更频繁地运行或 2. 插入负载平衡步骤:按计划触发的 lambda,轮询队列,并根据需要调用尽可能多的处理 lambda,以便每个都收到 X 通知。

    2. 一般的 SNS 和 SQS 非 FIFO 队列具体不保证完全一次交付。他们可以向您发送重复的通知。确保您可以干净地处理重复处理。

    【讨论】:

    • 谢谢,我会进一步探讨您的建议。
    • @MyStack 为什么不建议直接从 Amazon SQS 消息触发 Lambda 函数?这将避免需要安排 Lambda 函数。
    • @JohnRotenstein 这是个好问题。它的最大限制是最大批量大小为 10 (see docs)。否则,它是上述方法的一个很好(不太灵活)的替代方案,这样您就不必安排自己的 lambda 调用,但仍然需要一些挑剔的配置。
    【解决方案2】:

    将您的 Lambda 连接到 Webhook(API 网关),然后在您的客户端应用程序完成后从您的客户端应用程序调用它。

    【讨论】:

    • 我对 AWS 和 API 很陌生,我会根据您的建议进行探讨。您是否有任何网络链接,以便我阅读和理解 webhook(API 网关)解决方案?
    【解决方案3】:

    解决方案:

    1. 将所有文件压缩在一起,Lambda 解压缩
    2. 创建一个 UI 代码并一个一个发送文件,在发送最后一个时触发 lambda
    3. Lambda 检查文件,如果没有找到所有文件,静默退出。如果找到所有文件,则在一个线程中处理所有文件

    【讨论】:

    • 文件太大,压缩和解压可能需要很长时间。此外,我们无法控制源系统,它只是将所有文件复制到我们的 S3 存储桶中。第 3 点也许可以做到,但它看起来不像是优雅的解决方案。
    • 请注意,zip(和其他此类工具)可以仅用作容器,无需压缩阶段。当然,创建文件是有成本的,包括决定如何处理潜在的重复存储大小。
    猜你喜欢
    • 2022-01-23
    • 2019-02-26
    • 2023-03-18
    • 1970-01-01
    • 2015-10-06
    • 2020-02-09
    • 1970-01-01
    • 2020-11-13
    • 2019-05-02
    相关资源
    最近更新 更多