SQS returns 多于 queue 大小的消息
SQS returns more messages than queue size
我创建了一个基本的 non-FIFO queue,并且只在上面放了 1 条消息。我使用以下代码检索消息:
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
- 相同body和属性
- 相同的 MD5OfBody
- 不同的收据句柄
将 MaxNumberOfMessages
从 10 更改为 1 修复了它,但我想在以后批量接收 10 个。
有人可以解释为什么它检索的邮件比应有的多吗?
下面是我的queue配置:
Default visibility timeout = 0
message retention = 4 days
max message size = 256kb
delivery delay = 0
receive message wait time = 0
no redrive policy
将 Default Visibility Timeout
从 0 秒更改为 1 秒解决了问题
@Michael 的详细信息/补充 - sqlbot 评论。
将 SQS visibility timeout 设置为较小的值不会解决您的问题。你会再次遇到这个问题。使用 30 秒或更长时间以允许您的程序使用该消息。 (为了满足程序 crashes/unexpected 程序延迟,您应该创建重新驱动策略来缓解问题。)
AWS 在 At-Least-Once Delivery
中提到了这一点
Amazon SQS stores copies of your messages on multiple servers for
redundancy and high availability. On rare occasions, one of the
servers that stores a copy of a message might be unavailable when you
receive or delete a message.
If this occurs, the copy of the message will not be deleted on that
unavailable server, and you might get that message copy again when you
receive messages. You should design your applications to be idempotent
(they should not be affected adversely when processing the same
message more than once).
我创建了一个基本的 non-FIFO queue,并且只在上面放了 1 条消息。我使用以下代码检索消息:
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
- 相同body和属性
- 相同的 MD5OfBody
- 不同的收据句柄
将 MaxNumberOfMessages
从 10 更改为 1 修复了它,但我想在以后批量接收 10 个。
有人可以解释为什么它检索的邮件比应有的多吗?
下面是我的queue配置:
Default visibility timeout = 0
message retention = 4 days
max message size = 256kb
delivery delay = 0
receive message wait time = 0
no redrive policy
将 Default Visibility Timeout
从 0 秒更改为 1 秒解决了问题
@Michael 的详细信息/补充 - sqlbot 评论。
将 SQS visibility timeout 设置为较小的值不会解决您的问题。你会再次遇到这个问题。使用 30 秒或更长时间以允许您的程序使用该消息。 (为了满足程序 crashes/unexpected 程序延迟,您应该创建重新驱动策略来缓解问题。)
AWS 在 At-Least-Once Delivery
中提到了这一点Amazon SQS stores copies of your messages on multiple servers for redundancy and high availability. On rare occasions, one of the servers that stores a copy of a message might be unavailable when you receive or delete a message.
If this occurs, the copy of the message will not be deleted on that unavailable server, and you might get that message copy again when you receive messages. You should design your applications to be idempotent (they should not be affected adversely when processing the same message more than once).