SQS返回的消息多于队列大小

时间:2016-12-19 21:26:40

标签: amazon-web-services amazon-sqs

我创建了一个基本的非FIFO队列,并且只在其上放置了一条消息。我使用以下代码检索消息:

ReceiveMessageRequest request = new ReceiveMessageRequest();
request.setQueueUrl(queueUrl);
request.setMaxNumberOfMessages(10);
request.withMessageAttributeNames("All");
ReceiveMessageResult result = sqsClient.receiveMessage(request);
List<Message> messages = result.getMessages();

messages.size()给出3

他们有:

  • 相同的MessageId
  • 相同的身体和属性
  • 相同的MD5OfBody
  • 不同的ReceiptHandle

MaxNumberOfMessages从10更改为1会修复它,但我希望将来可以批量接收10个。

有人可以解释为什么它会检索更多的消息吗?

以下是我的队列配置:

Default visibility timeout = 0
message retention = 4 days
max message size = 256kb
delivery delay = 0
receive message wait time = 0
no redrive policy

2 个答案:

答案 0 :(得分:2)

@Michael的详细信息/补充 - sqlbot评论。

SQS visibility timeout设置为较小的值不会解决您的问题。你将再次遇到这个问题。使用30秒或更长时间以允许程序使用该消息。 (为了应对程序崩溃/意外程序延迟,您应该创建重新驱动策略以缓解问题。)

AWS已在At-Least-Once Delivery

中提及此问题
  

Amazon SQS会在多台服务器上存储您的邮件副本   冗余和高可用性。在极少数情况下,其中之一   存储邮件副本的服务器可能在您使用时不可用   接收或删除信息。

     

如果发生这种情况,则不会删除该邮件的副本   不可用的服务器,您可能会再次获得该邮件副本   接收消息。您应该将应用程序设计为幂等的   (处理时不应对它们产生不利影响   消息不止一次)。

答案 1 :(得分:0)

Default Visibility Timeout从0更改为1秒修复了问题