amq - Cambio de ActiveMQ a RabbitMQ
aws amq (4)
RabbitMQ es un agente de AMQP, mientras que ActiveMQ es un JMS. Le sugiero que lea el artículo de wikipedia de AMQP para tener una idea de los conceptos utilizados en AMQP, que son diferentes a los que ya conoce en JMS. Una de las principales diferencias es que en AMQP un productor envía a un intercambio sin conocer la estrategia real de distribución de mensajes, mientras que en JMS el productor se dirige a una cola o a un tema (por lo tanto, es consciente del tipo de enrutamiento de mensajes implementado). Por lo tanto, es difícil saber qué se hace mejor o peor, ya que la semántica es muy diferente entre JMS y AMQP.
Las colas e intercambios de RabbitMQ se configuran a través del protocolo AMQP, por lo que una biblioteca cliente le permite configurar todos sus destinos y su comportamiento. ActiveMQ requiere una configuración de destino específica porque la especificación JMS no cubre ninguno de los aspectos administrativos. Además de eso, la configuración del sistema de RabbitMQ es Erlang-esque, mientras que ActiveMQ generalmente se configura en XML. Así que tendrás que acostumbrarte a la {tupla} y <> la hermosa sintaxis. Por lo general, RabbitMQ se instala con paquetes de SO, mientras que las distribuciones de ActiveMQ son archivos que se descargan en cualquier lugar (o Maven se incrusta en otra cosa).
Muy bien :) Ver Primavera AMQP .
Actualmente estoy usando ActiveMQ para mis necesidades de mensajería; Aparte de algunos fallos de db, ha funcionado bien. Sin embargo, al menos estoy considerando probar RabbitMQ. Pero antes de hacerlo, me gustaría entender lo siguiente:
- ¿En qué se diferencia RabbitMQ de ActiveMQ? ¿Qué hace RabbitMQ mejor o peor que ActiveMQ?
- Comparativamente, ¿qué tan fácil / difícil es configurar RabbitMQ?
- ¿Qué tan bien integrado está RabbitMQ con Spring?
- Con ActiveMQ, simplemente
JmsTemplate
un bean de fábrica de conexión a unaJmsTemplate
y uso los beansDefaultMessageListener
para conectar colas a sus respectivos manejadores. ¿Puedo esencialmente hacer lo mismo con RabbitMQ?
- Con ActiveMQ, simplemente
AMQP es un estándar de nivel de aplicación para Message Middleed Middleware (MOM). JMS es una API estándar para Java para comunicarse con MOM.
Dos aplicaciones Java diferentes que usan JMS podrían estar usando MOM diferente y, por lo tanto, aún no pueden comunicarse. ActiveMQ es un sistema MOM con una biblioteca JMS que permite que los programas Java accedan a él utilizando JMS, pero no necesariamente puede comunicarse con otro programa Java JMS utilizando, por ejemplo, WebLogic MOM.
Los diferentes sistemas AMQP MOM pueden interoperar entre sí (asumiendo que están usando la misma versión de AMQP) ya que AMQP es un estándar en la misma línea que, digamos, SMTP. No hay razón para que un sistema AMQP MOM no pueda proporcionar también una biblioteca JMS para sus clientes Java. SwiftMQ, por ejemplo, proporciona una API JMS y utiliza AMQP 1.0.
Desafortunadamente, no todos los sistemas AMQP (y hay muchos) están utilizando la versión 1.0 de AMQP todavía. RabbitMQ (en el momento de escribir este artículo) aún no ofrece soporte para AMQP 1.0. Algunos de los otros sistemas AMQP son Apache QPID y StormMQ, pero hay muchos otros. Una vez que todos estos son compatibles con AMQP 1.0, entonces todos deben ser interoperables entre sí.
En su sitio en activemq.apache.org/amqp.html , ActiveMQ dice: "Esperamos que ActiveMQ implemente la última versión, una vez que esté finalizada. Pero, en este momento, ActiveMQ no implementa AMQP". Ahora que AMQP 1.0 está disponible, no hay más información de ActiveMQ sobre cuándo lo admitirán.
Dado que RabbitMQ es un agente de AMQP donde la configuración se maneja en gran parte a través de AMQP, la mayoría de sus preguntas no tienen ningún sentido.
Un problema difícil con RabbitMQ es que muchos paquetes de sistemas operativos están en 1.72, que está lamentablemente desactualizado. Usted haría mucho mejor para obtener un paquete .deb o .rpm de RabbitMQ 2.51 directamente desde su sitio. Después de eso, la única configuración que realmente necesita hacer fuera de AMQP, es crear vhosts y permisos de usuario usando rabbitmqctl. O bien, puede descargar los complementos .ez para la consola de administración web y colocarlos en el directorio correcto antes de reiniciar RabbitMQ. Esta consola de administración web es altamente recomendada si está usando 2.51, pero es imposible si está atascado con los 1.72 predeterminados con los que Debian y Ubuntu lo enfrentan.
Una vez que tenga RabbitMQ en ejecución, puede usar cualquier idioma y cualquier biblioteca AMQP. Personalmente he tomado un sistema Python usando pika, amqplib y kombu. Ahora estoy usando haigha y la biblioteca Java de Scala, todos hablando entre ellos a través de AMQP (y el agente MQ, por supuesto).
La comparación de los conceptos JMS / AMQP para comparar ActiveMQ y RabbitMQ no es lo más importante: ActiveMQ habla AMQP, y hay un cliente JMS para RabbitMQ en la edición comercial (se llamó vFabric RabbitMQ). Sin embargo, algunos conceptos de AMQP (claves de enrutamiento) pueden ser útiles en algunos casos de uso.
He usado ambos y me gustan los dos
- Se encontró que Erlang + RabbitMQ es más difícil de instalar en algunos sistemas (repositorios de paquetes obsoletos) que Java + ActiveMQ
- RabbitMQ tiene algunas opciones agradables de agrupación en clúster / HA (colas duplicadas, federación de agrupación). No hay necesidad de un ZooKeeper compartido o una base de datos compartida, pero uno debe hacerse cargo del problema del "cerebro dividido".
- ActiveMQ es más pesado (consumo de memoria)
- ActiveMQ está perfectamente integrado con Apache Camel, con RabbitMQ es mejor que uses Spring Integration (Camel RabbitMQ / AMQP es un poco burdo)
- ActiveMQ admite transacciones XA, se puede incrustar en aplicaciones Java, se puede incrustar Camel.
- Las pruebas automatizadas de Java con ActiveMQ son más fáciles (agente integrado)