【问题标题】:Can't see/receive all messages from AWS SQS无法查看/接收来自 AWS SQS 的所有消息
【发布时间】:2020-09-13 22:45:46
【问题描述】:

我有一个 FIFO SQS 队列,我一个接一个地发送 4 条消息。 在发送前 4 条消息后,我运行了一个程序来接收它们,但只返回了 2 条消息——即使是长轮询并且最大消息 = 10。

我又发送了 4 条消息 - 现在我总共有 8 条消息。用于接收消息的 AWS SQS UI 和我用于接收消息的代码 - 仅显示 2 条消息,但表示有 8 条消息可用。

再发送 4 条消息后,您可以在随附的屏幕截图中看到 SQS UI 显示 12 条消息可用,但仅列出 2 条消息,我有 C# 代码来接收消息,使用长轮询,也只返回 2 条消息.

我做错了什么,我可以看到所有可用的消息?

【问题讨论】:

  • 您应该查看Visibility Timeout,当一个消费者查看一条消息时,即使该消息仍在队列中(并且被视为可用),它也是其他消费者看不到。例如,如果您尝试通过 Web 控制台轮询队列并同时使用您的程序使用队列,则控制台中显示的所有消息都将无法用于您的程序,反之亦然在可见性超时期间。
  • 是否有任何消息共享相同的消息组 ID?如果是这样,这将解释您所看到的。
  • @Andre.IDK - 是的,好点 - 当我从 SQS UI 查看队列时,我确保没有程序从队列中读取。它是 5 秒。
  • @JohnRotenstein - 是的,所有消息共享相同的消息组 ID。是好还是坏? :))

标签: amazon-web-services amazon-sqs


【解决方案1】:

您需要使用 ReceiptHandle 删除该消息以获取其他消息。 FIFO 队列保证在消息组内的顺序,并且在处理之前的消息之前不会传递消息。您只看到一些消息,而没有看到其他消息,因为它们是其消息组队列中的第一个。

我之前遇到过它,blogged about 它是如何工作的。

【讨论】:

  • 哦,有趣,我不知道这个。让我读一下你的博客,我会尝试删除那些我能看到的!谢谢
【解决方案2】:

您必须选择使用先进先出 (FIFO) 队列。

为确保以正确的顺序处理消息,如果当前正在处理具有相同消息组 ID 的消息,则无法检索 具有相同消息组 ID 的消息。否则,消息可能会被乱序处理。

这就是为什么您请求更多消息并没有返回任何消息的原因。

如果您只是希望消息按 FIFO 顺序排列,而不需要在消息组中进行特定排序,建议您提供一个随机消息组 ID,以便可以单独处理每条消息。

见:Amazon SQS FIFO (First-In-First-Out) queues - Amazon Simple Queue Service

【讨论】:

  • 对 FIFO 队列中的每条消息使用随机消息组 ID 与使用非 FIFO 队列实际上是一样的吗?然而,在文档 (docs.aws.amazon.com/AWSSimpleQueueService/latest/…) 中,它说属于不同消息组的消息可能会被乱序处理
  • 具有相同消息组ID的消息将按顺序该组消息中进行处理。如果它们有随机 ID,那么它们将按顺序从队列中取出而不会阻塞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 2017-05-29
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
相关资源
最近更新 更多