了解SQS消息接收金额

问题描述 投票:0回答:2

我有一个队列,应该接收 lambda 函数发送的消息。该函数应该只发送每个不同的消息一次。然而,我在控制台上看到了可怕的接收计数: enter image description here

由于我找不到任何关于接收计数的简单英语解释,我需要咨询 StackOverflow 社区。我有两个理论需要验证:

  1. 实际上没有那么多消息,“接收计数”之所以这么高,只是因为我轮询了消息很长时间,所以消息被捕获了不止一次;
  2. 将消息发送到队列的函数是SQS触发的,这些消息可能由多个处理器处理。虽然我已经设置了
    VisibilityTimeout
    ,但是处理完的消息会被删除吗?如果不留下,就没有理由再次捕获和处理。

任何调试建议将不胜感激!

amazon-web-services aws-lambda amazon-sqs
2个回答
15
投票

因此,接收计数基本上是 lambda(或任何其他消费者)接收消息的次数。消费者可能会多次收到消息(这是设计使然,您应该在逻辑中处理它)。

话虽这么说,如果您的 lambda 无法处理消息(甚至达到执行限制),接收计数也会增加。默认值为 3 次,因此如果您的 lambda 出现错误,则每条消息至少会收到 3 次。

此外,当您通过 AWS 控制台轮询消息时,您基本上会增加接收计数。


0
投票

这篇文章发表很久之后我才看到它。 然而,看看你所描述的内容以及消息之间的延迟,我想到的是:你是否在消费者 Lambda 函数上设置了保留并发?

事实上,为发布到队列的每条消息触发 Lambda 可以使该 Lambda 提高分配的最大并发度,并且会导致 Lambda 仍在运行时的消息被持续消费/添加回队列,因为事件触发器将无法启动新的 Lambda 实例来处理它。

克服这个问题的一种方法是为 Lambda SQS 触发器设置批处理大小 + 最大批处理窗口,以便消息在发送到消费者 Lambda 之前进行“批处理”。 此外,AWS 去年为 Lambda SQS 事件引入了“最大并发”参数,这可以避免这种现象。

https://aws.amazon.com/blogs/compute/introducing-maximum-concurrency-of-aws-lambda-functions-when-using-amazon-sqs-as-an-event-source/

© www.soinside.com 2019 - 2024. All rights reserved.