¿Por qué los mensajes SqS a veces permanecen en vuelo en la cola?
Estoy usando las colas de Amazon SQS de una manera muy simple. Por lo general, los mensajes se escriben y se ven y se leen inmediatamente. Ocasionalmente, un mensaje se escribe y permanece en vuelo (no visible) en la cola durante varios minutos. Puedo verlo desde la consola. El tiempo de espera del mensaje de recepción es 0 y la visibilidad predeterminada es de 5 segundos. Permanecerá así durante varios minutos o hasta que se escriba un nuevo mensaje que de alguna manera lo libere. Un retraso de unos segundos está bien, pero más de 60 segundos no está bien.
Hay 8 hilos de lectura que son siempre largos, por lo que no es que algo no esté intentando leerlo, lo son.
Editar : Para ser claros, ninguna de las lecturas del consumidor está devolviendo mensajes y sucede independientemente de si la consola está abierta o no. En este escenario, solo hay un mensaje involucrado, y solo está sentado en la cola invisible para los consumidores.
¿Alguien más ha visto este comportamiento y qué puedo hacer para mejorarlo?
Aquí está el SDK para Java que estoy usando:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.5.2</version>
</dependency>
Aquí está el código que hace la lectura (max = 10, maxwait = 0 configuración de inicio):
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;
}
La línea de registro para "leer ..." nunca aparece cuando esto está sucediendo, y es lo que hace que entre con la consola y vea si el mensaje está allí o no, y lo está.