sqs sns que programa pricing precio chile aws amazon-web-services amazon-sqs

amazon web services - sns - ¿Por qué los mensajes SqS a veces permanecen en vuelo en cola?



sqs que es (2)

Parece que estás malinterpretando lo que estás viendo.

Los mensajes "en vuelo" no están pendientes de entrega, son mensajes que ya han sido entregados pero el consumidor no los ha cumplido.

Los mensajes se consideran en vuelo si se han enviado a un cliente pero aún no se han eliminado o si aún no han llegado al final de su ventana de visibilidad.

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

Cuando un consumidor recibe un mensaje, tiene que, en algún momento, eliminar el mensaje o enviar una solicitud para aumentar el tiempo de espera para ese mensaje; de lo contrario, el mensaje vuelve a ser visible una vez que expira el tiempo de espera. Si un consumidor no puede hacer una de estas cosas, el mensaje vuelve a ser visible automáticamente. El tiempo de espera de visibilidad es cuánto tiempo tiene el consumidor antes de que se deba hacer una de estas cosas.

Los mensajes no deben estar "en vuelo" sin algo que ya los haya recibido, pero ese "algo" puede incluir la consola en sí, como se verá en la ventana emergente que aparece cuando elige "Ver / Eliminar mensajes" en el consola (a menos que ya haya marcado la casilla "No mostrar esto de nuevo"):

Los mensajes que se muestran en la consola no estarán disponibles para otras aplicaciones hasta que la consola deje de sondear los mensajes.

Los mensajes que se muestran en la consola están "en vuelo" mientras la consola está observando la cola desde la pantalla "Ver / Eliminar mensajes".

La parte que no tiene sentido obvio es que los mensajes estén en vuelo "durante varios minutos" si el tiempo de espera de visibilidad predeterminado es de solo 5 segundos y nada en el código aumenta el tiempo de espera ... sin embargo ... eso podría explicarse casi perfectamente por sus consumidores no desechan correctamente el mensaje, lo que hace que se agote el tiempo de espera y se vuelva a entregar inmediatamente, dando la impresión de que una sola instancia del mensaje permaneció en vuelo, cuando de hecho, el mensaje está pasando brevemente a visible, solo para ser reclamado casi inmediatamente por otro consumidor, llevándolo de nuevo a vuelo.

Estoy usando las colas de Amazon SQS de una manera muy simple. Por lo general, los mensajes se escriben y son inmediatamente visibles y leídos. Ocasionalmente, se escribe un mensaje 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 siempre son largos, por lo que no es que algo no intente leerlo, lo son.

Editar : para que quede claro, ninguna de las lecturas de los consumidores está devolviendo ningún mensaje y ocurre independientemente de si la consola está abierta o no. En este escenario, solo se trata de un mensaje, y está simplemente 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 sucede, y es lo que me lleva a entrar con la consola y ver si el mensaje está allí o no, y así es.


Puede suceder cuando envía o bloquea un mensaje y en unos segundos intenta obtener la nueva lista de mensajes. Amazon SQS almacena los datos en múltiples servidores y en múltiples centros de datos http://aws.amazon.com/sqs/faqs/#How_reliably_is_my_data_stored_in_Amazon_SQS .

Para deshacerse de estos problemas, debe esperar más para que la cola tenga más tiempo para dar los resultados adecuados.