LapinMQ. Partie 1. Introduction. Erlang, AMQP

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 :

LapinMQ. Partie 1. Introduction. Erlang, AMQP

  • 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 protocole fonctionne par-dessus TCP / IP.

En bref sur Erlang

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é.

LapinMQ. Partie 1. Introduction. Erlang, AMQP

Bref travail RabbitMQ peut être décrit comme suit :

  1. L'éditeur envoie un message à un échange spécifique
  2. 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.
  3. La file d'attente stocke une référence à ce message. Le message lui-même est stocké dans la RAM ou sur disque
  4. 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
  5. Le consommateur reçoit le message et envoie une confirmation au courtier
  6. 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 :

LapinMQ. Partie 1. Introduction. Erlang, AMQP

É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.

LapinMQ. Partie 1. Introduction. Erlang, AMQP

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.

références

Source: habr.com

Ajouter un commentaire