【问题标题】:Invoke a AWS Lambda function N number of times in a loop, get back responses for each lambda execution and continue rest of execution在循环中调用 AWS Lambda 函数 N 次,获取每个 lambda 执行的响应并继续执行其余部分
【发布时间】:2022-02-06 04:04:20
【问题描述】:

上下文:我有一个 lambda 函数,它执行文件操作并输入学生对象,为每个学生创建 pdf 文件,将它们压缩并上传到 s3。

但是这个学生对象数组可能很大。 5k-10k 甚至更多。所以我想做的是根据输入将输入拆分为每个请求左右的 1k 个学生并调用 lambda。我已经提出了一种在代码中执行此操作的机制。例如,如果输入有 4.5k 个学生,那么它将它分成 5 个子数组,我可以为每个输入调用该函数 5 次。这将需要对压缩和上传进行一些返工,并且可能必须在所有 lambda 执行完成后将其全部压缩到 s3 中,但这是以后的事情。

我想知道如何实现调用 lambda 例如 5 次,等待我猜的 5 个响应,然后继续使用剩余代码(一旦压缩并在 s3 上我发送一封电子邮件下载文件的链接)。让我们缩小它,为数组中的每个元素触发 5 次 lambda 调用。

//lambda config code

let students = [ [{"name": "Chet"}], [{"name": "Tom"}], [{"name": "Mic"}], [{"name": "Pio"}], [{"name": "Kobo"}] ]
for (stu in students) {
  const params = {
    FunctionName: "pdfZipperFunction",
    Payload: JSON.stringify(stu),
  };
  lambda.invoke(params, function(error, data) {
    if(error){
      //console.log(error)
    }
    else {
      //console.log(data.Payload.result) //success. files created and uploaded to s3
    } 
  }
}

//how do i know here that the lambda has completed executing 5 times? before i proceed further? how do I keep track?

//..continue execution rest of the code. I need to access s3, and zip all the folder that all the above 5 lambda functions uploaded files into and then send an email

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda


    【解决方案1】:

    您建议的架构并不真正适合 AWS Lambda。让 AWS Lambda 函数等待另一个函数并没有什么特别的好处,因为该服务是按每秒执行收费的。

    更适合云的方法是通过 Amazon SQS 队列编排工作

    • 让您的主流程将消息推送到 Amazon SQS 队列,以完成每项所需的工作(例如,为一名学生创建 PDF)——这可以通过 AWS Lambda 函数来完成,或者甚至是您在 EC2 实例或您自己的计算机上运行的程序
    • 将 SQS 队列配置为在收到消息时触发 AWS Lambda 函数
    • 该 Lambda 函数然后查看它给出的消息(通过 event 参数),执行工作,然后退出

    这种设计的美妙之处在于它高度可扩展(只需向队列中添加更多消息!)并且处理每条消息的 AWS Lambda 函数可以并行运行(默认限制为 1000 个并发处决)。

    处理消息的 Lambda 函数可以配置为每次执行最多接收 10 条消息,甚至每次执行只接收 1 条消息。无论哪种方式都可以,具体取决于您希望代码如何运行。

    【讨论】:

    • 感谢您的回答。我可以将带有多条消息的 sqs 批处理请求发送到队列,并通过将 sqs 触发器添加到 lambda 来让它们中的每一个调用 lambda。但是对于我的业务问题,这种方法有点障碍。就像我提到的,在所有这些都执行之后,我需要发送一封电子邮件。假设 5 个 lambda 函数将 pdf 添加到 s3 的单个文件夹中。如何跟踪并了解所有 lambdas 已完成执行?有没有办法检查这些消息的 lambdas 是否已完成执行?
    • 您需要将该逻辑构建到 Lambda 函数中。每个文件生成后,它可以检查所有文件是否存在并发送电子邮件。但是,可能存在导致多个 Lambda 函数尝试此操作的时间问题。如果您重新考虑您的逻辑会更好 - 例如,可能首先生成 ALL 的 PDF,然后单独运行以发送电子邮件。或者,您可以使用 AWS Step Functions 来编排流程,它可以在各个 Lambda 函数外部添加逻辑。
    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 2015-04-17
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2020-08-18
    相关资源
    最近更新 更多