AMQP: conoce el Advanced Message Queuing Protocol

Los servicios deben ser capaces de comunicarse entre sí. Se intercambia información y se transmiten datos. Para muchos puede sonar más fácil de lo que realmente es, ya que en este tipo de conversaciones entre diversas aplicaciones es preciso superar varias dificultades. En informática también existen barreras lingüísticas (en forma de varios lenguajes de programación) y es preciso mantener un protocolo para evitar el caos.

Advanced Message Queuing Protocol (abreviado como AMQP) se presenta como una solución: un protocolo común que pueda transportar la información a través de un intermediario. ¿Cómo funciona? ¿Qué más puede hacer el estándar AMQP?

¿Para qué se necesita AMQP?

Advanced Message Queuing Protocol lleva desarrollándose desde 2003 y es una excepción, pues no proviene de una empresa dedicada a la tecnología, sino que fue concebido inicialmente en JPMorgan Chase, un banco estadounidense. Allí fue donde decidieron seguir desarrollando el proyecto con otros socios. Además de empresas tecnológicas como Cisco, es sobre todo el sector financiero el que sigue interesándose por AMQP. ¿Por qué ocurre esto? Porque para ellos el tiempo es dinero: la transmisión de la información es fundamental para un banco, una empresa de tarjetas de crédito o una bolsa de valores, lugares donde intercambian cientos de miles de mensajes por segundo. Es por eso que puede resultar caro que los mensajes lleguen tarde o directamente no lleguen.

Dado que en aquel momento ningún producto comercial era capaz de cumplir los requisitos de forma satisfactoria, se tomó la decisión (John O'Hara como director del proyecto) de desarrollar un protocolo propio. O'Hara se basó en los estándares de código abierto como TCP/IP y decidió que AMQP también fuese libre, para así impulsar el desarrollo del protocolo. Mientras tanto, un grupo de trabajo de OASIS (organización sin ánimo de lucro) trabajaba en el desarrollo del protocolo.

El protocolo AMQP resuelve varios problemas al mismo tiempo: por un lado, el protocolo (en colaboración con un bróker de mensajería) se encarga de una transmisión sólida de datos. Por otro, AMQP permite almacenar mensajes en una cola. Esto, a su vez, permite una comunicación asíncrona: transmisor y receptor no deben actuar al mismo ritmo. El receptor (consumidor) del mensaje no tiene por qué aceptar, procesar la información directamente y confirmar la recepción al emisor (productor). En su lugar, recuperará el mensaje de la cola cuando tenga capacidad disponible para ello. Esto ofrece al productor, entre otras cosas, la posibilidad de seguir trabajando y se evitan los tiempos de inactividad.

El éxito que ha experimentado el AMQP protocol, relativamente nuevo, está muy relacionado con la interoperabilidad. Advanced Message Queuing Protocol establece un fundamento común por sí solo. Esto permite, incluso, que las distintas aplicaciones se puedan escribir en diferentes lenguajes de programación. De esta manera, los programas también se comunican entre ellos sin ningún tipo de complicación, aunque no sean de la misma organización. Además, puesto que AMQP está disponible de forma gratuita, cualquier empresa puede utilizar el protocolo sin incurrir en costes adicionales.

Nota

La P de AMQP se refiere a protocolo, o protocolo en español: al igual que otros protocolos de red, AMQP establece un conjunto de reglas y una sintaxis para la comunicación entre dos o más participantes.

¿Cómo funciona el estándar AMQP?

En el modelo de referencia OSI, AMQP actúa sobre la capa de aplicación: de este modo, tiene contacto directo con los distintos programas. Asimismo, IMAP (para correo electrónico), FTP (para la transferencia de archivos) e IRC (para mensajería instantánea) están activos en esta capa. Para la transmisión de los mensajes, el protocolo apuesta por los intermediarios: los llamados brókers de mensajería. Estos asumen la distribución de los mensajes a diferentes destinatarios y de acuerdo con reglas establecidas. AMQP también regula el comportamiento de este servidor intermedio.

Nota

Dado que AMQP es un estándar de código abierto, existen varios brókers de mensajería. Además de Apache Qpid y Windows Azure Service Bus, RabbitMQ ha alcanzado una popularidad especial. En el siguiente artículo encontrarás información sobre el bróker RabbitMQ y su funcionamiento.

Advanced Message Queuing Protocol se refiere tanto a la comunicación entre los distintos participantes, que incluyen las instrucciones en los mensajes, como al propio comportamiento de los brókers.

En el cosmos de AMQP hay tres actores y un objeto:

  • El mensaje es el elemento central de toda la comunicación.
  • El productor (producer) crea un mensaje y lo envía.
  • El bróker de mensajería distribuye el mensaje de acuerdo con reglas definidas en diferentes colas (queue).
  • El consumidor (consumer) recupera el mensaje de la cola —a la que tiene acceso— y lo edita.

El bróker interrumpe la difusión del mensaje una vez más: el intercambiador recibe los mensajes y dirige los datos a la cola correcta. La vinculación informa al intercambiador sobre la cola a la que pertenece el mensaje. Se conocen cuatro formas diferentes en las que un intercambiador transmite mensajes.

Tipos de intercambiadores

El primer tipo, el intercambiador directo, envía mensajes a un receptor concreto y trabaja para ello con claves de enrutamiento. Al mensaje se le transmite este tipo de clave. Una cola, a su vez, tiene una clave de vinculación. Esta identifica la cola frente al intercambiador. Si la clave de enrutamiento y la clave de vinculación son iguales, el mensaje se puede enviar a la cola y con ello al receptor del mismo. También es posible que una cola tenga varias claves de vinculación y, por lo tanto, se pueda utilizar incluso para varias claves de enrutamiento. Por el contrario, varias colas también pueden compartir una clave de vinculación, que se conoce como vinculación múltiple. El intercambio multiplica el mensaje y lo envía a varios destinatarios.

El intercambiador de abanico funciona de manera similar. Sin embargo, el bróker ignora en este caso la clave de enrutamiento por completo. En su lugar, el intercambiador envía un mensaje a todas las colas disponibles y reproduce la información allí. Por el contrario, el intercambiador con un tema definido funciona de otra forma. Al igual que en un intercambiador directo, la clave de enrutamiento y las claves de vinculación se emparejan. Sin embargo, no debe existir una coincidencia exacta. En su lugar, se utilizan comodines. De esta forma se pueden preparar mensajes específicos para varias colas.

Por último, el intercambiador de encabezamientos actúa con el encabezamiento de un mensaje, en lugar de actuar con una clave de enrutamiento. En él se encuentran valores que se corresponden con la vinculación. El argumento con la etiqueta x-match determina si todos los valores deben coincidir (valor: todos) o solo uno de ellos debe corresponderse con la vinculación (valor: cualquiera). Mientras que el primero se corresponde con el intercambiador directo, con el último se puede generar el mismo efecto que en un intercambiador con un tema definido.

Frames de AMQP

Un frame es la unidad básica en AMQP. Una conexión está compuesta de una secuencia ordenada de frames. En este caso, el término orden hace referencia a que el último frame no debe llegar al receptor antes de que los demás frames hayan alcanzado previamente su objetivo. Cada frame se puede dividir (en la versión 1.0) en tres segmentos:

  • Header del frame: este header obligatorio tiene un tamaño de 8 bytes. Aquí encontrarás la información que determina el enrutamiento del mensaje.
  • Header extendido: este ámbito es opcional y no tiene ningún alcance definido. Sirve para ampliar la información del header en un futuro.
  • Cuerpo del frame: en el cuerpo se encuentran realmente los datos a transmitir. El tamaño se puede seleccionar de forma arbitraria. Esta zona, sin embargo, puede dejarse en blanco, de forma que el frame solo sirve para mantener la conexión.

El cuerpo de un frame, a su vez, puede adoptar nueve formas diferentes:

  • open: negocia los parámetros de conexión entre el bróker y el cliente.
  • begin: indica que una conexión se inicia.
  • attach: se adjunta un enlace al mensaje, necesario para poder usar la transferencia de datos.
  • flow: cambia el estado de un enlace.
  • transfer: con el marco de la transferencia se transfiere el mensaje real.
  • disposition: un frame de disposición informa sobre modificaciones en la entrega de la información.
  • detach: elimina el enlace.
  • end: indica que se termina la conexión.
  • close: termina la conexión y declara que no se van a enviar más frames.

Colas y mensajes

Cada cola tiene su propio nombre, que le identifica entre los demás participantes. O bien un cliente, o bien el bróker establecen el nombre. Una cola se realiza mediante una memoria. Esta puede estar integrada en un disco duro o ser volátil y estar en la unidad de memoria principal. La versión permanente asegura que, incluso después de reiniciar un bróker, la cola persiste. Sin embargo, no garantiza que los mensajes se guarden de forma permanente: depende del mensaje que este siga estando disponible después de un reinicio.

¿Qué pasa si un consumidor no puede recuperar el mensaje de la cola porque, por ejemplo, el cliente o la conexión se ha interrumpido? Es posible decidir si un consumidor tiene que acusar recibo de un mensaje o es suficiente que el envío se realice correctamente. Si se elige la primera opción y el consumidor no envía ningún mensaje, el bróker intentará enviar el mensaje a otro consumidor o tratará de conectar con el mismo receptor una vez más. Sin embargo, si está activada la variante sin confirmación y el consumidor no reclama la entrega del mensaje, este se perderá.

También es posible que un cliente rechace la aceptación de un mensaje conscientemente. Esto puede ser útil cuando el procesamiento del mensaje no funciona. La respuesta del consumidor empuja al bróker, bien a borrar el mensaje por completo, bien a integrarlo de nuevo en la cola.

Hecho

AMQP utiliza el puerto 5672.

AMQP 1.0 vs. 0-9-1

En la actualidad existen dos versiones completamente independientes de Advanced Message Queuing Protocol. El grupo OASIS desarrolló la versión 1.0. Sobre todo, RabbitMQ utiliza la versión 0-9-1, que es un poco más antigua. Ninguna de las dos son compatibles entre ellas. La versión 1.0 se diferencia principalmente por la menor importancia que tienen los brókers, las vinculaciones y los intercambiadores. 0-9-1 no los necesita, aunque no prohíbe utilizar dichos intermediarios.

¿Le ha resultado útil este artículo?
Page top