RabbitMQ. Partie 1. Introduction. Erlang, AMQP

Bonjour, Habr ! Je souhaite partager un manuel-référence des connaissances que j'ai pu rassembler sur RabbitMQ et condenser en recommandations et conclusions courtes.

Table des matières

  • RabbitMQ. Partie 1. Introduction. Erlang, AMQP et RPC
  • RabbitMQ. Partie 2. Comprenons les Exchanges
  • RabbitMQ. Partie 3. Comprendre les Queues et les Bindings
  • RabbitMQ. Partie 4. Comprenons ce que sont les messages et les trames.
  • RabbitMQ. Partie 5. Performance de publication et de consommation des messages
  • RabbitMQ. Partie 6. Aperçu des modules Federation et Shovel
  • RabbitMQ. Partie 7. Détails sur la connexion et le canal
  • RabbitMQ. Partie 8. RabbitMQ sous .NET
  • RabbitMQ. Partie 9. Surveillance

Brièvement sur l'AMQP

L'AMQP (Advanced Message Queuing Protocol) est un protocole ouvert pour le transfert de messages entre les composants d'un système. L'idée principale est que des sous-systèmes distincts (ou des applications indépendantes) peuvent échanger des messages de manière arbitraire via un courtier AMQP, qui effectue le routage, garantit potentiellement la livraison, distribue des flux de données et s'abonne aux types de messages nécessaires.

Protocole AMQP introduit trois concepts :

RabbitMQ. Partie 1. Introduction. Erlang, AMQP

  • l'échange (point d'échange ou échange) - où les messages sont envoyés. Le point d'échange distribue le message envoie à une ou plusieurs files d'attente. Il achemine les messages vers la file d'attente sur la base des liaisons créées (binding) entre lui et la file d'attente
  • queue (file d'attente) - une structure de données sur disque ou en mémoire vive, qui stocke des liens vers les messages et fournit des copies des messages consumers (aux consommateurs)
  • binding (liaison) - une règle qui informe le point d'échange dans quelle file d'attente ces messages doivent être envoyés

Le protocole fonctionne au-dessus de TCP/IP.

Brièvement sur Erlang

Le code source du projet se trouve dans le référentiel sur GitHub. L'architecture RabbitMQ-server est basée sur Erlang et BEAM.

Erlang a été développé par la société Ericsson au milieu des années 1980 comme un système distribué, tolérant aux pannes, en temps réel pour des applications nécessitant une disponibilité de 99,999%. Erlang Il est utilisé dans diverses industries et applications modernes, par exemple dans WhatsApp. Vous pouvez en lire davantage dans l'article sur l'architecture de WhatsApp, que Facebook a acheté pour 19 milliards de dollars

Brièvement sur RabbitMQ

RabbitMQ – c'est un courtier de messages open source. Il route les messages selon tous les principes de base du protocole AMQP décrits dans la spécification. RabbitMQ met en œuvre et complète le protocole. AMQP.

L'idée principale du modèle de messagerie dans RabbitMQ est que producer (éditeur) n'envoie pas de messages directement dans la file d'attente. En fait, il arrive souvent que l'éditeur ne sache même pas si le message sera livré à une file d'attente.

Au lieu de cela, l'éditeur peut envoyer des messages uniquement à l'échange. D'une part, l'échange reçoit des messages des éditeurs, et d'autre part, il les envoie dans les files d'attente. L'échange doit savoir exactement quoi faire avec le message reçu. Doit-il être ajouté à une file d'attente spécifique ? Doit-il être ajouté à plusieurs files d'attente ? Ou le message doit-il être ignoré ?

RabbitMQ. Partie 1. Introduction. Erlang, AMQP

Le travail est brièvement RabbitMQ décrit comme suit :

  1. L'éditeur envoie un message à un échange spécifique
  2. L'échange, après avoir reçu le message, le route vers une ou plusieurs files d'attente en fonction des 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é en mémoire vive ou sur disque
  4. Une fois que le consommateur est prêt à recevoir le message de la file d'attente, le serveur crée une copie du message à partir de la référence et l'envoie
  5. Le consommateur reçoit le message et envoie une confirmation au courtier
  6. Le courtier, après avoir reçu la confirmation, supprime la copie du message de la file d'attente. Ensuite, il la supprime de la mémoire vive et du disque

RPC

Processus RPC (appel de procédure distante) est à la base de presque toutes les interactions avec le noyau RabbitMQ. Par exemple, les discussions initiales concernant les conditions du client avec RabbitMQ, démontre un certain processus RPC. Une fois cette séquence terminée, RabbitMQ il sera prêt à recevoir des requêtes du client :

RabbitMQ. Partie 1. Introduction. Erlang, AMQP

De plus, dans la spécification AMQP le client et le serveur peuvent appeler des commandes. Cela signifie que le client s'attend à interagir avec le serveur. Les commandes sont des classes et des méthodes. Par exemple, Connection.Start – appel de méthode Commencer classe Connexion.

Connexions et canaux

Pour cet échange d'informations entre le client et le serveur, on utilise des canaux. Les canaux sont créés dans le cadre d'une connexion spécifique. Chaque canal est isolé des autres canaux. Dans le cas d'une exécution synchrone, il n'est pas possible d'exécuter la commande suivante tant qu'une réponse n'a pas été reçue.

Pour pouvoir envoyer des commandes en parallèle, il est nécessaire d'ouvrir plusieurs canaux. Chaque canal crée un processus distinct. Une seule connexion peut avoir de nombreux canaux ( Erlang multiplexage). Pour chaque canal, il existe certaines structures et objets en mémoire. Ainsi, plus il y a de canaux dans le cadre de la connexion, plusle système utilise de mémoire RabbitMQ pour gérer cette connexion. Un exemple simple de création d'une connexion et d'un canal à l'aide de

RabbitMQ. Partie 1. Introduction. Erlang, AMQP

Un exemple simple de création d'une connexion et d'un canal avec 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 
}

Il est fortement déconseillé d'ouvrir une nouvelle connexion pour chaque opération, car cela entraînera des coûts élevés. Les canaux doivent également être permanents, mais de nombreuses erreurs de protocole entraînent la fermeture du canal, donc la durée de vie d'un canal peut être plus courte que celle d'une connexion.

Où est utilisé RabbitMQ ?

Dans le contexte des microservices, le protocole AMQP et son implémentation en RabbitMQ sont souvent utilisés pour l'interaction asynchrone entre les services.

Dans le contexte de IIOT protocole AMQP et son implémentation en RabbitMQ il est utilisé pour l'échange de données entre serveurs (serveur-serveur). Le plugin est également utilisé MQTT Plugin RabbitMQ qui est une implémentation du protocole MQTT pour le transfert de données entre un capteur et un serveur dans des environnements à faible bande passante avec une latence élevée (la liste complète des protocoles pris en charge est énumérée dans site du projet).

Dans le prochain article, nous allons commencer à examiner plus en détail les Exchanges.

Liens

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster