Partie 4 : échanges RabbitMQ, clés de routage et bindings

Qu’est-ce qu’un échange ? Que sont les clés de routage et les bindings ? Comment les échanges et les files d’attente sont-ils associés les uns aux autres ? Quand faut-il les utiliser et comment ? Cet article explique les différents types d’échanges dans RabbitMQ et les scénarios pour savoir comment les utiliser.

Les messages ne sont pas publiés directement dans une file d’attente. Au lieu de cela, le producteur envoie des messages à un échange. Les échanges sont des agents de routage de messages, définis par l’hôte virtuel au sein de RabbitMQ. Un échange est responsable du routage des messages vers différentes files d’attente à l’aide d’attributs d’en-tête, de liaisons et de clés de routage.

La liaison est un « lien « que vous configurez pour lier une file d’attente à un échange.

La clé de routage est un attribut de message que l’échange examine pour décider comment acheminer le message vers les files d’attente (selon le type d’échange).

Les échanges, les connexions et les files d’attente peuvent être configurés avec des paramètres tels que durable, temporaire et suppression automatique à la création. Les échanges durables survivent aux redémarrages du serveur et durent jusqu’à ce qu’ils soient explicitement supprimés. Les échanges temporaires existent jusqu’à l’arrêt de RabbitMQ. Les échanges autodétruits sont supprimés une fois que le dernier objet lié est délié de l’échange.

Dans RabbitMQ, il existe quatre types d’échanges différents qui acheminent le message différemment en utilisant différents paramètres et configurations de liaisons. Les clients peuvent créer leurs propres échanges ou utiliser les échanges prédéfinis par défaut qui sont créés lorsque le serveur démarre pour la première fois.

  1. Le producteur publie un message à l’échange.
  2. L’échange reçoit le message et est maintenant responsable de l’acheminement du message.
  3. Les liaisons doivent être configurées entre la file d’attente et l’échange. Dans ce cas, nous avons des liaisons avec deux files d’attente différentes à partir du central. L’échange route le message dans les files d’attente.
  4. Les messages restent dans la file d’attente jusqu’à ce qu’ils soient traités par un consommateur.
  5. Le consommateur traite le message.

Si vous n’êtes pas familier avec RabbitMQ et la mise en file d’attente des messages, lisezRabbitMQ pour les débutants – qu’est-ce que RabbitMQ ?avant de lire les échanges, les clés de routage, les en-têtes et les liaisons.

Échange direct

Un échange direct livre les messages aux files d’attente en fonction d’une clé de routage de message. La clé de routage est un attribut de message ajouté à l’en-tête du message par le producteur. Pensez à la clé d’acheminement comme une « adresse » que l’échange utilise pour décider comment acheminer le message.Un message va vers la ou les files d’attente avec la clé de liaison qui correspond exactement à la clé d’acheminement du message.

Le type d’échange direct est utile pour distinguer les messages publiés au même échange en utilisant un simple identifiant de chaîne.

L’échange par défaut que les courtiers AMQP doivent fournir pour l’échange direct est « amq.direct ».

Imaginez que la file d’attente A (create_pdf_queue) dans l’image ci-dessous (Figure de l’échange direct) est liée à un échange direct (pdf_events) avec la clé de liaisonpdf_create.Quand un nouveau message avec le routing keypdf_createarrive à l’échange direct, l’échange le route vers la file d’attente où lebinding_key = routing_key,dans le cas à la file d’attente A (create_pdf_queue).

Scénario 1

  • Échange : pdf_events
  • Queueue A : create_pdf_queue
  • Clé de liaison entre l’échange (pdf_events) et la queue A (create_pdf_queue) : pdf_create

Scénario 2

  • Échange : pdf_events
  • Queueueue B : pdf_log_queue
  • Clé de liaison entre l’échange (pdf_events) et la queue B (pdf_log_queue) : pdf_log

Exemple

Exemple : Un message avec la clé de routagepdf_logest envoyé à l’échangepdf_events.Les messages sont acheminés vers la file d’attente pdf_log parce que la clé de routage (pdf_log) correspond à la clé de liaison (pdf_log).

Si la clé de routage du message ne correspond à aucune clé de liaison, le message est écarté.

Échange direct : Un message va vers les files d’attente dont la clé de liaison correspond exactement à la clé de routage du message.

Échange par défaut

L’échange par défaut est un échange direct prédéclaré sans nom, généralement désigné par une chaîne vide. Lorsque vous utilisez l’échange par défaut, votre message est livré à la file d’attente dont le nom est égal à la clé de routage du message. Chaque file d’attente est automatiquement liée à l’échange par défaut avec une clé de routage qui est la même que le nom de la file d’attente.

Échange de sujets

Les échanges de sujets acheminent les messages vers les files d’attente en fonction des correspondances de caractères génériques entre la clé de routage et le motif de routage, qui est spécifié par la liaison de la file d’attente. Les messages sont acheminés vers une ou plusieurs files d’attente en fonction d’une correspondance entre une clé de routage des messages et ce motif.

La clé de routage doit être une liste de mots, délimitée par un point (.). Les exemples sontagreements.usetagreements.eu.stockholmqui, dans ce cas, identifie les accords mis en place pour une société ayant des bureaux dans de nombreux endroits différents. Les modèles de routage peuvent contenir un astérisque (« * ») pour correspondre à un mot dans une position spécifique de la clé de routage (par exemple, un modèle de routage de « agreements.*.*.b.* » correspond uniquement aux clés de routage où le premier mot est « agreements » et le quatrième mot est « b »). Un symbole dièse (« # ») indique une correspondance de zéro ou plusieurs mots (par exemple, un motif de routage de « accords.eu.berlin.# » correspond à toutes les clés de routage commençant par « accords.eu.berlin »).

Les consommateurs indiquent les sujets qui les intéressent (comme s’abonner à un flux pour un tag individuel). Le consommateur crée une file d’attente et met en place une liaison avec un modèle de routage donné vers l’échange. Tous les messages avec une clé de routage qui correspondent au motif de routage sont acheminés vers la file d’attente et y restent jusqu’à ce que le consommateur consomme le message.

L’échange par défaut que les courtiers AMQP doivent fournir pour l’échange de sujets est « amq.topic ».

Scénario 1

L’image de droite montre un exemple où le consommateur A est intéressé par tous les accords à Berlin.

  • Échange : accords
  • Queueueue A : berlin_agreements
  • Patron de routage entre l’échange (accords) et la Queue A (berlin_agreements) : accords.eu.berlin.#
  • Exemple de clé de routage de message qui correspond : accords.eu.berlin et accords.eu.berlin.headstore

Scénario 2

Le consommateur B est intéressé par tous les accords.

  • Échange : accords
  • Queueue B : tous_accords
  • Schéma de routage entre l’échange (accords) et la file B (tous_accords) : accords.#
  • Exemple de clé de routage des messages qui correspond : accords.eu.berlin et accords.us

Échange de sujets : Les messages sont acheminés vers une ou plusieurs files d’attente en fonction de la correspondance entre une clé d’acheminement des messages et le modèle d’acheminement.

Scénario 3

Le consommateur C est intéressé par tous les accords pour les magasins principaux européens.

  • Échange : accords
  • Queueueue C : headstore_agreements
  • Modèle de routage entre l’échange (accords) et la queue C (headstore_agreements) : accords.eu.*.headstore
  • Exemple de clés de routage de message qui correspondront : accords.eu.berlin.headstore et accords.eu.stockholm.headstore

Exemple

Un message avec clé de routage accords.eu.berlinest envoyé à l’échangeagreements.Les messages sont acheminés vers la file d’attenteberlin_agreementscar le motif de routage de « agreements.eu.berlin.# » correspond aux clés de routage commençant par « agreements.eu.berlin ». Le message est également acheminé vers la file d’attenteall_agreementsparce que la clé de routage (agreements.eu.berlin) correspond au motif de routage (agreements.#).

Échange fanout

Un échange fanout copie et achemine un message reçu vers toutes les files d’attente qui lui sont liées sans tenir compte des clés de routage ou de la correspondance des motifs comme pour les échanges directs et les échanges de sujets. Les clés fournies seront simplement ignorées.

Les échanges fanout peuvent être utiles lorsque le même message doit être envoyé à une ou plusieurs files d’attente avec des consommateurs qui peuvent traiter le même message de différentes manières.

L’image de droite (échange fanout) montre un exemple où un message reçu par l’échange est copié et acheminé vers les trois files d’attente liées à l’échange. Il peut s’agir de mises à jour sportives ou météorologiques qui doivent être envoyées à chaque appareil mobile connecté lorsque quelque chose se produit, par exemple.

L’échange par défaut que les courtiers AMQP doivent fournir pour l’échange de sujets est « amq.fanout ».

Fanout Exchange : Le message reçu est acheminé vers toutes les files d’attente liées à l’échange.

Scénario 1

  • Échange : sport_news
  • File d’attente A : file d’attente du client mobile A
  • Liaison : Liaison entre l’échange (sport_news) et la file d’attente A (file d’attente de clients mobiles A)

Exemple

Un message est envoyé à l’échange sport_news.Le message est acheminé vers toutes les files d’attente (file d’attente A, file d’attente B, file d’attente C) parce que toutes les files d’attente sont liées à l’échange. Les clés de routage fournies sont ignorées.

Échange d’en-têtes

Un échange d’en-têtes achemine les messages sur la base d’arguments contenant des en-têtes et des valeurs facultatives. Les échanges d’en-têtes sont très similaires aux échanges de sujets, mais ils routent les messages sur la base des valeurs d’en-tête au lieu des clés de routage. Un message correspond si la valeur de l’en-tête est égale à la valeur spécifiée lors de la liaison.

Un argument spécial nommé « x-match », ajouté dans la liaison entre l’échange et la file d’attente, spécifie si tous les en-têtes doivent correspondre ou seulement un. Soit tout en-tête commun entre le message et la liaison compte comme une correspondance, soit tous les en-têtes référencés dans la liaison doivent être présents dans le message pour qu’il corresponde. La propriété « x-match » peut avoir deux valeurs différentes : « any » ou « all », où « all » est la valeur par défaut. Une valeur de « all » signifie que toutes les paires d’en-têtes (clé, valeur) doivent correspondre, tandis qu’une valeur de « any » signifie qu’au moins une des paires d’en-têtes doit correspondre. Les en-têtes peuvent être construits en utilisant une gamme plus large de types de données, un entier ou un hachage par exemple, au lieu d’une chaîne. Le type d’échange d’en-têtes (utilisé avec l’argument de liaison « any ») est utile pour diriger les messages qui contiennent un sous-ensemble de critères connus (non ordonnés).

L’échange par défaut que les courtiers AMQP doivent fournir pour l’échange de sujets est « amq.headers ».

Exemple

Scénario 3

Le message 3 est publié à l’échange avec les arguments d’en-tête de (clé = valeur) : « format = zip », « type = log ».

Il est intéressant de noter que dans un échange d’en-tête, l’ordre réel des paires clé-valeur dans le message n’est pas pertinent.

Échange de lettres mortes

Si aucune file d’attente correspondante ne peut être trouvée pour le message, celui-ci est silencieusement abandonné. RabbitMQ fournit une extension AMQP connue sous le nom de « Dead Letter Exchange », qui fournit la fonctionnalité pour capturer les messages qui ne sont pas livrables.

Veuillez nous envoyer un courriel à [email protected] si vous avez des suggestions sur le contenu manquant ou d’autres commentaires.

Guide – RabbitMQ pour les débutants

Vous avez apprécié cet article ? N’oubliez pas de le partager avec d’autres personnes 😉

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.