Почему сообщения 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 начальная конфигурация):
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;
}
Строка журнала «читать ...» никогда не появляется, когда это происходит, и именно это заставляет меня войти с консолью и посмотреть, есть ли сообщение там или нет, и оно есть.