Подтвердить что ты не робот

Почему сообщения SqS иногда остаются в полете в очереди

Я использую очереди Amazon SQS очень простым способом. Обычно сообщения записываются и сразу видны и читаются. Иногда сообщение записывается и остается в полете (не видимым) в очереди в течение нескольких минут. Я вижу это с консоли. Время ожидания приема-сообщения равно 0, а по умолчанию - 5 секунд. Он будет оставаться таким образом в течение нескольких минут или до тех пор, пока не появится новое сообщение, которое каким-то образом освободит его. Задержка в несколько секунд - это нормально, но более 60 секунд не работает.

Там есть 8 потоков читателей, которые всегда являются длинными опросами, поэтому его не то, что что-то не пытается прочитать, они есть.

Изменить. Чтобы быть ясным, ни один из прочитанных потребителей не возвращает никаких сообщений вообще, и это происходит независимо от того, открыта ли консоль или нет. В этом случае задействовано только одно сообщение, и оно просто сидит в очереди, невидимой для потребителей.

Кто-нибудь еще видел это поведение и что я могу сделать, чтобы его улучшить?

Вот sdk для java, который я использую:

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

Вот код, который выполняет чтение (max = 10, maxwait = 0 startup config):

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;
}

Строка журнала для "читать.." никогда не появляется, когда это происходит, и что это заставляет меня заходить в консоль и посмотреть, есть ли там сообщение или нет, и это так.

4b9b3361

Ответ 1

Похоже, вы неверно истолковываете то, что видите.

Сообщения "в полете" не находятся в ожидании доставки, это сообщения, которые уже были доставлены, но не более подвержены действию потребителя.

Сообщения рассматриваются в полете, если они были отправлены клиенту, но еще не удалены или еще не достигли конца окна видимости.

http://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/sqs-metricscollected.html

Когда потребитель получает сообщение, он должен - в какой-то момент - либо удалить сообщение, либо отправить запрос увеличить таймаут для этого сообщения; в противном случае сообщение становится видимым снова после истечения таймаута. Если потребитель не выполняет одно из этих действий, сообщение автоматически становится видимым снова. Тайм-аут видимости - это то, как долго потребитель должен выполнить одно из этих действий.

Сообщения не должны быть "в полете" без того, что уже получили их, но это "что-то" может включать в себя самую консоль, как вы заметите во всплывающем окне, которое вы видите при выборе "Просмотр/удаление сообщений" "в консоли (если вы уже не отметили флажок" Не показывать это снова "):

Сообщения, отображаемые на консоли, не будут доступны другим приложениям, пока консоль не прекратит опрос сообщений.

Сообщения, отображаемые на консоли, находятся "в полете" , когда консоль наблюдает за очередью на экране "Просмотр/удаление сообщений".

Часть, которая не имеет очевидного смысла, - это сообщения, которые находятся в полете "в течение нескольких минут", если ваш тайм-аут видимости по умолчанию составляет всего 5 секунд, и ничто в коде не увеличивает этот тайм-аут... однако... это можно объяснить почти идеально, чтобы ваши потребители не правильно распоряжались сообщением, вызывая его тайм-аут и сразу же переводились, создавая впечатление, что один экземпляр сообщения оставался в полете, когда на самом деле сообщение коротко переходит обратно на видимое, только для того, чтобы потребовать почти сразу другого потребителя, возвращая его снова в полете.

Ответ 2

Это может случиться, когда вы отправляете или блокируете сообщение, и через несколько секунд вы пытаетесь получить свежий список сообщений. Amazon SQS хранит данные на нескольких серверах и в нескольких центрах обработки данных http://aws.amazon.com/sqs/faqs/#How_reliably_is_my_data_stored_in_Amazon_SQS.

Чтобы избавиться от этих проблем, вам нужно подождать больше, чтобы у очереди было больше времени, чтобы дать соответствующие результаты.