我正在使用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中结束。
答案 0 :(得分:0)
此AWS presentation详细介绍了该主题。由于节流而未使用的消息将返回到队列,并以相同的方式对待因lambda执行期间由于其他错误而未使用的消息。但是,对于这种情况有一些指导原则,例如将队列的可见性超时定义为Lambda超时的5-6倍。