Hoy veremos cómo acelerar el tiempo de carga de sus páginas ejecutando el procesamiento más pesado de forma asíncrona, todo ello gestionado de forma muy sencilla, gracias a RabbitMQ.
La estabilidad y la velocidad de una aplicación o de un sitio web figuran sin duda entre los factores más importantes para los usuarios. ¿Quién no ha abandonado alguna vez un sitio antes incluso de ver la primera página porque tardaba demasiado?
Qué es RabbitMQ
RabbitMQ es un broker de mensajería de código abierto, distribuido y escalable que sirve de intermediario para una comunicación eficaz entre productores y consumidores.
RabbitMQ implementa el protocolo de mensajería de capa de aplicación AMQP, que se centra en la comunicación de mensajes asíncronos con garantía de entrega mediante confirmaciones de recepción de mensajes del broker al productor y de los consumidores al productor.
Cómo funciona RabbitHQ
De forma simplificada, RabbitMQ define colas que almacenarán los mensajes enviados por los productores hasta que las aplicaciones consumidoras reciban el mensaje y lo procesen. Nos permite diseñar e implementar sistemas distribuidos, en los que un sistema se divide en módulos independientes que se comunican entre sí a través de mensajes.
Como toda comunicación, necesitamos un productor, un mensaje y un receptor. En el centro del pastel se encuentra RabbitMQ, que sería el lugar donde el mensaje espera al receptor.
Entendamos mejor cómo funciona conociendo los tipos de intercambios que representan el intercambio de mensajes.
Tipos de intercambios
A través de los intercambios, cada vez que enviamos un mensaje a través de RabbitMQ, no lo enviamos directamente a una cola; para que otros sistemas lo lean, lo enviamos a un intercambio, que se encarga de reenviar los mensajes a las diferentes colas.
Los tipos de intercambios son Directo, Fanout, Topic y Lectores.
Intercambio directo
Supongamos que un productor necesita emitir un mensaje de confirmación de compra a tres consumidores. Es decir, el sistema necesita comunicarse con otros tres sistemas diferentes para realizar la compra.
Dado que RabbitMQ envía el mensaje por separado a cada cola, existe la posibilidad de hacer que estos otros sistemas reciban el mensaje directamente.
Normalmente, el intercambio reenvía el mensaje a las colas, pero a menudo no queremos que nuestros mensajes se envíen a todas las colas. Por lo tanto, hay varias condiciones que podemos aplicar para que un intercambio funcione.
Así puede hacer que su mensaje se envíe sólo a un consumidor; en lugar de enviarse a todos.
Clave de enlace: Para conectar una cola a un intercambio, es necesario crear un bind, una relación entre una cola y un intercambio, como un conector.
Clave deenrutamiento: En este bind, también podemos crear un elemento llamado clave de enrutamiento, que en otras palabras, es una clave para reenviar nuestros mensajes a una cola específica.
Si tenemos una clave de enrutamiento X, una clave de enrutamiento Y y una clave de enrutamiento Z, el mensaje con la clave de enrutamiento Y, por ejemplo, pasará por la cola Y y se entregará directamente al consumidor que hayamos definido para recibir el mensaje.
De esta forma, podemos tener varias colas conectadas a un intercambio, pero al mismo tiempo, también pueden tener diferentes relaciones con los intercambios utilizando las claves de enrutamiento.
Intercambio Fanout
Cuando el mensaje se envía al intercambio, se envía a todas las colas conectadas a él. Por lo tanto, si tiene 10 colas conectadas a un intercambio fanout, todas las colas recibirán el mensaje enviado.
Intercambio de temas
Es uno de los intercambios más flexibles, ya que nos permite enviar mensajes en función del asunto. Y basándose en la forma de nombrar las claves de enrutamiento, es posible crear patrones de reglas y relaciones entre sistemas.
Por ejemplo: clave de enrutamiento (x.*); clave de enrutamiento(*.z); clave de enrutamiento (*.y.*).
Qué es AQMP en RabbitMQ
AMQP (Advanced Message Queuing Protocol) es un protocolo de mensajería abierto utilizado para definir el transporte de mensajes entre múltiples aplicaciones. Es similar a los protocolos HTTP y TCP en que es un protocolo a nivel de cable, excepto que permite el transporte asíncrono.
RabbitMQ eligió implementar AMQP por varias razones. La primera es que este protocolo se describe como un estándar para middleware, a diferencia de JMS, que define una API.
Un consorcio internacional, que incluye grandes empresas como Red Hat, Cisco Systems y Microsoft, escribió esta especificación AMQP. La segunda es la interoperabilidad de este protocolo, que permite a cualquier aplicación que implemente AMQP comunicarse con un broker AMQP.
AMQP no es el único protocolo utilizado por RabbitMQ. La imagen de abajo representa todos los protocolos, lenguajes , y APIs implementados y/o soportados por RabbitMQ.
Las mejores características de RabbitMQ
Además de permitir la integración de diferentes aplicaciones a través de mensajes de forma asíncrona y desde diferentes ubicaciones, RabbitMQ nos ofrece otras características que lo han hecho muy popular dentro del mundo de los brokers de mensajería:
Almacenamiento fiable
RabbitMQ incorpora varias características que le permiten garantizar la entrega de mensajes. Entre ellas, proporciona almacenamiento cuando ningún consumidor puede recibir el mensaje. Permite que los consumidores acepten la entrega del mensaje para garantizar que se ha procesado correctamente.
Si el procesamiento falla, RabbitMQ permite que el mensaje se vuelva a poner en cola para ser consumido por una instancia diferente del consumidor o ser procesado de nuevo por el mismo consumidor que falló inicialmente cuando se recupere.
RabbitMQ también garantiza el orden de entrega de los mensajes; es decir, se consumen en el mismo orden en el que llegaron a las colas de RabbitMQ.
Creación de clusters
Aunque RabbitMQ proporciona un gran rendimiento procesando miles de mensajes por segundo, a veces es necesario que pueda procesar un mayor número de mensajes sin que ello afecte al rendimiento de la aplicación.
Para ello, RabbitMQ permite la creación de clusters para escalar la solución horizontalmente, lo que es transparente tanto para los productores como para los consumidores.
Colas de alta disponibilidad
En RabbitMQ, las colas pueden replicarse en varios nodos de un cluster, asegurando que en caso de fallo o inactividad de un nodo, el broker puede seguir recibiendo mensajes de los productores y entregarlos a los consumidores apropiados.
Enrutamiento flexible
En RabbitMQ, se pueden definir reglas de enrutamiento flexibles, incluso siguiendo un patrón determinado, para encaminar mensajes entre intercambios y colas, a través de enlaces.
Soporte de múltiples protocolos
Además de soportar el protocolo AMQP, RabbitMQ soporta STOMP, MQTT y HTTP a través de plugins. También incorpora mecanismos de autenticación y control de acceso para los componentes de cada broker.
Casos de uso reales de RabbitMQ
Los casos de uso más importantes de RabbitMQ son hacer posible la garantía de asincronía entre aplicaciones, reducir el acoplamiento entre aplicaciones, distribuir alertas y controlar la cola de trabajos en segundo plano.
Sin embargo, los casos prácticos de uso de RabbitMQ se encuentran en el comercio electrónico, donde se utiliza para manipular, procesar y reenviar sus pedidos de venta a sistemas de otros sectores, como la distribución y la emisión de facturas.
Al procesar los pedidos, puede reenviar su mensaje de ventas al centro de distribución y a un área de facturación. En este esquema, todo funciona horizontalmente, siguiendo el patrón asíncrono para el envío de mensajes, pero a menudo es posible enviar una acción a varias colas.
Siguiendo con el ejemplo anterior, esta función puede ser muy útil cuando el cliente realiza una compra y hay que preparar el producto para su distribución, transporte y facturación.
Y como cada uno de estos sectores es un sistema diferente, el objetivo de RabbitMQ es reenviar todos estos mensajes a los sistemas correspondientes.
Alternativas a Rabbit MQ:
RabbitMQ es mucho más sencillo de lo que parece, y existen varias alternativas a él que incluyen:
#1. IronMQ
IronMQ es un software de colas de mensajes superrápido. Tiene una alta disponibilidad, un diseño duradero y es preferible para una entrega única. IronMQ es la solución nativa en la nube más potente para la arquitectura de aplicaciones moderna.
Admite colas push, colas pull y sondeos largos, que mantienen abiertas las solicitudes de sondeo durante más tiempo. Además, puede utilizar múltiples centros de datos de alta disponibilidad, lo que facilita la escalabilidad.
Puede desplegarse en la nube, en hardware compartido o dedicado, o en las propias instalaciones. También dispone de una serie de bibliotecas de clientes con documentación de fácil lectura.
#2. Apache Kafka
Kafka es una plataforma con una fuerte presencia en el streaming de eventos distribuidos. En su núcleo, Kafka está diseñado como un registro de commit replicado, distribuido y persistente.
Su mayor utilidad es para microservicios de potencia impulsados por eventos o aplicaciones de procesamiento de flujo a gran escala, replicando automáticamente los eventos de forma asíncrona dentro del clúster para tolerancia a fallos y alta disponibilidad.
#3. Apache ActiveMQ
ActiveMQ es un corredor de mensajes multiprotocolo basado en Java. Con él, podemos integrar aplicaciones utilizando el protocolo de colas de mensajes AMQP en la capa de aplicación.
Implementa varios protocolos para la integración, como JMS (nativo de Java) y Stomp (que puede ser utilizado por aplicaciones PHP), entre otros.
Además, Amazon tiene su versión «gestionada» llamada Amazon MQ, que facilita mucho el uso del servicio.
Palabras finales
Los brokers de mensajería han sido tradicionalmente una pieza importante dentro de las arquitecturas de las organizaciones. Sin embargo, con el aumento de usuarios que entran en los sistemas de las empresas a través de diferentes canales, se necesitan productos que permitan escalarlos horizontalmente a un bajo coste. Permiten procesar un gran número de mensajes por segundo.
Aquí es donde una nueva generación de brokers, como RabbitMQ, está adquiriendo mayor relevancia en las aplicaciones modernas, que buscan ofrecer altos niveles de disponibilidad, fiabilidad, interoperabilidad y rendimiento a nuestros clientes.
También puede explorar algunas plataformas de alojamiento de RabbitMQ fiables para su aplicación.