RabbitMQ. Partie 2. Comprenons les Exchanges

Échange — un échange ou un point d'échange. Il reçoit des messages. Échange distribue le message dans une ou plusieurs files d'attente. Il achemine les messages vers la file d'attente sur la base des liaisons créées (bindings) entre lui et la file d'attente.

Échange n'est pas un processus Erlang. Pour des raisons de scalabilité, l'échange est une chaîne (lien vers le module contenant la logique de routage) dans la base de données intégrée mnesia. 1 000 échanges n'utiliseront que 1 Mo de mémoire.

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

Échange direct

Échange direct — utilisé lorsque vous souhaitez livrer un message à des files d'attente spécifiques.Le message est publié dans l'échange avec une clé de routage définie et atteint toutes les files d'attente qui sont liées à cet échange par une clé de routage similaire. La clé de routage est une chaîne. La recherche de correspondance se fait par lavérification d'égalité des chaînes. Représentation graphique du flux de messages :.

rabbitmq

RabbitMQ. Partie 2. Comprenons les Exchanges

Dans il existe le concept d' échange par défaut échange direct. C'est sans nom. Si un échange par défaut est utilisé, le message sera routé vers la file d'attente nommée d'après la clé de routage du message. Échange par sujet.

Échange par sujet

– de manière similaire, il permet un routage sélectif en comparant la clé de routage. Cependant, dans ce cas, la clé est définie sans nom. Si un échange par défaut est utilisé, le message sera routé vers la file d'attente nommée d'après par un modèle. Lors de la création du modèle, sont utilisésun ou plusieurs mots (lettres 0 AZ et chiffres et az ), séparés par des points, ainsi que des symboles 0-9— peuvent être remplacés par exactement * et #.

  • * un mot 1 — peut être remplacé par
  • # un ou plusieurs mots. 0 RabbitMQ 2.4.0

rabbitmq

RabbitMQ. Partie 2. Comprenons les Exchanges

À partir de la version l'algorithme de routage pour l'échange par sujet a commencé à fonctionner jusqu'à deux fois plus vite. Ils ont atteint cela en mettant en œuvre l'approche 145 trie implementation , qui implique la représentation des modèles sous forme de structure arborescente. Par exemple, les modèlesa.b.c a.*.b.c, a.#.c, b.b.c et seront représentés par la structure suivante : La recherche de correspondance avec le modèle commence à la racine et descend.

RabbitMQ. Partie 2. Comprenons les Exchanges

L'utilisation de cet échange peut être

Caractéristiques :

  • un bon choix pour un développement futur potentiel de l'application. un bon choix pour le développement futur potentiel de l'application, car les modèles peuvent toujours être configurés pour que le message soit publié de la même manière sans nom. Si un échange par défaut est utilisé, le message sera routé vers la file d'attente nommée d'après ou échange fanout
  • modèles qui utilisent * beaucoup plus rapidement, que les modèles qui utilisent #.
  • a commencé à fonctionner jusqu'à plus lentement sans nom. Si un échange par défaut est utilisé, le message sera routé vers la file d'attente nommée d'après

Échange fanout

échange fanout – tous les messages sont livrés à toutes les files d'attente même si une clé de routage est spécifiée dans le message.

Caractéristiques :

  • RabbitMQ ne fonctionne pas avec des clés de routage et des modèles ce qui a un impact positif sur les performances. C'est le plus rapide l'échange;
  • tous les consommateurs doivent être capables de traiter tous les messages;

rabbitmq

RabbitMQ. Partie 2. Comprenons les Exchanges

Échange Headers

échange Headers dirige les messages vers les files d'attente liées sur la base de la comparaison des paires (clé, valeur) des propriétés en-têtes et de la propriété similaire du message. en-têtes est un Dictionary.

Si vous ajoutez une clé spéciale au dictionnaire x-match avec la valeur any, alors le message est routé par correspondance partielle des paires (clé, valeur). Ce comportement est similaire à l'opérateur or.

var bindingArguments = new Dictinary();
bindingArguments.add("x-match", "any");

Par défaut, la clé x-match contient la valeur tout. Cela signifie que le message est routé par correspondance complète des paires (clé, valeur). Ce comportement est similaire à l'opérateur and.

rabbitmq

RabbitMQ. Partie 2. Comprenons les Exchanges

Caractéristiques :

  • flexibilité supplémentaire
  • calcul de frais supplémentaires. Toutes les paires (clé, valeur) de l'attribut en-têtes doivent être triées par nom de clé avant le calcul des valeurs de routage du message. Plus lent que d'autres types d'échange.

Échange de hachage consistent

Cet échange est un plugin et non intégré dans RabbitMQ.

échange de hachage consistent (échange de hachage constant) – utilisé lorsqu'il y a plusieurs files d'attente qui sont des récepteurs potentiels du message, et lorsque vous devez équilibrer la charge entre elles. La liaison d'un message à une file d'attente se fait par poids (une valeur de chaîne conditionnelle de 0 - n).

Le poids équivalent des files d'attente indique qu'un nombre à peu près égal de messages arrivera (chaque message sera placé dans une seule file d'attente). Il n'y a aucune garantie d'une distribution uniforme des messages Hash.

rabbitmq

RabbitMQ. Partie 2. Comprenons les Exchanges

est calculé en fonction de la clé de routage ou de la propriété du message. Si tous les messages publiés avaient des clés de routage différentes ou en-têtes , alors la distribution se fera par poids. Sinon, la clé de routage sera utilisée ou en-têtes, la répartition se fera par poids. Sinon, une clé de routage sera utilisée ou en-têtes.

Doit aider lorsque la capacité du consommateur doit croître plus que la solution avec plusieurs consommateurs utilisant une seule file d'attente.

Combinaison d'échange (E2E)

Le comportement de tous les échangeurs peut être combiné grâce à une liaison Exchange-to-Exchange (la combinaison des échangeurs n'est pas incluse dans la spécification AMQP. Cette extension du protocole du côté RabbitMQ).

rabbitmq

RabbitMQ. Partie 2. Comprenons les Exchanges

Grâce à E2E , nous pouvons trouver la configuration évolutive appropriée qui répond aux exigences actuelles et croissantes.

Création d’un Exchange

La création d'un échange se fait par une demande de RPC synchronisation au serveur. La demande est réalisée par la méthode Exchange.Declare, appelée avec les paramètres :

  • nom de l'échange
  • type d'échange
  • autres paramètres

Exemple de création l'échange avec l'aide de RabbitMQ.Client:

//...
channel.ExchangeDeclare(
    exchange: "my_exchange",
    type: "direct",
    durable: "false",
    autoDelete: "false",
    arguments: null
);
//...

  • l'échange — le nom de l'échange que nous voulons créer. Le nom doit être unique
  • type — type d'échange
  • durable — si défini true, alors l'échange il sera permanent. Il sera stocké sur le disque et pourra survivre au redémarrage du serveur/broker. Si la valeur faux, alors l'échange est temporaire et sera supprimée lorsque le serveur/broker sera redémarré
  • autoDelete — suppression automatique. Échange sera supprimé lorsque toutes les files d'attente associées seront supprimées
  • arguments — arguments facultatifs. Le plus souvent, à travers les arguments, on définit alternative exchange (un échange alternatif). Si le message ne peut pas passer par le chemin initial, il peut être envoyé à un échange alternatif pour être routé par un autre chemin.

RabbitMQ. Partie 2. Comprenons les Exchanges

Si la création l'échange peut-être, alors le serveur enverra au client un RPC réponse Exchange.DeclareOk. Si la création est impossible (une erreur de demande est survenue Exchange.Declare), alors le canal sera fermé par le serveur à l'aide d'une commande asynchrone Channel.Close et le client recevra une exception OperationInterruptedException, qui contiendra un code d'erreur et sa description.

L'échange doit être créé avant de publier des messages. Si vous publiez un message dans un échange non existant — RabbitMQ il sera silencieusement supprimé.

Création d’un Exchange via l'interface graphique

Accédez au panneau d'administration RabbitMQ sous l'utilisateur guest (nom d'utilisateur : guest et mot de passe : guest). Notez que l'utilisateur guest ne peut se connecter qu'à partir de l'hôte local. Passons maintenant à l'onglet Exchanges et cliquez sur Ajouter un nouvel échange. Remplissez les propriétés :

RabbitMQ. Partie 2. Comprenons les Exchanges

La plupart des propriétés ont été décrites ci-dessus. Ici, nous noterons que si nous définissons Interne, il sera possible d'utiliser l'échange uniquement pour E2E. Producteur ne pourra pas envoyer de messages à un tel échange.

Conclusion

Lors de la conception du système, il est pratique de décrire la topologie de routage à l'aide d'un graphique. Mais avant de commencer à construire le graphique, il est nécessaire d'identifier les chemins à fort trafic, car ce sont eux qui nécessitent une capacité de bande passante plus élevée (performance). Ensuite, on peut classifier le trafic. Et ensuite, on peut commencer la construction.

S'il existe dans le graphique construit un ensemble fini de clés de routage, alors, il faut se tourner vers plusieurs échange fanout, qui sont liés 1:1 à la clé de routage. N'oublions pas que échange fanout le plus rapide.

Si le nombre de routes tend vers l'infini, il convient de prêter attention à a commencé à fonctionner jusqu'à ou, si le modèle n'est pas nécessaire, on peut choisir un échange direct, car il est plus rapide. a commencé à fonctionner jusqu'à.

Des combinaisons variées l'échange devraient aider à trouver la bonne configuration évolutive, qui répond à la fois aux exigences actuelles et croissantes du système.

Le nombre l'échange et des files d'attente doit être minimal par rapport au nombre de routes.

Dans le prochain article, nous commencerons à examiner plus en détail les Queues et Bindings.

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