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

I'm getting same multiple Sqs message before visibility timeout

我将可见性超时设置为 12 小时,最大消息数为 3,延迟时间为 15 分钟,几分钟后我收到了 sqs 消息,我再次收到相同的消息。

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

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

这些消息将被标记为不可见正在发送。这意味着消息仍在队列中,但不会通过另一个 ReceiveMessage() 调用返回。这些消息将在一段时间内保持不可见状态。默认时间段在队列上 ("Default Visibility Timeout") 或在检索消息时 (VisibilityTimeout) 配置。

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

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

可能一条消息可能从 Amazon SQS 中多次检索。这种情况很少见,但在有多个进程同时检索消息的情况下可能会发生。因此,SQS 为 "At least once delivery"。如果这是一个问题,您可以使用 FIFO 队列(并非在每个地区都可用),这将保证每条消息只传递一次,但 FIFO 队列存在吞吐量限制。

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

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