Bonjour, Habr ! Je souhaite partager un manuel-ouvrage de référence de connaissances sur lequel j'ai réussi à collecter RabbitMQ et condenser en courtes recommandations et conclusions.
table des matières
LapinMQ. Partie 1. Introduction. Erlang, AMQP et RPC
LapinMQ. Partie 2. Comprendre les échanges
LapinMQ. Partie 3. Comprendre les files d'attente et les liaisons
LapinMQ. Partie 4. Comprendre ce que sont les messages et les cadres
LapinMQ. Partie 5 : Publication et consommation des performances des messages
LapinMQ. Partie 6. Présentation des modules Fédération et Shovel
LapinMQ. Partie 7. Détails sur Connection et Chanel
LapinMQ. Partie 8. RabbitMQ dans .NET
LapinMQ. Partie 9. Surveillance
En bref sur l'AMQP
AMQP (Advanced Message Queuing Protocol) est un protocole ouvert pour la transmission de messages entre les composants du système. L'idée de base est que des sous-systèmes individuels (ou des applications indépendantes) peuvent échanger des messages de manière arbitraire via un courtier AMQP, qui effectue le routage, garantit éventuellement la livraison, distribue les flux de données et s'abonne aux types de messages souhaités.
Protocole AMQP introduit trois concepts :
exchange (point d'échange ou échange) - des messages lui sont envoyés. Point d'échange distribue un message dans une ou plusieurs files d'attente. Elle achemine les messages vers une file d'attente en fonction des connexions créées (binding) entre lui et la file d'attente
queue (file d'attente) - une structure de données sur disque ou dans la RAM qui stocke les liens vers les messages et donne des copies des messages consumers (aux consommateurs)
binding (contraignant) - une règle qui indique au point d'échange dans quelle file d'attente ces messages doivent aller
Le code source du projet se trouve dans le référentiel à l'adresse GitHub. Architecture Serveur RabbitMQ basé sur Erlang et POUTRE.
Erlang développé par la société Ericsson au milieu des années 1980 en tant que système temps réel distribué, tolérant aux pannes, pour les applications nécessitant une disponibilité de 99,999 %. Erlang utilisé dans diverses industries et applications modernes, par ex. WhatsApp. Vous pouvez en savoir plus dans l'article Architecture WhatsApp, achetée par Facebook pour 19 milliards de dollars
En bref sur RabbitMQ
RabbitMQ est un courtier de messages open source. Il achemine les messages selon tous les principes de base du protocole AMQP décrit dans spécifications. RabbitMQ met en œuvre et complète le protocole AMQP.
L'idée principale du modèle de messagerie dans RabbitMQ la chose est producer (éditeur) n'envoie pas de messages directement à la file d'attente. En fait, et bien souvent, l'éditeur ne sait même pas si le message sera envoyé dans une file d'attente.
Au lieu de cela, l'éditeur peut uniquement envoyer des messages à l'échange. D'une part, l'échange reçoit les messages des éditeurs et, d'autre part, il les envoie aux files d'attente. L'échange doit savoir exactement quoi faire du message qu'il reçoit. Doit-il être ajouté à une file d’attente spécifique ? Doit-il être ajouté à plusieurs files d’attente ? Ou le message doit être ignoré.
Bref travail RabbitMQ peut être décrit comme suit :
L'éditeur envoie un message à un échange spécifique
Un échange, après avoir reçu un message, l'achemine vers une ou plusieurs files d'attente conformément aux règles de liaison entre lui et la file d'attente.
La file d'attente stocke une référence à ce message. Le message lui-même est stocké dans la RAM ou sur disque
Une fois que le consommateur est prêt à recevoir un message de la file d'attente, le serveur crée une copie du message via un lien et envoie
Le consommateur reçoit le message et envoie une confirmation au courtier
Le courtier, dès réception de la confirmation, supprime une copie du message de la file d'attente. Puis supprime de la RAM et du disque
RPC
Processus RPC (appel de procédure à distance) est à l'origine de presque toutes les interactions avec le noyau RabbitMQ. Par exemple, les premières discussions sur les conditions du client avec RabbitMQ, démontre un certain processus RPC. Une fois cette séquence terminée, RabbitMQ sera prêt à accepter les demandes du client :
Également dans le cahier des charges AMQP le client et le serveur peuvent émettre des commandes. Cela signifie que le client attend de communiquer avec le serveur. Les commandes sont des classes et des méthodes. Par exemple, Connection.Start – appel de méthode Start Classe Connection.
Connexion et canaux
Pour un tel échange d'informations entre le client et le serveur, canaux. Les chaînes sont créées dans connexion spécifique. Chaque canal est isolé des autres canaux. Dans le cas synchrone, il n'est pas possible d'exécuter la commande suivante tant qu'une réponse n'est pas reçue.
Afin de pouvoir envoyer des commandes en parallèle, vous devez ouvrir plusieurs canaux. Chaque canal crée un Erlang processus. Une connexion peut avoir plusieurs canaux (multiplexage). Pour chaque canal, il existe certaines structures et objets en mémoire. Par conséquent, plus il y a de canaux dans une connexion, plus RabbitMQ utilise plus de mémoire pour gérer une telle connexion.
Un exemple simple de création d'une connexion et d'un canal à l'aide de RabbitMQ.Client:
// ...
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
}
L'ouverture d'une nouvelle connexion pour chaque opération est fortement déconseillée car cela entraînera des coûts élevés. Les canaux doivent également être persistants, mais de nombreuses erreurs de protocole entraînent la fermeture du canal, de sorte que la durée de vie du canal peut être plus courte que celle de la connexion.
Où RabbitMQ est-il utilisé ?
Dans le contexte des microservices, le protocole AMQP et sa mise en œuvre dans RabbitMQ souvent utilisé pour interaction asynchrone entre les prestations.
Dans le contexte de IIOT protocole AMQP et sa mise en œuvre dans RabbitMQ utilisé pour l'échange de données entre serveurs (serveur-serveur). Utilisez également le plugin Plugin MQTT RabbitMQ qui est une implémentation du protocole MQTT pour la transmission de données entre le capteur et le serveur dans des environnements à faible vitesse et à haute latence (une liste complète des protocoles pris en charge est répertoriée sur site du projet).
Dans le prochain article, nous commencerons à comprendre les échanges plus en détail.