¿Qué es RabbitMQ?
En cualquier aplicación nativa de la nube, los microservicios deben comunicarse para obtener toda la información que necesitan para responder a los usuarios. Debe asegurarse de que esta mensajería es sólida incluso cuando hay problemas de red o errores entre los componentes. RabbitMQ es una herramienta que puede usar para aumentar la confiabilidad de la mensajería.
En su distribuidor de equipos al aire libre, está progresando rápidamente con sus microservicios. Sin embargo, en las pruebas de aplicaciones algunas llamadas de un microservicio a otro parecen perderse. Le gustaría asegurarse de que este problema no surge en su entorno de producción donde la reputación de su empresa está en juego.
En esta unidad, verá cómo RabbitMQ puede crear una plataforma de comunicación flexible y resistente para microservicios.
¿Por qué usar un agente de mensajes en una aplicación nativa de nube?
Las aplicaciones nativas de la nube constan de microservicios independientes, a menudo creados por equipos independientes y mediante diferentes tecnologías e lenguajes. Cada equipo tiene sus propios sprints de desarrollo y programaciones de actualización y puede implementar correcciones y nuevas características continuamente. Sin embargo, cuando llega una solicitud de un usuario, el microservicio que lo recibe casi siempre necesita llamar a otros microservicios y servicios de respaldo y recibir respuestas de ellos para formular la respuesta completa.
Obviamente, el formato y el esquema de estas solicitudes y respuestas entre servicios deben acordarse entre los equipos de desarrollo y cambiar rara vez. Normalmente se implementan como API REST. Debe implementar preferentemente nuevas características de cada interfaz sin modificar los métodos y parámetros existentes. Sin embargo, si decide que los microservicios se comuniquen directamente, pueden surgir varios problemas:
- Cuando un microservicio de destino está sin conexión o está ocupado, ¿qué ocurre con los mensajes enviados a él? ¿Cuáles son las consecuencias de la pérdida de mensajes?
- ¿Cómo puede enviar el mismo mensaje a más de un destino?
- Si un microservicio se ejecuta en más de un contenedor, ¿a qué debe enviar mensajes?
Un agente de mensajes es middleware que soluciona estos problemas. Los servicios envían mensajes al agente de mensajes en lugar de directamente a un destino. El agente los almacena en colas en el orden en que llegan. Los servicios de destino se suscriben a estas colas y recogen mensajes, de uno en uno, para su procesamiento.
Si el servicio de destino no está disponible, el microservicio de envío todavía puede colocar mensajes en la cola. Cuando se reinicia el destino, continúa recuperando mensajes de la cola, desde el mismo punto. No se pierden mensajes, aunque el remitente tiene que esperar más tiempo.
Dado que más de un destino puede suscribirse a una cola, más de un microservicio puede recibir un único mensaje. Además, cuando varios contenedores hospedan instancias de un solo microservicio, la primera instancia que está disponible recoge el mensaje. El agente distribuye automáticamente los mensajes a las instancias para distribuir la carga.
¿Qué es RabbitMQ?
RabbitMQ es uno de los agentes de mensajes más populares y tiene muchas características que lo convierten en un candidato ideal para controlar las comunicaciones en una aplicación nativa de la nube. Incluye:
- El servidor RabbitMQ, que hospeda las colas. El servidor admite la agrupación en clústeres y la conmutación por error para alta disponibilidad y se puede ejecutar en contenedores.
- Implementaciones del protocolo Advanced Message Queuing (AMQP), el protocolo de mensajes orientado a texto simple (STOMP) y el transporte de telemetría de Microsoft Message Queuing (MQTT).
- Bibliotecas cliente de AMQP que puede usar en .NET, Java y Erlang.
Conceptos de RabbitMQ
En los términos de RabbitMQ, los microservicios, que envían y reciben mensajes, son clientes. Los clientes que envían mensajes se denominan productores de mensajes. Los clientes que reciben mensajes son consumidores de mensajes. El servicio RabbitMQ es el agente de mensajes.
Envío de mensajes
RabbitMQ es versátil y capaz de implementar muchos modelos de puesta en cola diferentes. Vamos a examinar algunos patrones populares.
Si tiene un único productor y un único consumidor, use una sola cola y todos los mensajes lleguen al mismo destino. Incluso en esta configuración sencilla, se crea un sistema de mensajería sólido que controla las interrupciones sin problemas:
Envío de mensajes a consumidores competidores
En el modelo de consumidores competidores, un productor envía mensajes a una sola cola de trabajo. Dos o más consumidores recuperan mensajes de la cola. Los consumidores compiten por recuperar mensajes porque un único consumidor solo puede recuperar cada mensaje.
Este patrón es útil en las aplicaciones nativas de la nube cuando se tiene un microservicio de consumo hospedado en varios contenedores para aumentar la capacidad. Cada mensaje solo llegará a una instancia del consumidor, por lo que solo se procesará una vez. El trabajo no se duplicará.
Publicación y suscripción
Si desea enviar un único mensaje de un productor a varios consumidores, use el modelo de publicación o suscripción. El productor envía mensajes a un intercambio. Cada consumidor se suscribe a los mensajes de ese intercambio. Cuando se suscriben, RabbitMQ crea una nueva cola de trabajo para esa suscripción. Cada mensaje se copia en cada cola para ese intercambio y lo reciben todos los consumidores que se han suscrito. Los consumidores no compiten por cada mensaje. En su lugar, todos reciben una copia de cada mensaje.
El modelo de publicación y suscripción usa un intercambio de distribución ramificada, que copia todos los mensajes en cada cola de trabajo.
Este patrón es útil cuando se desea que varios microservicios procesen cada mensaje. Por ejemplo, cuando un cliente desprotegía una cesta, es posible que desee enviar un mensaje sobre el número de cada producto que compró. Este mensaje debe llegar al microservicio de envío, para indicar al almacén que empaquete el paquete y el microservicio de existencias, para disminuir los números de existencias y quizá desencadenar pedidos a los proveedores.
Enrutamiento de mensajes y temas
A veces quiere distribuir mensajes únicos a varios consumidores, pero, para cada consumidor, aplique un filtro. Este patrón se denomina enrutador de mensajes. Como en el modelo de publicación o suscripción, los consumidores se suscriben al intercambio para crear varias colas de trabajo. Sin embargo, en lugar de un intercambio de distribución ramificada, el modelo usa un intercambio directo. Con este intercambio, cada suscripción tiene una clave de enlace. Solo se envían mensajes cuya clave de enrutamiento coincide con la clave de enlace a esta suscripción. Otros se filtran.
Este patrón es útil cuando algunos consumidores solo deben procesar un subconjunto de la secuencia de mensajes. Por ejemplo, supongamos que tiene un microservicio que envía mensajes cuando se producen errores. Todos los errores deben enviarse al microservicio de registro. Los errores críticos se deben enviar al microservicio de administración que alertará a los ingenieros para corregir el problema.
El intercambio directo enruta los mensajes en función de un único criterio. Para que las cosas sean aún más flexibles, puede usar un intercambio de temas. Para cada mensaje, puede usar una clave de enrutamiento con varios términos separados por puntos. En la clave de enlace, puede usar los caracteres comodín *, para sustituir exactamente una palabra o # para sustituir cero o más palabras.
Nota:
Entre las alternativas a RabbitMQ se incluyen Apache Kafka y Azure Service Bus. Ambos agentes de mensajes son compatibles con componentes dedicados en .NET Aspire. Obtendrá información sobre Azure Service Bus en un módulo posterior de esta ruta de aprendizaje.