Почему сообщения 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;
}
Строка журнала для "читать.." никогда не появляется, когда это происходит, и что это заставляет меня заходить в консоль и посмотреть, есть ли там сообщение или нет, и это так.
Ответы
Ответ 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.
Чтобы избавиться от этих проблем, вам нужно подождать больше, чтобы у очереди было больше времени, чтобы дать соответствующие результаты.