kap*_*abo 8 java queue amazon-sqs amazon-web-services 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();
Run Code Online (Sandbox Code Playgroud)
我在队列中有3条消息,每次运行代码时都得到不同的结果,有时候我得到所有3条消息,有时只有1条.可见性超时我设置为2秒,只是为了消除消息变得不可见的原因因为没有在阅读中看到它们.这是短轮询的预期行为.长轮询应该可以消除多个民意调查.我在这里做错了吗?
谢谢
Mic*_*bot 24
长轮询应该可以消除多个民意调查
不,当实际可用的消息时,长轮询应该消除大量的空轮询和错误的空响应.SQS中的长时间民意调查不会等待最长的等待时间,只是寻找更多的东西返回,或者一旦发现某些东西就继续搜索.在SQS长轮询只等待足够长的时间来寻找的东西:
"长轮询允许Amazon SQS服务在发送响应之前等待队列中的消息可用.因此,除非连接超时,否则对ReceiveMessage请求的响应将包含至少一个可用消息(如果有),并且最多包含ReceiveMessage调用中请求的最大数量."
- http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html (重点补充)
因此,SQS找到并返回的"某些东西"可能是所有消息(直到最大值)或消息的子集,因为正如已经提到的,SQS是一个分布式系统.可能会在"一旦找到某些东西后尽快返回"和"在整个系统中搜索所有可能的内容,直到客户端将接受的最大消息数量"之间做出架构决策......并且,给出对于那些替代方案,大多数应用程序更喜欢"尽可能快地尽我所能地给你"的响应速度更快.
在从长轮询中获得空响应之前,您不知道自己实际上已经耗尽了队列.
| 归档时间: |
|
| 查看次数: |
7680 次 |
| 最近记录: |