首页 文章

为什么SqS消息有时会在队列中保持在飞行状态

提问于
浏览
34

我以非常简单的方式使用Amazon SQS队列 . 通常,消息被写入并立即可见和读取 . 有时,会写入一条消息,并在队列中保持几分钟的飞行中(不可见) . 我可以从控制台看到它 . 接收消息等待时间为0,默认可见性为5秒 . 它将保持这种状态几分钟,或者直到新消息被写入以某种方式释放它 . 几秒钟的延迟是可以的,但超过60秒是不行的 .

有8个读取器线程总是很长的轮询,所以它不是没有尝试读取它的东西,它们是 .

Edit :要明确的是,消费者读取都没有返回任何消息,无论控制台是否打开,它都会发生 . 在这种情况下,只涉及一条消息,它只是位于消费者看不到的队列中 .

有没有其他人看到这种行为,我可以做些什么来改善它?

这是我正在使用的java的sdk:

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk</artifactId>
  <version>1.5.2</version>
</dependency>

这是执行读取的代码(max = 10,maxwait = 0启动配置):

void read(MessageConsumer consumer) {

  List<Message> messages = read(max, maxWait);

  for (Message message : messages) {
    if (tryConsume(consumer, message)) {
      delete(message.getReceiptHandle());
    }
  }
}

private List<Message> read(int max, int maxWait) {

  AmazonSQS sqs = getClient();
  ReceiveMessageRequest rq = new ReceiveMessageRequest(queueUrl);
  rq.setMaxNumberOfMessages(max);
  rq.setWaitTimeSeconds(maxWait);
  List<Message> messages = sqs.receiveMessage(rq).getMessages();

  if (messages.size() > 0) {
    LOG.info("read {} messages from SQS queue",messages.size());
  }

  return messages;
}

当发生这种情况时,“read ..”的日志行永远不会出现,它是什么原因导致我进入控制台并查看消息是否存在,它是 .

2 回答

  • 63

    听起来你错误地解释了你所看到的 .

    “在飞行中”的消息不是待处理的传递,它们是已经传递但消费者未进一步采取行动的消息 .

    如果邮件已发送到客户端但尚未删除或尚未到达其可见性窗口的末尾,则会考虑邮件 . - http://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/sqs-metricscollected.html

    当消费者收到消息时,它必须 - 在某些时候 - 删除消息,或者向该消息发送请求increase the timeout;否则超时到期后消息再次可见 . 如果消费者未能执行其中一项操作,则该消息将再次自动显示 . 可见性超时是消费者在必须完成其中一件事之前所拥有的时间 .

    消息不应该“在飞行中”而没有已经收到它们的东西 - 但是“某些东西”可以包括控制台本身,正如您在选择“查看/删除消息”中看到的弹出窗口中所注意到的那样 . 控制台(除非您已经选中了“不再显示此内容”复选框):

    在控制台停止轮询消息之前,控制台中显示的消息将不可用于其他应用程序 .

    当控制台从“查看/删除消息”屏幕观察队列时,控制台中显示的消息是“在飞行中” .

    如果您的默认可见性超时仅为5秒且代码中的任何内容都没有增加超时时间,那么没有明显意义的部分就是“几分钟内”正在传递的消息......但是......这几乎可以完全解释为您的消费者没有正确处理消息,导致消息超时并立即被重新传递,给人的印象是消息的单个实例仍然在飞行中,而事实上,消息正在短暂地转换回可见,只是为了其他消费者几乎立即声称,再次将其带回飞机 .

  • 1

    发送或锁定消息时可能会发生这种情况,并在几秒钟内尝试获取新的消息列表 . Amazon SQS将数据存储到多个服务器和多个数据中心http://aws.amazon.com/sqs/faqs/#How_reliably_is_my_data_stored_in_Amazon_SQS .

    要摆脱这些问题,您需要等待更多,以便队列有更多时间来提供适当的结果 .

相关问题