当前位置: 首页 > 面试题库 >

Amazon SQS Long Polling不返回所有消息

董良策
2023-03-14
问题内容

我需要在读取的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是分布式系统。在“一旦发现问题后尽快返回”和“在整个系统中搜索所有可能的内容,直到客户将接受的最大消息数量”之间,可能会做出架构决定。这些选择似乎是合理的,大多数应用程序都希望更快地响应“尽快给我”。

您不知道自己实际上已经耗尽了队列,直到您从长轮询中得到空响应为止。



 类似资料:
  • 问题内容: 我在尝试为我的应用程序实现一些计数器时遇到了这种奇怪的行为。基本上,我做了一个这样的计数器表: 然后,我也想计算一些特定类型的消息,因此在Go应用程序中,我更改了表以添加以前没有的列。 我的应用程序正在增长,并且我开始有30列以上(不应超过50列),并且当我想检索所有这些计数器时,结果中缺少一些列。 这给我返回了30列超过34列的信息。虽然,当我在CQLSH上执行请求时: 我得到适当的

  • 问题内容: 我在MySQL中有以下查询: 该表有27行,但查询仅返回1行。基于 这个问题, 我认为可能是由于WHERE子句。该表具有字段id,属性,字段,值,其中是第三个表的外键(我不需要从中获取数据)。 有没有一种方法可以从第一个表中选择所有行,包括表#2中字段为23的值(如果没有字段23,则为NULL)? 问题答案: 当然。将WHERE条件移动到JOIN:

  • 我做了一个不和谐的机器人,想添加<代码>!我添加成员部分,但它返回1,但我的服务器有2个人成员和4机器人(所有我的)为什么?这是代码:

  • 我从sql检索数据并存储在列表中。然后我将它转换为GenericEntity并尝试使用response.Entity().build()返回它;但它只返回第一个项目。 我确认清单上包含了所有的项目。所以问题应该是列表到实体的转换和/或响应的返回。我尝试循环响应部分,但它没有工作。 List List=new arraylist<>();字符串stmt=“”;PreparedStatement PS

  • 在RoboMongo(0.9.0-RC09)中运行以下mongo查询会给出正确的文档数量(使用游标计数函数),而迭代所有文档只会返回一小部分文档: 我们是否需要专门配置查询以返回所有文档?

  • 我正在查询URI以从web服务获取一些数据。那很好。但我注意到,我的json hase多页的page\u计数,但只返回第一页数据。 以下是json的样子: 如何返回所有页面而不是只返回第一页?我知道这可能不是个好主意,但我该怎么做? 更新:web服务的URI类似于: 谢谢