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

Wai*_*ein 3 amazon-sqs amazon-web-services

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

这是模型

在此处输入图片说明

正如您在图中所见,消费者将拉取一条或多条消息,并在可见性超时内处理一条或多条消息。如果一条或多条消息未在可见性超时内处理,则使用者将不会接收或处理该消息或这些消息,并且这些消息将保留在队列中。

以下是我的困惑:

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

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

jar*_*mod 7

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

在此处输入图片说明

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

如果您没有在可见性超时到期之前将它们从 SQS 中删除,或者您通过将它们的可见性超时设置为零明确地使它们再次可见(这实际上是在告诉 SQS“我不会去要处理此消息,请让其他人”)。您还可以在处理动态消息后动态增加可见性超时。

  • 您可以逐条消息更改可见性超时。将超时设置为相对较短的值,然后让项目的处理器根据需要执行的操作来确定将超时设置为什么,这是一种非常常见的模式。这样,如果进程在消息更新超时之前出错,另一个进程可以更快地接收它,但一旦更新超时,完成工作的时间有望更符合超时设置的时间。 (2认同)
  • @JasonWadsworth 是的,您可以通过将可见性超时更改为零来将运行中的消息返回到可见队列。我不想让我的答案过于复杂。但你是对的,这是一个重要且有价值的策略。 (2认同)