Când se creează un schimb direct, acesta va direcționa mesajul către coada de așteptare care este legată de el.
Ok Julio, dar dacă am 2 cozi pe acest schimb?
Bună întrebare, prietene! 😉
În acest caz, intră în vigoare Cheia de rutare.
Cheia de rutare este un atribut responsabil pentru a informa schimbul către ce coadă trebuie direcționat mesajul.
Nota: Schimbul va direcționa mesajul primit numai către cozile de așteptare care au chei de rutare exact la fel.
Nota 2: Dacă cozile de așteptare legate au aceeași cheie de rutare, acest mesaj este direcționat către aceste cozi în paralel.
Fanout
În comparație cu tipul Direct, în Fanout nu avem figura Cheia de rutare.
Când un schimb Fanout primește un mesaj, o copie a acestui mesaj este trimisă către toate cozile de așteptare legate de el.
Topic
Imaginați-vă că tipul Topic este de tip Direct, dar cu particularități, cu tipare de chei de rutare.
În Topic, este posibil să se utilizeze tipare pentru cheile de rutare.
Aceste tipare pot fi create folosind caracterele * și #.
Când creăm un model de chei de rutare cu #, îi spunem centrului că acest # poate fi înlocuit cu 0 sau n cuvinte.
Când folosim *, îi spunem centrului că * poate fi înlocuit doar cu 1 cuvânt.
În consecință, atunci când un schimb de tip Topic primește un mesaj, acesta va verifica cheia de rutare a mesajului, va compara cu cheile de rutare ale cozilor și va trimite o copie a acelui mesaj către toate cozile în care cheile de rutare (mesaj și coadă) se combină.
Exemplu:
Ceava de rutare a mesajului: routing.key.test
În cazul de mai sus, mesajul va fi trimis la coada 1, 3 și 4. Nu va fi trimis la 2 deoarece tiparul necesită ca după „routing.” să existe un singur cuvânt, iar în cazul nostru sunt 2.
Headers
Înainte de a explica acest schimb, este necesar să informăm că este posibil să trimitem atribute în antetul unui mesaj (similar cu antetul din HTTP)
Schimbul de antet este similar cu cel de subiect, dar în loc de a compara cheia de rutare, acesta compară atributele prezente în antetul mesajului cu atributele prezente în argumentele definite atunci când legăm o coadă în schimb.
Este posibil să se creeze o regulă pentru această validare.
Pentru a crea această regulă, folosim argumentul cu cheia „x-match” cu 2 valori posibile: any și all.
Any este comparabil cu || unei condiții și all sunt comparabile cu &&.
Exemplu:
Când trimitem un mesaj cu argumentul {„key1”: „valoare1”} în antetul acestuia, acest mesaj va fi direcționat doar către coada „headers.queue1”, deoarece există atributul {„cheie1”: „value1”} în argumentele pentru această coadă.
În cazul cozii „headers.queue2”, schimbul va valida dacă antetul mesajului conține cele 2 argumente, deoarece „x-match” este setat la all. Prin urmare, schimbul nu va găsi {„key2”: „value2”} în antetul mesajului și nu va direcționa o copie a acelui mesaj către acea coadă.
Sper că această explicație rapidă vă poate ajuta să înțelegeți RabbitMQ Exchanges.
Pentru a afla mai multe: https://www.rabbitmq.com/tutorials/amqp-concepts.html