Lorsque l’on crée un échange direct, il dirigera le message vers la file d’attente qui lui est liée.
Ok Julio, mais si j’ai 2 files d’attente sur cet échange ?
Bonne question mon ami ! 😉
Dans ce cas, la clé de routage prend effet.
La clé de routage est un attribut chargé d’informer l’échange vers quelle file d’attente le message doit être dirigé.
Note : Le central ne dirigera le message reçu que vers les files d’attente qui ont des clés de routage exactement identiques.
Note 2 : Si les files d’attente liées ont la même clé de routage, ce message est dirigé vers ces files d’attente en parallèle.
Fanout
À la différence du type Direct, dans le fanout, nous n’avons pas le chiffre de la clé de routage.
Lorsqu’un échange Fanout reçoit un message, une copie de ce message est envoyée à toutes les files d’attente qui lui sont liées.
Topic
Imaginez que le type Topic est le type Direct mais avec une particularité, les motifs de clés de routage.
Dans le Topic, il est possible d’utiliser des motifs pour les clés de routage.
Ces motifs peuvent être créés en utilisant les caractères * et #.
Lorsque l’on crée un motif de clé de routage avec #, on indique à l’échange que ce # peut être remplacé par 0 ou n mots.
Lorsque l’on utilise *, on indique pour l’échange que * ne peut être remplacé que par 1 mot.
Par conséquent, lorsqu’un échange de type Topic reçoit un message, il vérifie la clé de routage du message, compare avec les clés de routage des files d’attente et envoie une copie de ce message à toutes les files d’attente dans lesquelles les clés de routage (message et file d’attente) se combinent.
Exemple:
Clé de routage du message : routing.key.test
Dans le cas ci-dessus, le message sera envoyé à la file 1, 3 et 4. Il ne sera pas envoyé à 2 car le motif exige qu’il n’y ait qu’un seul mot après « routing » et dans notre cas, il y en a 2.
Headers
Avant d’expliquer cet échange, il est nécessaire d’informer qu’il est possible d’envoyer des attributs dans l’en-tête d’un message (similaire à l’en-tête de HTTP)
L’échange d’en-têtes est similaire à Topic, mais au lieu de comparer Routing Key, il compare les attributs présents dans l’en-tête du message avec les attributs présents dans les arguments définis lorsque nous lions une file d’attente en échange.
Il est possible de créer une règle pour cette validation.
Pour créer cette règle, nous utilisons l’argument avec la clé « x-match » avec 2 valeurs possibles : any et all.
Tout est comparable à || d’une condition et tous sont comparables à &&.
Exemple:
Lorsque nous envoyons un message avec l’argument {« clé1 » : « value1 »} dans l’en-tête de celui-ci, ce message sera dirigé uniquement vers la file d’attente « headers.queue1 » car il y a l’attribut {« key1 » : « value1 »} dans les arguments de cette file.
Dans le cas de la file « headers.queue2 », l’échange validera si l’en-tête du message contient les 2 arguments puisque le « x-match » est défini sur all. Par conséquent, l’échange ne trouvera pas l’argument {« key2 » : « value2 »} dans l’en-tête du message et ne dirigera pas une copie de ce message vers cette file d’attente.
J’espère que cette explication rapide pourra vous aider à comprendre les échanges RabbitMQ.
Pour en savoir plus : https://www.rabbitmq.com/tutorials/amqp-concepts.html