¿Cómo preserva el orden de los mensajes cuando consume mensajes de ActiveMQ?

StackOverflow https://stackoverflow.com/questions/426532

  •  06-07-2019
  •  | 
  •  

Pregunta

Tengo un servicio .NET que usa el cliente ActiveMQ. He implementado un MessageListener con una conexión transaccionada para consumir los mensajes.

Ocasionalmente, recibo mensajes en un orden diferente en el que se colocaron en la cola.

¿Fue incorrecto usar un MessageListner? ¿Hay alguna manera de preservar el orden de los mensajes?

FYI: hay un productor que pone mensajes en la cola y un consumidor retira los mensajes de la cola.

¿Fue útil?

Solución 2

Más información: el servidor al que llamo es de terceros y no tengo control sobre los mensajes que envía. Lo sé, según los ID de los mensajes, que se colocan en el orden correcto. Además, en este sistema hay una diferencia entre ACK y Acknowledge. El ACK se recibe cuando mi mensaje original se coloca en el " saliente " cola. Luego monitorizo ??un "entrante" Cola para respuestas. Por lo general, recibo un "Reconocer" seguido de un " Pase " o un " Fail " ;. La ID de correlación para estos mensajes es la ID del mensaje del ACK.

Originalmente había usado un escucha de mensajes y respondí a un evento OnMessge. Abandoné este enfoque después de darme cuenta de que, utilizando este método, los mensajes se entregan de forma asincrónica y, por lo tanto, sin ningún orden en particular. Entonces, cambié mi código para sondear usando un temporizador (System.Threading.Timer) para llamar a consumer.Receive () y obtener un mensaje a la vez. Esto funciona de la manera que quiero.

Abro al consumidor una vez cuando se inicia el servicio y busco continuamente los mensajes.

Otros consejos

No debería tener que hacer nada para mantener el orden; esa es una de las cosas que una cola de mensajes hace por ti. Creo que si tiene un solo consumidor escuchando la cola y está procesando mensajes fuera de servicio, entonces ha encontrado un error o los mensajes no están en cola en el orden que cree que están.

Además, hay esta pregunta de las Preguntas frecuentes de ActiveMQ que podrían ayudar.

Editar: al leer los comentarios en la respuesta de duffymo , parece que estás un poco sobreingeniería. En general, una cola de mensajes como ActiveMQ, MQ Series, joram, etc. tiene dos características: entregan mensajes en el mismo orden en que están en cola y garantizan la entrega de mensajes. Enviar un mensaje ACK por separado es redundante; es un poco como confirmar una transacción de la base de datos, luego consultar la misma información para verificar que la base de datos realmente la haya almacenado.

Habiendo dicho eso, ¿su servidor es multiproceso? Si es así, es posible que ponga en cola la respuesta antes que ponga en cola el ACK.

¿Por qué es importante el orden de los mensajes? Un MessageListener no debería tener que preocuparse.

Si necesita un ID de correlación para que coincida con una respuesta con una solicitud en particular, ese es otro asunto. ¿A eso te refieres?

Todo lo que Jason acaba de decir. Algunas otras cosas a tener en cuenta. Estás manteniendo al consumidor abierto a muchos mensajes, ¿verdad? ¿No está creando un consumidor para algunos mensajes y luego lo está cerrando? Solo cerrar un consumidor hace que los mensajes asociados con un consumidor se vuelvan a poner en una cola que puede romper el orden.

¿Está relacionado con retrocesos? (¿Retrocede alguna transacción?).

Finalmente, siempre puede garantizar el orden utilizando un Resequencer para reordenar cosas para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top