【发布时间】:2017-12-21 10:48:51
【问题描述】:
我将可见性超时设置为 12 小时,最长消息 3,延迟时间 15 分钟,我在自动再次收到相同消息后几分钟收到 sqs 消息。
为什么我收到多个 sqs 消息而没有超时? 可见性超时后,它会删除队列中的消息还是再次发送 sqs 消息?
【问题讨论】:
标签: amazon-web-services amazon-sqs
我将可见性超时设置为 12 小时,最长消息 3,延迟时间 15 分钟,我在自动再次收到相同消息后几分钟收到 sqs 消息。
为什么我收到多个 sqs 消息而没有超时? 可见性超时后,它会删除队列中的消息还是再次发送 sqs 消息?
【问题讨论】:
标签: amazon-web-services amazon-sqs
当在 Amazon SQS 队列上调用 ReceiveMessage() 时,最多将从队列中检索 10 条消息(可配置)。
这些消息将被标记为 Invisible 或 In-Flight。这意味着消息仍在队列中,但不会通过另一个ReceiveMessage() 调用返回。这些消息将在一段时间内保持不可见。默认时间段在队列上配置(“默认可见性超时”)或检索消息时(VisibilityTimeout)。
当应用程序处理完消息后,它应该调用DeleteMessage(),传递消息中提供的MessageHandle。然后该消息将从队列中删除。
如果在删除消息之前不可见期到期,它将再次放入队列,应用程序可以再次检索它。因此,请务必将您的隐身超时设置为比应用程序通常处理消息所需的时间长。
有可能一条消息从 Amazon SQS 中多次检索。这种情况很少见,但可能发生在有多个进程同时检索消息的情况下。因此,SQS 是“至少一次交付”。如果这是一个问题,您可以使用 FIFO 队列(尚未在每个区域都可用),这将保证每条消息仅传递一次,但 FIFO 队列存在吞吐量限制。
所以,如果您不止一次收到一条消息:
ReceiveMessage()时可以传递的值)【讨论】:
VisibilityTimeout。我的整个答案与您反复收到相同的消息有关,以及您可以尝试避免它的方法。