我有一个队列,应该接收 lambda 函数发送的消息。该函数应该只发送每个不同的消息一次。然而,我在控制台上看到了可怕的接收计数:
由于我找不到任何关于接收计数的简单英语解释,我需要咨询 StackOverflow 社区。我有两个理论需要验证:
VisibilityTimeout
,但是处理完的消息会被删除吗?如果不留下,就没有理由再次捕获和处理。任何调试建议将不胜感激!
因此,接收计数基本上是 lambda(或任何其他消费者)接收消息的次数。消费者可能会多次收到消息(这是设计使然,您应该在逻辑中处理它)。
话虽这么说,如果您的 lambda 无法处理消息(甚至达到执行限制),接收计数也会增加。默认值为 3 次,因此如果您的 lambda 出现错误,则每条消息至少会收到 3 次。
此外,当您通过 AWS 控制台轮询消息时,您基本上会增加接收计数。
这篇文章发表很久之后我才看到它。 然而,看看你所描述的内容以及消息之间的延迟,我想到的是:你是否在消费者 Lambda 函数上设置了保留并发?
事实上,为发布到队列的每条消息触发 Lambda 可以使该 Lambda 提高分配的最大并发度,并且会导致 Lambda 仍在运行时的消息被持续消费/添加回队列,因为事件触发器将无法启动新的 Lambda 实例来处理它。
克服这个问题的一种方法是为 Lambda SQS 触发器设置批处理大小 + 最大批处理窗口,以便消息在发送到消费者 Lambda 之前进行“批处理”。 此外,AWS 去年为 Lambda SQS 事件引入了“最大并发”参数,这可以避免这种现象。