¡Buenas tardes, Habr! Quiero compartir un manual de referencia con los conocimientos que he logrado reunir en RabbitMQ y resumir en breves recomendaciones y conclusiones.
Tabla de contenido
- RabbitMQ. Parte 1. Introducción. Erlang, AMQP y RPC
- RabbitMQ. Parte 2. Entendiendo Exchanges
- RabbitMQ. Parte 3. Entendiendo Queues y Bindings
- RabbitMQ. Parte 4. Entendiendo qué son los mensajes y los frames
- RabbitMQ. Parte 5. Rendimiento de la publicación y consumo de mensajes
- RabbitMQ. Parte 6. Resumen de los módulos Federation y Shovel
- RabbitMQ. Parte 7. Detalles sobre Connection y Channel
- RabbitMQ. Parte 8. RabbitMQ en .NET
- RabbitMQ. Parte 9. Monitoreo
Resumen sobre AMQP
AMQP (Advanced Message Queuing Protocol) es un protocolo abierto para el intercambio de mensajes entre componentes de un sistema. La idea principal es que subsistemas individuales (o aplicaciones independientes) puedan intercambiar mensajes arbitrariamente a través de un broker AMQP, que realiza el enrutamiento, puede garantizar la entrega, distribución de flujos de datos, y suscripción a los tipos de mensajes necesarios.
Protocolo AMQP introduce tres conceptos:

exchange(punto de intercambio) — donde se envían los mensajes. El punto de intercambio distribuye el mensaje a una o varias queues. Éste ruteará los mensajes a la queue basándose en las relaciones creadas (binding) entre él y la queuequeue(cola) — estructura de datos en disco o en memoria que almacena referencias a los mensajes y entrega copias de los mensajesconsumidores(consumidores)binding(binding) — regla que indica al punto de intercambio a cuál de las queues deben ir esos mensajes
El protocolo opera sobre .
Resumen sobre Erlang
El código fuente del proyecto se encuentra en el repositorio en . Arquitectura se basa en y BEAM.
Erlangdesarrollado por laEricssona mediados de los años 80 como un sistema distribuido, tolerante a fallos, en tiempo real, para aplicaciones que requieren una operación continua de 99,999%.Erlangse utiliza en diversas industrias y aplicaciones modernas, por ejemplo en
Resumen sobre RabbitMQ
– es un broker de mensajes de código abierto. Enruta mensajes de acuerdo con todos los principios básicos del protocolo descritos en . RabbitMQ implementa y complementa el protocolo AMQP.
La idea principal del modelo de intercambio de mensajes en RabbitMQ es que el productor (el editor) no envía mensajes directamente a la cola. De hecho, a menudo el editor ni siquiera sabe si el mensaje se entregará a alguna cola.
En su lugar, el editor puede enviar mensajes solo a un intercambio. Por un lado, el intercambio recibe mensajes de los editores, y por el otro, los envía a las colas. El intercambio debe saber exactamente qué hacer con el mensaje recibido. ¿Debería añadirse a una cola específica? ¿Debería añadirse a varias colas? ¿O el mensaje debe ignorarse?

El trabajo RabbitMQ se puede describir de la siguiente manera:
- El editor envía un mensaje a un intercambio específico
- El intercambio, al recibir el mensaje, lo enruta a una o varias colas de acuerdo con las reglas de enlace entre él y la cola
- La cola mantiene un enlace a este mensaje. El propio mensaje se guarda en la memoria RAM o en el disco
- Tan pronto como el consumidor está listo para recibir el mensaje de la cola, el servidor crea una copia del mensaje a través del enlace y lo envía
- El consumidor recibe el mensaje y envía una confirmación al intermediario
- El intermediario, al recibir la confirmación, elimina la copia del mensaje de la cola. Luego elimina de la memoria RAM y del disco
RPC
El proceso es la base de prácticamente todas las interacciones con el núcleo RabbitMQ. Por ejemplo, las discusiones iniciales de los términos del cliente con RabbitMQ, demuestra un proceso específico RPC. Una vez que esta secuencia ha finalizado, RabbitMQ estará listo para aceptar solicitudes del cliente:

También en la especificación AMQP tanto el cliente como el servidor pueden invocar comandos. Esto significa que el cliente espera interactuar con el servidor. Los comandos son clases y métodos. Por ejemplo, Connection.Start – invocación del método Iniciar de la clase Connection.
Conexión y canales
Para tal intercambio de información entre el cliente y el servidor se utilizan canales. Los canales se crean dentro de una conexión específica. Cada canal está aislado de otros canales. En el caso síncrono no es posible ejecutar el siguiente comando hasta que se reciba una respuesta.
Para poder enviar comandos de manera paralela, es necesario abrir varios canales. Cada canal crea un proceso separado. Una conexión puede tener múltiples canales ( Erlang multiplexión). Para cada canal existen ciertas estructuras y objetos en la memoria. Por lo tanto, cuantos más canales haya dentro de la conexión, más memoria utiliza RabbitMQ para gestionar dicha conexión.

Un ejemplo simple de creación de una conexión y un canal utilizando :
// ...
private void TryConnect()
{
var factory = new ConnectionFactory()
{
HostName = "host_name",
UserName = "user_name",
Password = "p@ssword",
// Включение автоматичекого восстановления
// соединения после сбоев сети
AutomaticRecoveryEnabled = true
};
_connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
_channel = _connection.CreateModel();
// other options
}No se recomienda abrir una nueva conexión para cada operación, ya que esto conllevará a altos costes. Los canales también deben ser permanentes, pero muchos errores de protocolo conducen al cierre del canal, por lo que la vida útil de un canal puede ser más corta que la de la conexión.
¿Dónde se utiliza RabbitMQ?
En el contexto de microservicios, el protocolo AMQP y su implementación en RabbitMQ se utilizan a menudo para interacción asíncrona entre servicios.
En el contexto de IIOT el protocolo AMQP y su implementación en RabbitMQ se utiliza para el intercambio de datos entre servidores (servidor-servidor). También se utiliza el complemento que es una implementación del protocolo para la transmisión de datos entre un sensor y un servidor en entornos de baja velocidad con alta latencia (la lista completa de protocolos compatibles está disponible en ).
En el siguiente artículo comenzaremos a explorar más a fondo los Exchanges.
Enlaces
Fuente: habr.com
