【问题标题】:Invoke lambda instances from lambda and wait for the longest to comple从 lambda 调用 lambda 实例并等待最长完成
【发布时间】:2021-03-09 04:31:31
【问题描述】:

我有一个 lambda,我想调用多个 lambda 实例并等待最长的完成。

我已经在网上查了一下,发现了非常有趣的话题,但没有一个能帮助我实现我想要的。

代码如下:

Lambda 作为承诺

invokeVideoRenderer = (params) => {
    const param = {
      FunctionName: 'myFunction',
      InvocationType: 'Event',
      Payload: JSON.stringify({ body: params })
    };

    return new Promise(async (resolve, reject) => {
      this.lambda.invoke(param, (error, data) => {
        if (error) {
          reject(error);
        }
        resolve(data); <--- it always returns { StatusCode: 202, Payload: '' }
      });
    });
  };

我调用不同 lambda 的循环

const promises = [...Array(totalNumberOfLambdaToInvoke).keys()].map(
    async (part: number) => {

      
      const body = {
        // body
      };

      const request = await invokeVideoRenderer(body);
      return request;
    }
  );

  const results = await Promise.all(promises); <--- here I want to wait for the longest to complete

我正在调用的 lambda:

const myFunction = async (event, context, callback) => {
  try {
    //...code
    callback(null, {
      status: 200,
      body: JSON.stringify({
        status: "SUCCESS",
      }),
    });
    return;
  } catch (error) {
    callback(null, {
      status: 500,
      body: JSON.stringify({
        status: "FAILED",
        errorMessage: error,
      }),
    });
    return;
  }
};

我做错了什么?

【问题讨论】:

  • Event 的 InvocationType 告诉 Lambda 异步调用子 Lambda。因此 Lambda 服务会立即响应 202(已接受)响应。同时子 Lambda 函数执行。
  • 我应该如何更改代码以等待 lambda 完成?
  • 另外,请注意,您不必使用 AWS 开发工具包手动创建/解决承诺。只需使用return this.lambda.invoke(params).promise()

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


【解决方案1】:

Event 的 InvocationType 告诉 Lambda 异步调用子 Lambda。因此 Lambda 服务会立即响应 202(已接受)响应。同时子 Lambda 函数执行。

如果您希望它同步执行,则不要提供 Event 的 InvocationType。要么完全删除它以获取默认值,要么将其显式设置为 RequestResponse(这是默认值)。

注意:如果可以避免同步调用 Lambda 函数,通常并不理想,因为您同时为两个 Lambda 付费。

【讨论】:

  • 我将 InvocationType 更改为 RequestResponse 但我的主 lambda 仍然没有等待子 lambda 完成。
  • 您的地图应该只是return invokeVideoRenderer(body);。不需要异步声明或等待任何东西。
猜你喜欢
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
相关资源
最近更新 更多