【问题标题】:How to consolidate the output of a number of Lambda function calls如何合并多个 Lambda 函数调用的输出
【发布时间】:2018-06-18 09:52:15
【问题描述】:

我有一个大文件,我想在 AWS 中使用 Lambda 函数对其进行处理。由于无法控制文件的大小,我想出了解决方案,将文件的处理分配给多个 lambda 函数调用以避免超时。以下是它的工作原理:

  1. 我专门使用了一个存储桶来接受要处理的新输入文件。
  2. 我在存储桶上设置了一个触发器来处理每次上传新文件时(我们称之为uploadHandler
  3. 读取文件,uploadHandler 测量文件的大小并将其分成相等的块。
  4. 每个块都被发送到processor lambda 函数进行处理。

注意事项:

  • uploadHandler 确实读取文件内容。
  • 发送到processor 的数据只是一个{ start: #, end: # }
  • processor 的多个实例被并行调用。
  • 每个processor 调用都会单独读取自己的文件块并为其生成输出。

到目前为止一切顺利。问题是如何将所有processor 调用的输出合并为一个输出?有人有什么建议吗?以及如何知道所有processors 的执行何时完成?

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    我最近遇到了类似的问题。我使用 AWS lambda 和 Step 函数解决了这个问题 https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-create-iterate-pattern-section.html

    在这个特定示例中,执行不是并行发生的,而是顺序执行的。但是当状态机完成执行时,您可以保证文件已完全正确处理。我不知道是不是你正在寻找的。​​p>

    【讨论】:

    • 不要忘记考虑财务影响。 Step 函数最终通常比 Lambda 本身更昂贵(管理流程比执行流程本身支付更多费用有点奇怪)。如果您有一个复杂的工作流程并且可能更改过于频繁,那么 Step Functions 可能会为自己买单。在其他情况下,您最好直接在 Lambda 中编写自己的逻辑,正如我在下面概述的选项所示。
    • 正确,但取决于大小。免费层免费支持 4000 次调用。在我们的案例中,我们一个月的调用次数少于 500 次,因此非常适合我们。
    【解决方案2】:

    选项 1:

    1. 破解文件后,使uploadHandler函数同步调用processor函数。
    2. 使调用并发,这样您就可以一次触发所有processors。 Lambda 函数只有一个 vCPU(如果 RAM > 1,800 Gb,则为 2 个 vCPU),但请求是 IO 绑定的,因此您只需要一个处理器。
    3. uploadHandler 将等待所有processors 响应,然后您可以组合所有响应。

    优点:实现更简单,无需存储;

    缺点:在一切完成之前无法看到正在发生的事情;

    选项 2:

    1. 在数据库(RDS、DynamoDB 等)中保留 processingJobuploadHandler 将创建作业并保存文件被分解成的部分数量。将作业 ID 与每个文件部分一起保存。
    2. 每个processor 获取一个零件(带有作业 ID),对其进行处理,然后将处理结果存储在数据库中。
    3. 让每个processor 检查它是否是最后一个提供结果的;如果是,请使其触发assembler 函数以收集所有结果并执行您需要的任何操作。

    优点:可见性更高,因为您可以随时查询存储数据库以检查哪些部分已处理,哪些部分待处理;如果需要,您可以存储来自processor 的各种元数据以进行详细分析;

    缺点:需要存储服务和稍微复杂的 Lambda 处理;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多