RabbitMQ. Partea 2. Înțelegerea schimburilor

Exchange — schimbător sau punct de schimb. I se trimit mesaje. Exchange distribuie mesajul în una sau mai multe cozi. El direcționează mesajele către o coadă pe baza conexiunilor create (bindings) între el și coadă.

Exchange nu este procesul Erlang. Din motive de scalabilitate exchange - aceasta este o linie (link la un modul cu cod în care se află logica de rutare) în baza de date încorporată mnezie. 1 mie de schimbătoare vor consuma doar 1MB de memorie.

Cuprins

Schimb direct

Direct exchange - folosit la nevoie livrarea mesajului către anumite cozi. Mesajul este publicat la schimbător cu un specific cheie de rutare și intră în toate cozile care sunt conectate la acest schimbător cu o cheie de rutare similară. Cheia de rutare este un șir. Potrivirea se găsește folosind verificarea echivalenței șirurilor.

Reprezentarea grafică a fluxului de mesaje:

RabbitMQ. Partea 2. Înțelegerea schimburilor

В rabbitmq există un concept schimbător implicit. Aceasta direct exchange fara nume. Dacă se folosește schimbătorul implicit, mesajul va fi direcționat către o coadă cu un nume egal cu cheie de rutare a mesajelor.

Schimb de subiecte

Topic exchange – asemănătoare direct exchange permite rutarea selectivă prin compararea cheii de rutare. Dar, în acest caz, cheia este dată după șablon. Când creați un șablon, utilizați 0 sau mai multe cuvinte (litere AZ и az si numere 0-9), separate printr-un punct, precum și simboluri * и #.

  • * - poate fi inlocuit cu exact 1 слово
  • # - poate fi înlocuit cu 0 sau mai multe cuvinte

Reprezentarea grafică a fluxului de mesaje:

RabbitMQ. Partea 2. Înțelegerea schimburilor

Din versiune RabbitMQ 2.4.0 algoritm de rutare pentru topic exchange a început să lucreze până când 145 ori mai repede. Au realizat acest lucru prin introducerea unei abordări încercați implementarea, care implică reprezentarea modelelor ca structură arborescentă. De exemplu șabloane a.b.c, a.*.b.c, a.#.c и b.b.c va fi reprezentat de următoarea structură:

RabbitMQ. Partea 2. Înțelegerea schimburilor

Căutarea pentru potrivirea unui model se efectuează pornind de la rădăcină și mergând de sus în jos.

Caracteristici:

  • utilizarea acestui schimbător poate deveni o alegere bună pentru o posibilă dezvoltare viitoare a aplicației, deoarece șabloanele pot fi întotdeauna personalizate, astfel încât mesajul să fie publicat în același mod direct exchange sau fanout exchange
  • șabloane care utilizează * mult mai repededecât șabloanele care folosesc #.
  • topic exchange Mai lent direct exchange

Schimb de fanout

Fanout exchange - toate mesajele sunt livrate la toate cozile chiar dacă în mesaj este specificată o cheie de rutare.

Caracteristici:

  • RabbitMQ nu funcționează cu cheile de rutare și șabloane care are un efect pozitiv asupra productivităţii. Acesta este cel mai rapid exchange;
  • toți consumatorii trebuie să poată procesa toate mesajele;

Reprezentarea grafică a fluxului de mesaje:

RabbitMQ. Partea 2. Înțelegerea schimburilor

Schimb de anteturi

Headers exchange - direcționează mesajele către cozile asociate pe baza comparării perechilor de proprietăți (cheie, valoare). headers legături și proprietăți similare ale mesajului. headers este a Dictionary<ключ, значение>.

Dacă adăugați o cheie specială la dicționar x-match cu sens any, atunci mesajul este direcționat dacă există o potrivire parțială a perechilor (cheie, valoare). Acest comportament este similar cu cel al operatorului or.

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

Cheie implicită x-match conţine valoarea all. Aceasta înseamnă că mesajul este direcționat dacă perechile (cheie, valoare) se potrivesc exact. Acest comportament este similar cu cel al operatorului and.

Reprezentarea grafică a fluxului de mesaje:

RabbitMQ. Partea 2. Înțelegerea schimburilor

Caracteristici:

  • flexibilitate suplimentară
  • cheltuieli de calcul suplimentare. Toate perechile (cheie, valoare) ale unui atribut headers trebuie sortat după numele cheii înainte de a calcula valorile de rutare a mesajelor. Mai lent decât alte tipuri de schimb.

Schimb de hashing consistent

Acest schimbător este conecteaza и nu încorporat в RabbitMQ.

Consistent-hashing exchange (schimb cu hashing consistent) - folosit atunci când există mai multe cozi care sunt potențiali destinatari ai unui mesaj și când trebuie să echilibrați încărcarea dintre ele. Conexiunea unui mesaj cu coada are loc în funcție de greutate (valoarea șirului condiționat de la 0 - n).

Greutatea echivalentă a cozilor - indică faptul că fiecare coadă va primi aproximativ aceeași cantitate mesaje (fiecare mesaj va fi plasat într-o singură coadă). Nu există o garanție completă a distribuirii uniforme a mesajelor.

Reprezentarea grafică a fluxului de mesaje:

RabbitMQ. Partea 2. Înțelegerea schimburilor

Hash calculat pe baza cheii de rutare sau a proprietății headers mesaje. Dacă toate mesajele publicate aveau chei de rutare diferite sau headers, atunci distribuția va avea loc în funcție de greutate. În caz contrar, se va folosi cheia de rutare sau headers.

Ar trebui să ajute atunci când debitul consumatorilor trebuie să crească mai mult decât o soluție cu mai mulți consumatori care utilizează o singură coadă.

Schimbătoare combinate (E2E)

Comportamentul tuturor schimbătorilor poate fi combinat folosind comunicare Schimb cu schimb (schimbătoarele combinate nu sunt incluse în specificație AMQP. Aceasta este o extensie a protocolului din lateral RabbitMQ).

Reprezentarea grafică a fluxului de mesaje:

RabbitMQ. Partea 2. Înțelegerea schimburilor

În detrimentul E2E putem găsi configurația scalabilă potrivită pentru a răspunde atât cerințelor actuale, cât și în creștere.

Creați Exchange

Crearea unui schimbător are loc folosind sincron RPC cerere către server. Solicitarea se face folosind metoda Exchange.Declareapelat cu parametri:

  • numele schimbătorului
  • tip schimbător
  • alți parametri

Exemplu de creație exchange cu ajutorul RabbitMQ.Client:

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

  • exchange — numele schimbătorului pe care dorim să-l creăm. Numele trebuie să fie unic
  • type — tip de schimbător
  • durable - dacă este instalat true, Apoi, exchange va fi permanent. Acesta va fi stocat pe disc și poate supraviețui unei reporniri a serverului/brokerului. Dacă valoarea false, Apoi, exchange este temporară și va fi șters când serverul/brokerul este repornit
  • autoDelete - îndepărtare automată. Exchange vor fi șterse atunci când toate cozile asociate cu acesta sunt șterse
  • arguments - argumente optionale. Cel mai adesea, ele precizează prin argumente alternative exchange (schimbător alternativ). Dacă un mesaj nu poate călători pe traseul inițial, acesta poate fi trimis către un schimbător alternativ pentru a fi direcționat pe o cale diferită.

RabbitMQ. Partea 2. Înțelegerea schimburilor

Dacă creaţia exchange este posibil, atunci serverul va trimite clientului un sincron RPC răspunde Exchange.DeclareOk. Dacă creaţia este imposibil (cererea a fost respinsă Exchange.Declare) apoi canalul se va închide server folosind o comandă asincronă Channel.Close iar clientul va primi o excepție OperationInterruptedException, care va conține codul de eroare și descrierea acestuia.

Trebuie creat un schimbător înainte de a posta mesaje. Dacă publicați un mesaj către un schimbător inexistent - RabbitMQ îl va îndepărta în liniște.

Crearea Exchange prin GUI

Accesați panoul de administrare RabbitMQ sub utilizator guest (nume de utilizator: guest si parola: guest). Vă rugăm să rețineți că utilizatorul guest se poate conecta numai de la localhost. Acum să trecem la filă Exchanges și faceți clic pe Add a new exchange. Completați proprietățile:

RabbitMQ. Partea 2. Înțelegerea schimburilor

Majoritatea proprietăților au fost descrise mai sus. Aici observăm că dacă setăm Internal, atunci schimbul poate fi folosit doar pentru E2E. Producer nu va putea trimite mesaje unui astfel de schimb.

Concluzie

Când se dezvoltă un sistem, este convenabil să se descrie topologia rutare folosind un grafic. Dar înainte de a începe să construiți un grafic, merită să evidențiați căile cu trafic ridicat, deoarece ei sunt cei care cer debit mai mare (performanţă). Apoi, puteți clasifica traficul. Și abia atunci începe să construiești.

Dacă în graficul construit există mulţime finită chei de rutare, atunci merită să vă uitați la mai multe fanout exchange, care sunt 1:1 legate de cheia de rutare. Ne amintim asta fanout exchange cel mai rapid.

Dacă numărul de rute tinde spre infinit, atunci ar trebui să acordați atenție topic exchange sau, dacă șablonul nu este necesar, puteți selecta direct exchnge, deoarece el este mai rapid topic exchange.

Combinații de diferite exchange ar trebui să te ajute să-l găsești pe cel potrivit configurație scalabilă, care îndeplinește atât cerințele de sistem actuale, cât și în creștere.

Număr exchange iar cozile ar trebui să fie minime în comparație cu numărul de rute.

În articolul următor vom începe să înțelegem Cozile și Legăturile mai detaliat.

referințe

Sursa: www.habr.com

Adauga un comentariu