RabbitMQ. Dio 2. Razumijevanje razmjena

Exchange - izmjenjivač ili mjesto zamjene. Na njega se šalju poruke. Exchange distribuira poruku u jednom ili više redova. On usmjerava poruke u red čekanja na osnovu kreiranih linkova (bindings) između njega i reda.

Exchange nije Erlang proces. Iz razloga skalabilnosti exchange je niz (veza na modul sa kodom gdje je logika usmjeravanja) u ugrađenoj bazi podataka mnezija. 1 izmjenjivača će potrošiti samo 1MB memorije.

Sadržaj

  • RabbitMQ. Dio 1. Uvod. Erlang, AMQP i RPC
  • RabbitMQ. Dio 2. Razumijevanje razmjena
  • RabbitMQ. Dio 3. Razumijevanje redova i veza
  • RabbitMQ. Dio 4. Bavljenje onim što su poruke i okviri
  • RabbitMQ. Dio 5: Izvedba objavljivanja i konzumiranja poruka
  • RabbitMQ. Dio 6. Pregled modula Federacije i Lopate
  • RabbitMQ. Dio 7. Detalji o Connectionu i Chanelu
  • RabbitMQ. Dio 8. RabbitMQ u .NET-u
  • RabbitMQ. Dio 9. Monitoring

Direktna razmjena

Direct exchange - koristi se po potrebi dostaviti poruku određenim redovima. Poruka se objavljuje razmenjivaču sa određenim ključ za rutiranje i ulazi u sve redove koji su povezani sa ovim izmenjivačem sa sličnim ključem za rutiranje. Ključ za usmjeravanje je niz. Usklađivanje se vrši pomoću provjeravanje jednakosti nizova.

Grafički prikaz toka poruke:

RabbitMQ. Dio 2. Razumijevanje razmjena

В rabbitmq postoji koncept podrazumevani razmenjivač. Ovo direct exchange bez imena. Ako se koristi zadani izmjenjivač, tada će poruka biti preusmjerena u red s imenom jednakim ključ za usmjeravanje poruka.

Razmjena tema

Topic exchange – slično direct exchange omogućava selektivno usmjeravanje uspoređivanjem ključa za usmjeravanje. Ali, u ovom slučaju, ključ je dat po šablonu. Kada kreirate šablon, koristite 0 ili više riječi (slova AZ и az i brojevi 0-9), odvojenih tačkom, kao i simbolima * и #.

  • * - može se zamijeniti sa tačno 1 riječ
  • # - može se zamijeniti 0 ili više reči

Grafički prikaz toka poruke:

RabbitMQ. Dio 2. Razumijevanje razmjena

Počevši od verzije RabbitMQ 2.4.0 algoritam rutiranja za topic exchange počeo sa radom do 145 puta brže. To su postigli implementacijom pristupa probaj implementaciju, što implicira predstavljanje šablona kao stabla strukture. Na primjer šabloni a.b.c, a.*.b.c, a.#.c и b.b.c će biti predstavljen sljedećom strukturom:

RabbitMQ. Dio 2. Razumijevanje razmjena

Podudaranje uzoraka se traži počevši od korijena i idući od vrha do dna.

RћSЃRѕR ± RμRЅRЅRѕSЃS, Rё:

  • upotreba ovog izmjenjivača može postati dobar izbor za mogući budući razvoj aplikacija, jer šabloni se uvijek mogu prilagoditi tako da se poruka objavi na sličan način direct exchange ili fanout exchange
  • šabloni koji koriste * mnogo brženego šabloni koji koriste #.
  • topic exchange sporije direct exchange

Fanout Exchange

Fanout exchange - sve poruke se isporučuju u sve redove čak i ako je ključ za usmjeravanje naveden u poruci.

RћSЃRѕR ± RμRЅRЅRѕSЃS, Rё:

  • RabbitMQ ne radi s ključevima za usmjeravanje i predlošcima što pozitivno utiče na performanse. Ovo je najbrže exchange;
  • svi potrošači moraju biti u mogućnosti obraditi sve poruke;

Grafički prikaz toka poruke:

RabbitMQ. Dio 2. Razumijevanje razmjena

Razmjena zaglavlja

Headers exchange - usmjerava poruke u povezane redove na osnovu poređenja parova svojstava (ključ, vrijednost). headers obvezujuća i slična svojstva poruke. headers je a Dictionary<ключ, значение>.

Ako u rječnik dodate poseban ključ x-match sa značenjem any, tada se poruka usmjerava ako se parovi (ključ, vrijednost) djelimično podudaraju. Ovo ponašanje je slično kao kod operatera or.

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

Zadani ključ x-match sadrži vrijednost all. To znači da se poruka usmjerava kada se parovi (ključ, vrijednost) potpuno podudaraju. Ovo ponašanje je slično kao kod operatera and.

Grafički prikaz toka poruke:

RabbitMQ. Dio 2. Razumijevanje razmjena

RћSЃRѕR ± RμRЅRЅRѕSЃS, Rё:

  • dodatna fleksibilnost
  • dodatni računski troškovi. Svi parovi (ključ, vrijednost) atributa headers mora se sortirati po imenu ključa prije izračunavanja vrijednosti usmjeravanja poruka. Sporije od ostalih vrsta razmjene.

Konzistentna razmjena heširanja

Ovaj izmjenjivač je plugin и nije ugrađeno в RabbitMQ.

Consistent-hashing exchange (razmjena dosljedna heš-u) - koristi se kada postoji više redova koji su potencijalni primaoci poruke i kada trebate uspostaviti balans opterećenja između njih. Poruka je povezana s redom po težini (uslovna vrijednost niza iz 0 - n).

Ekvivalentna težina redova - označava da će svaki red primiti otprilike isti iznos poruke (svaka poruka će biti stavljena u samo jedan red čekanja). Ne postoji potpuna garancija ujednačene distribucije poruka.

Grafički prikaz toka poruke:

RabbitMQ. Dio 2. Razumijevanje razmjena

Hash izračunati na osnovu ključa ili svojstva rutiranja headers poruke. Ako su sve objavljene poruke imale različite ključeve za usmjeravanje, ili headers, tada će se raspodjela dogoditi po težini. U suprotnom će se koristiti ključ za usmjeravanje ili headers.

Trebalo bi pomoći kada propusnost potrošača treba porasti više od rješenja s više potrošača koji koriste isti red čekanja.

Kombinacija izmjenjivača (E2E)

Ponašanje svih izmjenjivača može se kombinirati korištenjem komunikacije Exchange-to-Exchange (kombinacija izmjenjivača nije uključena u specifikaciju AMQP. Ovo je proširenje protokola sa strane RabbitMQ).

Grafički prikaz toka poruke:

RabbitMQ. Dio 2. Razumijevanje razmjena

Na račun E2E možemo pronaći pravu skalabilnu konfiguraciju koja zadovoljava i trenutne i rastuće zahtjeve.

Kreirajte Exchange

Izmjenjivač se kreira pomoću sinhrone RPC zahtev serveru. Zahtjev se postavlja metodom Exchange.Declarepoziva se sa parametrima:

  • naziv razmenjivača
  • tip izmenjivača
  • druge opcije

Primjer stvaranja exchange uz pomoć RabbitMQ.Client:

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

  • exchange - naziv razmenjivača koji želimo da kreiramo. Ime mora biti jedinstveno
  • type - tip izmjenjivača
  • durable - ako je instaliran true, onda exchange će biti trajna. Biće pohranjen na disku i moći će preživjeti ponovno pokretanje servera/brokera. Ako vrijednost false, onda exchange je privremeno i biće uklonjeno kada se server/broker ponovo pokrene
  • autoDelete - automatsko brisanje. Exchange će biti obrisan kada se izbrišu svi povezani redovi
  • arguments su neobavezni argumenti. Najčešće, kroz skup argumenata alternative exchange (alternativni izmjenjivač). Ako poruka ne može proći kroz originalnu rutu, može se poslati na alternativnu razmjenu kako bi se usmjerila drugom putanjom.

RabbitMQ. Dio 2. Razumijevanje razmjena

Ako stvaranje exchange moguće, tada će server poslati klijentu sinhroni RPC odgovor Exchange.DeclareOk. Ako stvaranje je nemoguće (došlo je do odbijanja zahtjeva Exchange.Declare), onda kanal će se zatvoriti server koristeći asinkronu komandu Channel.Close a klijent će dobiti izuzetak OperationInterruptedException, koji će sadržavati šifru greške i njen opis.

Razmjenjivač mora biti kreiran prije objavljivanja. Ako objavite poruku nekom nepostojećem razmenjivaču - RabbitMQ tiho ga uklonite.

Kreirajte Exchange GUI

Idite na admin panel RabbitMQ pod korisnikom guest (korisničko ime: guest i lozinka: guest). Napominjemo da korisnik guest može se povezati samo sa lokalnog hosta. Sada idemo na karticu Exchanges i kliknite na Add a new exchange. Popunite svojstva:

RabbitMQ. Dio 2. Razumijevanje razmjena

Većina nekretnina je gore opisana. Ovdje napominjemo da ako postavimo Internal, tada se razmjena može koristiti samo za E2E. Producer neće moći slati poruke na takvu razmjenu.

zaključak

Prilikom razvoja sistema, zgodno je opisati topologiju rutiranje koristeći graf. Ali prije nego počnete graditi grafikon, vrijedi istaknuti staze sa velikim prometom, jer. zahtevaju veća propusnost (performanse). Zatim možete klasifikovati saobraćaj. I onda počnite da gradite.

Ako u konstruisanom grafu postoji konačan skup ključeve za usmjeravanje, onda vrijedi pogledati nekoliko fanout exchange, koji su 1:1 povezani sa ključem za rutiranje. Zapamtite da fanout exchange najbrzi.

Ako je broj ruta teži beskonačnosti, vredi obratiti pažnju topic exchange ili, ako šablon nije potreban, onda možete izabrati direct exchnge, jer brži je topic exchange.

Kombinacije raznih exchange trebalo bi vam pomoći da pronađete pravu. skalabilna konfiguracija, koji zadovoljava trenutne i rastuće sistemske zahtjeve.

Broj exchange a redovi bi trebali biti minimalni u odnosu na broj ruta.

U sljedećem članku ćemo početi da razumijemo više o redovima čekanja i vezama.

reference

izvor: www.habr.com

Dodajte komentar