Exchange — schimbător sau punct de schimb. I se trimit mesaje. Exchangedistribuie 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.
RabbitMQ. Partea 3. Înțelegerea cozilor și legăturilor
RabbitMQ. Partea 4. Înțelegerea ce sunt mesajele și cadrele
RabbitMQ. Partea 5: Publicarea mesajelor și performanța consumului
RabbitMQ. Partea 6. Revizuirea modulelor Federație și Shovel
RabbitMQ. Partea 7. Detalii despre Connection și Chanel
RabbitMQ. Partea 8. RabbitMQ în .NET
RabbitMQ. Partea 9. Monitorizare
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 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:
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ă:
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:
RabbitMQnu 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:
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:
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:
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:
Î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:
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ă.
Dacă creaţia exchangeeste 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:
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.