当使用带有Dead Letter和Lambda的SQS时,为什么Lambda运行时发生异常后消息会在5分钟内保持“in flight”状态?

3
当使用具有死信和Lambda的SQS时,为什么在Lambda运行时异常失败后,消息仍保持“正在处理”状态5分钟?
我创建了3个资源
MyQueue(配置为将无法投递的消息发送到MyQueueDLQ。默认可见性超时:30秒)
MyQueueDLQ
Lambda(重试尝试设置为0,超时时间30秒)
由于某种原因,我期望(可能是由于缺乏理解)在我的Lambda失败时,死信队列会在失败后不久收到消息。(而不是几分钟后)
如何确保死信队列以最快的方式获取消息,以便任何响应死信队列消息的内容都不必等待几分钟?
注意:我故意在Lambda中抛出运行时异常来测试这一点,以便我了解所有工作原理。
我的目标是确保消息尽快进入死信队列。 5分钟是我能做到的最好吗? 更新1:我已将lambda的超时时间设置为5秒,队列的超时时间设置为25秒,现在需要大约1分40秒才能将消息发送到DLQ。这仍然无法满足我的期望。难道消息不应该在25秒内到达DLQ吗? 更新2:今天我在AWS Explorer SQS队列底部窗口上发现了一个小信息图标。这可能很好地描述了我所看到的情况enter image description here
1个回答

4
当您的Lambda从MyQueue接收消息时,这些消息将进入不可见模式,在此模式下,其他人也读取同一队列的消息是看不到这些消息的。
通常情况下,当您的函数成功处理了消息时,Lambda服务会自动从队列中删除该消息。但是,如果没有发生这种情况,该消息将保持不可见状态直到不可见时间结束。然后,当它再次变得可见时,Lambda服务可能会重新尝试处理相同的消息。如果重试已经耗尽,则该消息将进入死信队列。
更多相关信息请参考此处:

如果一条消息多次无法被处理,Amazon SQS可以将其发送到死信队列。当您的函数返回错误时,Lambda会将其留在队列中。在可见超时后,Lambda再次接收该消息。如果要在多次接收后将消息发送到第二个队列,请在源队列上配置死信队列。


我刚刚进行了一项测试,你是正确的——较短的不可见超时将非常快地将失败的消息发送到死信队列。但是,请注意,您需要将超时设置得足够高,以便Lambda函数成功处理消息(并且可能需要更多的时间来确保安全)。 - John Rotenstein
@jbooker 它是在队列级别设置的。默认时间为30秒。 - Marcin
我已将Lambda超时设置为5秒,队列可见性超时设置为25秒。然而,消息需要大约1分30秒才能到达DLQ,这与预期的40秒不符。我错过了什么?:/ 为什么需要1分40秒,而队列的超时时间只有25秒? - Judy007
@jbooker 你确定将重试次数设置为零了吗? - Marcin
是的,我确定我将它设置为0。 - Judy007
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接