在可见性超时之前,我得到相同的多个Sqs消息

时间:2017-07-17 02:13:05

标签: amazon-web-services amazon-sqs

我将可见时间设置为12小时,最大消息为3,延迟时间为15分钟,我自动获得相同消息后几分钟得到sqs消息。

为什么我会在没有超时的情况下获得多个sqs消息? 在可见性超时后,它会删除队列中的消息或再次发送sqs消息吗?

1 个答案:

答案 0 :(得分:6)

在Amazon SQS队列上调用ReceiveMessage()时,将从队列中检索最多10条消息(可配置)。

这些消息将标记为隐身飞行中。这意味着消息仍在队列中,但不会通过另一个ReceiveMessage()调用返回。消息将在一段时间内保持不可见。默认时间段在队列上配置("默认可见性超时")或检索邮件时(VisibilityTimeout)。

当应用程序处理完一条消息后,它应该调用DeleteMessage(),并传递随消息提供的MessageHandle。然后,该消息将从队列中删除

如果在删除邮件之前隐身期限到期,它将再次放入队列,应用程序可以再次检索它。因此,请务必将您的隐身超时设置为比应用程序正常处理邮件所需的时间更长。

可能消息可能会从Amazon SQS 多次检索。这种情况很少见,但可能会发生多个进程同时检索邮件的情况。因此,SQS是"至少一次交付"。如果这是一个问题,您可以使用 FIFO队列(在每个区域都不可用),这将保证每条消息只传送一次,但FIFO队列有吞吐量限制。

因此,如果您不止一次收到消息:

  • 您应该检查隐身超时设置(默认设置和拨打ReceiveMessage()时可以传递的值)
  • 考虑使用 FIFO队列
  • 让您的应用程序在再次处理之前检查消息是否已经处理(例如,通过唯一ID