AWS SQS 可见性超时是否对单个消息或每个轮询的所有消息有效

Is AWS SQS visibility timeout valid for a single message or all the messages per poll

我正在参加 AWS 课程并尝试了解 AWS SQS(简单队列服务)的工作原理。我对可见性超时有点困惑。我知道可见性超时是消息处理的持续时间。

这是模型

如图所示,消费者将在可见性超时内拉取一条或多条消息并处理一条或多条消息。如果在visibility timeout内消息没有被处理,消费者将不会接收或处理消息,消息将保留在队列中。

以下是我的困惑:

  1. 可见性超时是否对一次投票中的所有消息有效?或者超时分别应用于每条消息?例如,消费者一次轮询 5 条消息。如果其中2个在超时时间内没有被处理,则其中2个被送回队列,另外3个被删除。或者所有 5 条消息都在超时内处理,如果其中任何一条消息失败,它们都会被发送回队列。

  2. 这是我的第二个困惑。可见性超时如何有效?那是消费者开始轮询消息和接收消息的时间吗?还是在消费者开始轮询消息并在消费者端完成消息处理(例如,将消息保存到数据库中)时有效?

可见性超时从您收到消息时开始。如果您批量收到多条消息,则所有消息的可见性超时将从那时开始。

要告诉 SQS 您已经完全处理了一条 SQS 消息,您可以使用 DeleteMessage 从 SQS 中删除该消息。如果您只处理完 5 条消息中的 3 条,则您只从 SQS 中删除这 3 条消息。

如果您没有在可见性超时到期之前从 SQS 中删除正在发送的消息,或者您通过将它们的可见性超时设置为零(这实际上是在告诉 SQS “我不打算处理这条消息,让其他人处理”)。一旦处理正在处理的消息,您还可以动态增加可见性超时。