【问题标题】:Retries in AWS Lambda在 AWS Lambda 中重试
【发布时间】:2015-07-31 11:11:03
【问题描述】:

我正在编写一个与端点通信的 Lambda 函数。如果出现 500 错误,我希望该函数重试几次。

我希望在我的 exports.handler 函数中做这样的事情:

exports.handler = function(event, context){  ...
  if (!error && response.statusCode >= 500 && response.statusCode < 600) {
    if (event.retries <= 5) {
      setTimeout(exports.handler(event, context), 60000);
    }
  }...

我想知道如何正确处理 context 变量。

在我上面引用的代码之后,我应该context.fail() 吗?还是我应该等待context.succeed()context.fail() 在此重试过程的后续迭代中发生?

我很难决定是否每个context 需要在它出现的原始exports.handler 的级别上解决,或者context 是否可以在任何级别上解决,这将为整个 Lambda 执行解决它。

感谢您的建议。

【问题讨论】:

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


    【解决方案1】:

    看这里:

    http://aws.amazon.com/lambda/faqs/

    在 Lambda 放弃之前,该函数最多会运行 3 次。

    如果你调用“context.succeed”,lambda 不会重试,但是(它假定你的函数是成功的)。

    调用“context.fail”会导致你的函数被重试。

    需要注意的一点:您必须小心在正确的时间调用“context.succeed”或“context.fail”。如果您使用该节点尚未处理的挂起回调调用其中一个,那么您的 Lambda 函数将提前暂停,并且您的一些代码可能会运行。因此,调用 context.succeed 或 context.fail 的最佳位置是在回调中,此时您知道不需要进行其他处理。

    这篇文章也值得一看:

    https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/

    【讨论】:

    • 感谢您的意见。一段时间以来,我们一直在使用我上面描述的东西(我们自己的重试),但我们没有对其进行测试以确保它的行为符合预期。如果我不得不依赖 cloudwatch 日志,那么查看事情是否正常运行会有点困难。它似乎表现正确...
    • 重试仅取决于 context.failed 或 context.succeed,因为我的情况是我在回调中是 context.succeed 但我的 lambda 仍在重试
    • 如果除了调用 context.fail 之外还发生任何错误,Lambda 可能会重试。例如,如果您的函数超时或引发异常。此外,主处理程序中是否有任何代码路径导致它在没有调用 done 或成功的情况下返回,或者是否存在不能保证其中之一的回调序列?
    • 这个被删除了吗?收到此错误:AttributeError: 'LambdaContext' object has no attribute 'succeed'。 Lambda 一直在尝试运行我的代码,因为它来自 dynamodb 流,但我希望它只尝试一次。 (我正在使用 Python。)
    • +1 表示禁用重试功能。这东西太破了。为什么它应该假设我的任务是可重试的?如果我不回调错误,我如何使用 CloudWatch 监控错误计数?
    猜你喜欢
    • 2019-03-02
    • 2023-03-13
    • 1970-01-01
    • 2019-11-02
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多