具有Lambda触发器和保留容量的AWS SQS的错误处理

时间:2019-01-21 16:11:51

标签: amazon-web-services aws-lambda

我正在使用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仅接收具有在lambda代码中未明确处理的错误的lambda。解决方法存在以下问题:如果出现永久性错误,则该消息将至少处理3次,然后以DLQ结尾(如果1次就足够了);根据处理所有队列消息所需的时间以及lambda触发器检查队列的时间间隔,有可能由于限制3次而未处理的消息在DLQ中结束。

1 个答案:

答案 0 :(得分:0)

此AWS presentation详细介绍了该主题。由于节流而未使用的消息将返回到队列,并以相同的方式对待因lambda执行期间由于其他错误而未使用的消息。但是,对于这种情况有一些指导原则,例如将队列的可见性超时定义为Lambda超时的5-6倍。