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