【问题标题】:Lambda long running task gets executed two times with no errorsLambda 长时间运行的任务被执行两次,没有错误
【发布时间】:2020-03-03 17:53:20
【问题描述】:

我通过显式 RequestResponse 通过 aws-sdk 调用 lambda

const Lambda = require("aws-sdk/clients/lambda");
const lambda = new Lambda({region: "region"});

const params = {
  FunctionName: "myFunctionArn",
  InvocationType: "RequestResponse",
  Payload: JSON.stringify({
    //... my payload
  })
};

lambda.invoke(params).promise().then(data => {
  console.log(data);
});

这是一个长时间运行的任务 >~5 分钟,我的超时设置为 10 分钟。我下载了一个 mp3,压缩它,保存到 S3,然后将 url 返回给客户端。 cloudwatch没有错误,过程顺利,mp3以较低质量存储到s3,但函数执行了两次。

如果 mp3 文件足够小(~8 MB),则只有一次执行,但如果它是一个大文件(~100MB),它将被执行两次,当然函数会超时。我正在使用 /tmp 文件夹来临时存储文件,我也会在 mp3 安全存储在 S3 后将其删除 我已经通过日志记录分散了我的功能,并且绝对没有错误迹象,而且这种情况每次都会发生,而不是偶尔发生。

这些是我的 cloudwatch 日志

谢谢

EDIT_1:我尝试向 lambda 客户端添加一些选项

const Lambda = require("aws-sdk/clients/lambda");
const lambda = new Lambda({
  region: "ap-southeast-1",
  httpOptions: { timeout: 10 * 60 * 1000, connectTimeout: 10 * 60 * 1000 }
});

但看起来什么都没有改变

EDIT_2:似乎现在这也发生在短期运行的任务中,并且是完全随机的。我在这里不知所措我真的不知道该怎么办

【问题讨论】:

  • 查看此线程的第一个答案:stackoverflow.com/questions/57565650/…
  • 谢谢,但我已经检查了所有答案,就我而言,我没有错误,我的执行是同步的。
  • 不看你的 lambda 函数代码就很难说什么。
  • 您是否记录了调用 Lambda 以排除双重执行的代码?这样您就可以确定这发生在 AWS 端。

标签: node.js aws-lambda


【解决方案1】:

在 SDK 配置参数中将 maxRetries 设置为 0 将关闭由 SDK 本身调用的重试。

const Lambda = require("aws-sdk/clients/lambda");
const lambda = new Lambda({
  maxRetries: 0,
  region: "ap-southeast-1",
  httpOptions: { timeout: 10 * 60 * 1000, connectTimeout: 10 * 60 * 1000 }
});

【讨论】:

  • 我发现有这样的选项并尝试过,但它仍然会被调用两次。无论如何,为您投票,它可能会帮助其他人
【解决方案2】:

在调试了无数个小时之后,我才发现这种奇怪行为的原因是因为函数内存不足。 令人难以置信的是,Cloudwatch 上什么也没显示。

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多