为什么我的 Amazon SQS FIFO 队列未返回所有消息或其他消息组中的消息?

上次更新日期:2021 年 8 月 26 日

当我调用 ReceiveMessage API 时,我的 Amazon Simple Queue Service (Amazon SQS) 先进先出 (FIFO) 队列未返回一些消息。为什么我的 SQS FIFO 队列未返回来自特定消息组 ID 或其他消息组的所有消息?

解决方法

对于 FIFO 队列,您不能请求接收来自特定消息组 ID 的消息。当您在 ReceiveMessage API 调用中指定 MaxNumberOfMessages 参数时,SQS 会返回具有相同消息组 ID 的尽可能多消息。然后,其他消费者或其他 ReceiveMessage 调用可以处理具有不同消息组 ID 的消息。

对于 FIFO 队列,当您收到属于特定消息组 ID 的消息时,请注意以下事项:

  • 在接收来自同一组 ID 的更多消息之前,必须删除或移动当前接收调用中的消息。
    注意:必须从飞行可用状态移动消息。
  • 您无法在其他消息组中接收消息。

FIFO 队列查看前 20,000 条消息以确定可用的消息组。如果前 20,000 条消息中的所有消息组由于处于飞行状态的消息而被阻止,那么前 20,000 条消息以外来自其他组的消息将不会返回。有关更多信息,请参阅避免大量积压具有相同组 ID 的消息

示例 A

FIFO 队列共有 20,001 条消息。前 20,000 条消息属于消息组 1,最后一条消息属于消息组 2。当您尝试接收来自队列的消息时,只会收到来自组 1 的消息。任何连续的 ReceiveMessage 调用都会导致空接收。发生这种情况的原因是 FIFO 只查看属于组 1 的消息,并且该组被当前调用阻止。

示例 B

FIFO 队列总共有 20,000 条消息。前 19,999 条消息属于消息组 1,最后一条消息属于消息组 2。当您尝试从队列接收消息时,第一个 ReceiveMessage 调用会收到属于组 1 的消息。第二个 ReceiveMessage 调用会收到属于组 2 的消息。任何额外的 ReceiveMessage 调用都会导致空接收,因为两个组现在都被当前调用阻止。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?