Partea 4: Schimburi RabbitMQ, chei de rutare și bindings

Ce este un schimb? Ce sunt cheile de rutare și bindings? Cum sunt asociate schimburile și cozile de așteptare între ele? Când ar trebui să le folosesc și cum? Acest articol explică diferitele tipuri de schimburi din RabbitMQ și scenariile de utilizare a acestora.

Mesajele nu sunt publicate direct într-o coadă. În schimb, producătorul trimite mesaje către un schimb. Schimburile sunt agenți de rutare a mesajelor, definiți de gazda virtuală în cadrul RabbitMQ. Un exchange este responsabil de rutarea mesajelor către diferite cozi cu ajutorul atributelor de antet, al legăturilor și al cheilor de rutare.

Legătura este o „legătură” pe care o configurați pentru a lega o coadă de un exchange.

Ceaiul de rutare este un atribut al mesajului pe care schimbul îl analizează atunci când decide cum să ruteze mesajul către cozile de așteptare (în funcție de tipul de schimb).

Schimburile, conexiunile și cozile de așteptare pot fi configurate cu parametri cum ar fidurabil, temporar și ștergere automată la creare. Schimburile durabile supraviețuiesc repornirilor serverului și durează până când sunt șterse în mod explicit. Schimburile temporare există până la închiderea RabbitMQ. Schimburile cu ștergere automată sunt eliminate odată ce ultimul obiect legat este dezlegat din schimb.

În RabbitMQ, există patru tipuri diferite de schimburi care direcționează mesajul în mod diferit, folosind parametri și setări diferite ale legăturilor. Clienții își pot crea propriile schimburi sau pot folosi schimburile predefinite implicite care sunt create atunci când serverul pornește pentru prima dată.

  1. Producătorul publică un mesaj către schimb.
  2. Schimbul primește mesajul și este acum responsabil de rutarea mesajului.
  3. Legăturarea trebuie să fie configurată între coada de așteptare și schimb. În acest caz, avem legături către două cozi diferite de la schimb. Schimbul rutează mesajul în cozile de așteptare.
  4. Mesajele rămân în coada de așteptare până când sunt gestionate de un consumator.
  5. Consumatorul gestionează mesajul.

Dacă nu sunteți familiarizat cu RabbitMQ și coada de așteptare a mesajelor, citițiRabbitMQ pentru începători – ce este RabbitMQ?înainte de a citi despre schimburi, chei de rutare, anteturi și legături.

Schimb direct

Un schimb direct livrează mesaje către cozile de așteptare pe baza unei chei de rutare a mesajelor. Cheia de rutare este un atribut al mesajului adăugat la antetul mesajului de către producător. Gândiți-vă la cheia de rutare ca la o „adresă” pe care schimbul o folosește pentru a decide cum să ruteze mesajul.Un mesaj merge la coada (cozile) cu cheia de legare care se potrivește exact cu cheia de rutare a mesajului.

Tipul de schimb direct este util pentru a distinge mesajele publicate la același schimb folosind un simplu identificator de șir de caractere.

Schimbul implicit pe care brokerii AMQP trebuie să îl furnizeze pentru schimbul direct este „amq.direct”.

Imaginați-vă că coada A (create_pdf_queueue) din imaginea de mai jos (Figura schimb direct) este legată de un schimb direct (pdf_events) cu cheia de legarepdf_create.Atunci când un mesaj nou cu cheia de rutarepdf_create sosește la schimbul direct, schimbul îl direcționează către coada de așteptare în care cheia de legare = cheia de rutare, în acest caz către coada A (create_pdf_queue).

Scenariu 1

  • Schimb: pdf_events
  • Coada A: create_pdf_queue
  • Ceea de legătură între schimb (pdf_events) și coada A (create_pdf_queue): pdf_create

Scenariu 2

  • Schimb: pdf_events
  • Coada B: pdf_log_queue
  • Caiă de legătură între schimbul (pdf_events) și coada B (pdf_log_queue): pdf_log

Exemplu

Exemplu: Un mesaj cu cheia de rutarepdf_log este trimis la schimbulpdf_events.Mesajul este direcționat către pdf_log_queue deoarece cheia de rutare (pdf_log) se potrivește cu cheia de legare (pdf_log).

Dacă cheia de rutare a mesajului nu se potrivește cu nici o cheie de legare, mesajul este eliminat.

Schimb direct: Un mesaj merge la cozile a căror cheie de legare se potrivește exact cu cheia de rutare a mesajului.

Schimbul implicit

Schimbul implicit este un schimb direct pre-declarat fără nume, denumit de obicei printr-un șir de caractere gol. Atunci când utilizați schimbul implicit, mesajul este livrat în coada de așteptare cu un nume egal cu cheia de rutare a mesajului. Fiecare coadă este automat legată la schimbul implicit cu o cheie de rutare care este identică cu numele cozii.

Schimb de subiecte

Schimburile de subiecte direcționează mesajele către cozile de așteptare pe baza unor corespondențe de tip wildcard între cheia de rutare și modelul de rutare, care este specificat de legarea cozii. Mesajele sunt direcționate către una sau mai multe cozi pe baza unei corespondențe între o cheie de rutare a mesajelor și acest model.

Calea de rutare trebuie să fie o listă de cuvinte, delimitată de un punct (.). Exemplele suntagreements.usșiagreements.eu.stockholmcare, în acest caz, identifică acordurile care sunt stabilite pentru o companie cu birouri în multe locații diferite. Modelele de rutare pot conține un asterisc („*”) pentru a se potrivi cu un cuvânt aflat într-o anumită poziție a cheii de rutare (de exemplu, un model de rutare „agreements.*.*.*.b.*” se potrivește numai cu cheile de rutare în care primul cuvânt este „agreements” și al patrulea cuvânt este „b”). Un simbol de lire sterline („#”) indică o potrivire a zero sau mai multe cuvinte (de exemplu, un model de rutare „agreements.eu.berlin.#” se potrivește cu toate cheile de rutare care încep cu „agreements.eu.berlin”).

Consumatorii indică subiectele de care sunt interesați (cum ar fi abonarea la un flux pentru o etichetă individuală). Consumatorul creează o coadă de așteptare și stabilește o legătură cu un anumit model de rutare către schimb. Toate mesajele cu o cheie de rutare care se potrivesc cu modelul de rutare sunt direcționate către coada de așteptare și rămân acolo până când consumatorul consumă mesajul.

Schimbul implicit pe care brokerii AMQP trebuie să îl furnizeze pentru schimbul de subiecte este „amq.topic”.

Scenariu 1

Imaginea din dreapta prezintă un exemplu în care consumatorul A este interesat de toate acordurile din Berlin.

  • Exchange: agreements
  • Queue A: berlin_agreements
  • Plan de rutare între exchange (agreements) și Queue A (berlin_agreements): agreements.eu.berlin.#
  • Exemplu de cheie de rutare a mesajelor care se potrivește: agreements.eu.berlin și agreements.eu.berlin.headstore

Scenariu 2

Consumatorul B este interesat de toate acordurile.

  • Schimb: agreements
  • Coada B: all_agreements
  • Plan de rutare între exchange (agreements) și Coada B (all_agreements): agreements.#
  • Exemplu de cheie de rutare a mesajelor care se potrivește: agreements.eu.berlin și agreements.us

Schimb de subiecte: Mesajele sunt direcționate către una sau mai multe cozi pe baza unei corespondențe între o cheie de rutare a mesajelor și modelul de rutare.

Scenariu 3

Consumatorul C este interesat de toate acordurile pentru magazinele centrale europene.

  • Schimb: agreements
  • Coada C: headstore_agreements
  • Plan de rutare între exchange (agreements) și Queue C (headstore_agreements): agreements.eu.*.headstore
  • Exemplu de chei de rutare a mesajelor care se vor potrivi: agreements.eu.berlin.headstore și agreements.eu.stockholm.headstore

Exemplu

Un mesaj cu chei de rutareagreements.eu.berlineste trimis la exchangeagreements.Mesajele sunt direcționate către queueberlin_agreementspentru că modelul de rutare „agreements.eu.berlin.#” se potrivește cu cheile de rutare care încep cu „agreements.eu.berlin”. Mesajul este, de asemenea, direcționat către coadaall_agreementsdeoarece cheia de rutare (agreements.eu.berlin) se potrivește cu modelul de rutare (agreements.#).

Schimb fanout

Un schimb fanout copiază și direcționează un mesaj primit către toate cozile de așteptare care îi sunt legate, indiferent de cheile de rutare sau de potrivirea modelului, ca în cazul schimburilor directe și al schimburilor de subiecte. Cheile furnizate vor fi pur și simplu ignorate.

Schimburile fanout pot fi utile atunci când același mesaj trebuie trimis la una sau mai multe cozi cu consumatori care pot procesa același mesaj în moduri diferite.

Imaginea din dreapta (Fanout Exchange) prezintă un exemplu în care un mesaj primit de către schimb este copiat și direcționat către toate cele trei cozi legate de schimb. Ar putea fi actualizări sportive sau meteorologice care ar trebui să fie trimise către fiecare dispozitiv mobil conectat atunci când se întâmplă ceva, de exemplu.

Schimbul implicit pe care brokerii AMQP trebuie să îl furnizeze pentru schimbul de subiecte este „amq.fanout”.

Fanout Exchange: Mesajul primit este direcționat către toate cozile de așteptare care sunt legate de schimb.

Scenariu 1

  • Schimb: sport_news
  • Coadă A: Coada de așteptare a clientului mobil A
  • Binding: Legătura dintre exchange (sport_news) și coada A (coada A a clientului mobil A)

Exemplu

Se trimite un mesaj către exchangeport_news.Mesajul este direcționat către toate cozile (coada A, coada B, coada C) deoarece toate cozile sunt legate de exchange. Cheile de rutare furnizate sunt ignorate.

Schimb de antet

Un schimb de antet rutează mesajele pe baza unor argumente care conțin antet și valori opționale. Schimburile de antet sunt foarte asemănătoare cu schimburile de subiecte, dar rutează mesajele pe baza valorilor antetului în loc de cheile de rutare. Un mesaj se potrivește dacă valoarea antetului este egală cu valoarea specificată la legare.

Un argument special numit „x-match”, adăugat în legarea dintre schimb și coadă, specifică dacă toate antetele trebuie să se potrivească sau doar unul singur. Fie orice antet comun între mesaj și legătura contează ca o potrivire, fie toate anteturile la care se face referire în legătură trebuie să fie prezente în mesaj pentru ca acesta să se potrivească. Proprietatea „x-match” poate avea două valori diferite: „any” sau „all”, unde „all” este valoarea implicită. O valoare „all” înseamnă că toate perechile de antet (cheie, valoare) trebuie să corespundă, în timp ce valoarea „any” înseamnă că cel puțin una dintre perechile de antet trebuie să corespundă. Antetele pot fi construite folosind o gamă mai largă de tipuri de date, de exemplu, un întreg sau un hash, în loc de un șir de caractere. Tipul de schimb de antete (utilizat cu argumentul de legătură „any”) este util pentru direcționarea mesajelor care conțin un subset de criterii cunoscute (neordonate).

Echimbul implicit pe care brokerii AMQP trebuie să îl furnizeze pentru schimbul de subiecte este „amq.headers”.

Exemplu

Scenariu 3

Mesajul 3 este publicat la schimb cu argumente de antet de (cheie = valoare): „format = zip”, „tip = log”.

Este demn de remarcat faptul că, într-un schimb de antet, ordinea reală a perechilor cheie-valoare din mesaj este irelevantă.

Schimb de scrisori moarte

Dacă nu se găsește o coadă de așteptare corespunzătoare pentru mesaj, mesajul este abandonat în mod silențios. RabbitMQ oferă o extensie AMQP cunoscută sub numele de „Dead Letter Exchange” (Schimb de scrisori moarte), care oferă funcționalitatea de a captura mesajele care nu pot fi livrate.

Vă rugăm să ne trimiteți un e-mail la [email protected] dacă aveți sugestii cu privire la conținutul lipsă sau alte feedback-uri.

Ghid – RabbitMQ pentru începători

Ai apreciat acest articol? Nu uitați să îl distribuiți și altora 😉

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.