【问题标题】:Fork and Join with Amazon Lambda使用 Amazon Lambda 分叉和加入
【发布时间】:2017-11-23 23:52:29
【问题描述】:

我正在尝试编写一个触发许多小 lambda 的 lambda 函数

exports.handler = (event, context, callback) => {
   var AWS = require('aws-sdk');

   let noOfPages = 20, currentPage = 1;
   var message = '';
   //let payloadArray = [];
   while(currentPage <= noOfPages){
        message = '{"first_page": '+ currentPage +', "last_page": '+ (currentPage) + ', "file_name" : "something.doc"' +'}';
        console.log(message);
        var params = {
            FunctionName: 'test',
            InvocationType: 'Event',
            LogType: 'Tail',
            Payload: message
        };
        var convLambda = new AWS.Lambda({
            accessKeyId: 'key',
            secretAccessKey: 'secret',
            region: 'us-west-2'
        });

        convLambda.invoke(params, function(err, data) {
            if (err) {
                context.fail(err);
            } else {
                context.succeed('Processed : '+ data);
            }
        })
    currentPage+=1;        
   }
};

这很好用并且可以触发,比如 20 个 lambda。但是,我想等到所有异步 lambda 都完成(fork 和 join)。目前在 Amazon Lambda 中有没有办法实现这一点?

【问题讨论】:

  • java != nodejs.还承诺?
  • @hjpotter92 我在java中有相同的代码,因此是标签。
  • 在这里docs.aws.amazon.com/sdk-for-java/v1/developer-guide/… 下找到了我需要的答案作为 java 期货。
  • 答案当然是特定于所使用的编程语言。答案与 AWS Lambda 关系不大,更多的是与所使用的特定编程语言的可用功能相关。如您所见,如果您使用 Java 编写 Lambda 函数,则可以使用 Java Futures。正如 hjpotter92 指出的那样,您将使用 Promises 在 NodeJS 中完成同样的事情。

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


【解决方案1】:

您可以考虑使用AWS Step Functions,它可以分叉和加入 Lambda 进程。它还以漂亮的图表显示了关系:

【讨论】:

  • 如果我正确理解 AWS Step Functions,但您不能,例如,根据输入的大小触发任意数量的 Lamda 函数,然后阻塞直到它们全部完成。我有这个权利吗?
【解决方案2】:

您可以使用 JavaScript Promises 使用适用于 NodeJS 的 AWS 开发工具包实现此目的:

exports.handler = (event, context, callback) => {
   var AWS = require('aws-sdk');

   let noOfPages = 20, currentPage = 1;
   var message = '';
   //let payloadArray = [];
   var convLambda = new AWS.Lambda({
       accessKeyId: 'key',
       secretAccessKey: 'secret',
       region: 'us-west-2'
   });

   let promises = [];
   while(currentPage <= noOfPages){
        message = '{"first_page": '+ currentPage +', "last_page": '+ (currentPage) + ', "file_name" : "something.doc"' +'}';
        console.log(message);
        var params = {
            FunctionName: 'test',
            InvocationType: 'Event',
            LogType: 'Tail',
            Payload: message
        };

        promises.push(convLambda.invoke(params).promise());
        currentPage+=1;        
   }
   Promise.all(promises).then((values)=>{
     callback(null, values);
   }).catch((err)=>{
     callback(err);
   });
};

【讨论】:

    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 2018-08-27
    • 2021-05-18
    • 2016-05-14
    • 2016-04-17
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多