【问题标题】:Error handling for AWS SQS with Lambda triggers and reserved capacity使用 Lambda 触发器和预留容量处理 AWS SQS 的错误
【发布时间】:2019-02-20 21:42:07
【问题描述】:

我正在使用here 描述的方法将由 SQS 触发的 lambda 函数错误处理的消息移动到 DeadLetterQueue。

在我的例子中,lambda 函数的 ReservedCapacity 设置为一个较小的值——我想限制并发执行的数量。发生的情况是,即使 Cloudwatch 日志/指标没有显示 lambda 执行错误,一些消息也不会被处理并被发送到 DLQ。

lambda 函数正在被限制,这是意料之中的。似乎当函数被限制时,消息会从 SQS 中删除然后返回,这会导致消息在 DLQ 中结束,即使 lambda 执行代码中没有错误。

现在我将 maxReceiveCount 从 1 增加到 3 作为解决方法。是否有更好的方法仅将 Lambda 执行错误(不包括限制)发送到 DLQ?


  SearchJobsQueue:
    Type: 'AWS::SQS::Queue'
    Properties:
      MessageRetentionPeriod: 1209600
      VisibilityTimeout: 60
      RedrivePolicy:
        deadLetterTargetArn:    
            "Fn::GetAtt":       
              - SearchJobsDLQ
              - Arn
        maxReceiveCount: 3

编辑:我的目标是让 DLQ 只接收 lambdas,其中包含未在 lambda 代码中明确处理的错误。解决方法有以下问题:如果出现永久错误,消息将在结束 DLQ 之前至少处理 3 次,而 1 次就足够了;根据处理所有队列消息所需的时间以及 lambda 触发器检查队列的时间间隔,有可能由于限制 3 次而未处理的消息在 DLQ 中结束。

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    此 AWS presentation 详细介绍了该主题。由于限制而未使用的消息将返回到队列,并以与 lambda 执行期间因其他错误而未使用的消息相同的方式进行处理。但是有针对这种情况的指南,例如将队列的可见性超时定义为 lambda 超时的 5-6 倍。

    【讨论】:

    • 感谢分享视频链接,这是迄今为止我在 SQS 上看到的最好的演示文稿之一,为我澄清了很多事情。尽管如此,SQS 无法满足您(和我)的要求,这让我感到很奇怪:“永久”错误(例如异常)直接进入 DLQ,而来自限制错误的消息返回队列进行重试。当然,你可以摆弄超时,但我真的很想有一个开箱即用的解决方案......
    猜你喜欢
    • 2020-07-28
    • 2020-05-17
    • 2021-03-28
    • 2021-09-12
    • 2022-01-26
    • 2021-05-29
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多