AMQP y JMS

AMQP son las siglas para Advanced Message Queuing Protocol.

Este es un protocolo de la capa de aplicación. Osea de nivel 7 en el modelo de referencia OSI, está al nivel de HTTP, DHCP, SSH, etc.

Considero que realmente hacia falta un protocolo para esto, ya que hasta el momento cada cual le hacía como le daba la gana, sin tener ningún estándar, lo que amarra a las aplicaciones que usan servicios de mensajería en la capa de middleware. Es cierto, es cierto, ya existía JMS pero JMS aunque sí es una especificación, es más bien una especificación de una API más que de un protocolo.

¿Qué tiene de malo que los sistemas estén casados con cierta implementación de servicios de mensajería?

Que esos sistemas carecen de interoperabilidad, no podría interactuar con otros sistemas (al menos no sería para nada sencillo).

La gran ventaja de AMQP es que permite interoperabilidad entre diferentes sistemas, cada vez es más necesario, y me sorprende que antes no haya existido un estándar para los servicios de mensajería. Qué güeva si para navegar en sitios web hosteados en Apache sólo pudiera hacerlo desde Firefox, y para los hostados en IIS fuera de fuerzas IE, para los hosteados en Cherokee sólo se pudiera con Opera, y así…Pues esto es más o menos lo que sucedía o mejor dicho sucede con el middleware.

Hay que tener claro que JMS y AMQP son cosas diferentes, sin embargo se puede usar AMQP mediante JMS.

JMS es unicamente para Java, AMQP es independiente del lenguaje, y de la implementación (al menos debería de serlo).

¿Qué especifica AMQP?

Los mensajes, las colas, el ruteo de los mensajes, y la seguridad.

¿Cúales son los principales elementos de AMQP?

  • Broker: El servidor.
  • Colas: Lugares para poner y de donde consumir mensajes.
  • Clientes: Entes que producen y/o consumen mensajes.
  • Exchanges: Espacios. Una analogía con discos duros: las colas serían el disco duro y los exchanges particiones.
    • Directo: Un productor pone mensajes, un consumidor los consume.
    • Tema: Los consumidores y/o productores están suscritos a temas.
    • Fanout: Permite relaciones uno a muchos.

¿Qué opciones hay?

Varias, las que he usado son: Qpid y RabbitMQ.

Ambas son buenas.

Qpid: Al principo se esperaba que ActiveMQ soportara AMQP, ahora es independiente, lo bueno es que tiene soporte muy completo para JMS.

RabbitMQ: Aunque tiene API para clientes en Java no me agrada, el soporte para JMS no luce completo; lo bueno: el broker implementado en erlang, fácil administración, buena arquitectura. Si el soporte para JMS no es muy importante recomiendo esta opción. Recientemente comprada por Spring.

HornetQ: Implementación de JBoss, soporta JMS como AMQP. Estará incluida como JMS broker por default en JBoss AS.

¿Cómo empezar con AMQP?

Levantar un broker, usar clientes.

Así nada más. Después de levantar el broker no empezaba con los clientes porque buscaba configurar las colas, exchanges, etc en el broker, busacaba y buscaba pero no encontraba archivos de configuración. Y es que no son necesarios, las colas y los exchanges se crean programaticamente, es decir son creados por los clientes.

¿Si las colas y exchanges son creados por los clientes que pasa si algo le sucede al broker?

Está definido por AMQP, hay diferentes escenarios, esto se define al momento que se crean. Pueden o no persistir a reinicios del broker.

Algunos links que pueden ser de utilidad:

http://www.amqp.org

http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol

http://crad.tumblr.com/post/196979154/the-attention-deficit-disorder-guide-to-rabbitmq