Amazon SQS Long Polling不返回所有消息
问题内容:
我需要在读取的1次中读取Amazon SQS队列中的所有消息,然后根据创建的时间戳对其进行排序并对其进行业务逻辑。
为了确保检查所有SQS主机是否有消息,我启用了长轮询。我这样做的方法是将队列的默认等待时间设置为10秒。(任何大于0的值都将启用长轮询)。
但是,当我尝试读取队列时,它仍然无法提供所有消息,因此我必须进行多次读取才能获取所有消息。我什至对每个接收请求通过代码启用了长时间轮询,但仍然无法正常工作。下面是我正在使用的代码。
AmazonSQSClient sqsClient = new AmazonSQSClient(new ClasspathPropertiesFileCredentialsProvider());
sqsClient.setEndpoint("sqs.us-west-1.amazonaws.com");
String queueUrl = "https://sqs.us-west-1.amazonaws.com/12345/queueName";
ReceiveMessageRequest receiveRequest = new ReceiveMessageRequest().withQueueUrl(queueUrl).withMaxNumberOfMessages(10).withWaitTimeSeconds(20);
List<Message> messages = sqsClient.receiveMessage(receiveRequest).getMessages();
我在队列中有3条消息,每次我运行代码时,我都会得到不同的结果,有时我获得全部3条消息,有时只有1条消息。我将可见性超时设置为2秒,这是为了消除导致消息不可见的原因在阅读中看不到它们。这是短期轮询的预期行为。长轮询应该消除多个轮询。我在这里做错什么吗?
谢谢
问题答案:
长时间轮询应该消除多次轮询
不,长轮询应该消除实际可用的消息时的大量空轮询和虚假的空响应。在SQS中进行长时间的调查不会坐下来等待最大的等待时间,只是寻找更多的东西返回,或者一旦找到东西就继续搜索。在SQS中进行长时间轮询只能等待足够长的时间才能找到
一些东西 :
“ 长轮询允许Amazon SQS服务等待直到队列中有消息可用,然后再发送响应。因此,除非连接超时,否则对
ReceiveMessage请求的响应将包含至少一个可用消息(如果有),并且最多包含ReceiveMessage调用中请求的最大数目。
”—
http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-
long-polling.html
(添加了重点)
因此,SQS查找并返回的 “内容”
可能是所有消息(最大),或者是消息的子集,因为如上所述,SQS是分布式系统。在“一旦发现问题后尽快返回”和“在整个系统中搜索所有可能的内容,直到客户将接受的最大消息数量”之间,可能会做出架构决定。这些选择似乎是合理的,大多数应用程序都希望更快地响应“尽快给我”。
您不知道自己实际上已经耗尽了队列,直到您从长轮询中得到空响应为止。