Uvod u RabbitMQ, posrednik poruka, AMQP model i još mnogo toga.
U distribuiranim sustavima komunikacija između različitih aplikacija igra važnu ulogu. Učinkovito prenošenje poruka između aplikacija uvijek je bila presudna odluka u dizajnu sustava. Jedno od elegantnih rješenja za prosljeđivanje poruka po vašem distribuiranom sustavu je posrednik poruka.
U distribuiranim sustavima komunikacija između različitih aplikacija igra važnu ulogu. Učinkovito prenošenje poruka između aplikacija uvijek je bila presudna odluka u dizajnu sustava. Jedno od elegantnih rješenja za prosljeđivanje poruka po vašem distribuiranom sustavu je posrednik poruka.
Dovode do razdvajanja između aplikacija i pružaju učinkovit način komunikacije. S posrednicima poruka, aplikacija ne treba prethodno znanje svojih primatelja za komunikaciju.
Međutim, što je RabbtiMQ? Kako se RabbitMQ uklapa u ovu sliku? Također, što je AMQP?
Na kraju ovog članka moći ćemo odgovoriti na ova pitanja. Također sam dodao nekoliko animacija kako biste mogli vizualizirati RabbitMQ koncepte.
Pa jesi li uzbuđena? Ja sam! Ako ste ikada imali poteškoća s razumijevanjem posrednika poruka, kao što sam ja imao, onda je ovaj članak pravo mjesto za početak vašeg putovanja. Ostani sa mnom ?
Broker poruka
Općenito, broker je osoba koja olakšava trgovinu između kupca i prodavatelja. Primjer može biti agent za promet nekretninama ili berzanski posrednik.
Slično tome, ako želimo trgovati porukama između dvije distribuirane softverske komponente, potreban nam je posrednik. Ovaj posrednik poznat je kao posrednik poruka. Prima dolazne poruke od pošiljatelja i šalje ih primatelju. Na taj način pošiljatelj i primatelj mogu biti potpuno izolirani.
Još jedna analogija za posrednika poruka može biti pošta (vidi sliku 1). Uzmimo scenarij u kojem ćete poslati pismo svom rođaku koji živi u drugom gradu. Tada ste prema ovoj analogiji vi proizvođač, vaš rođak potrošač, a pošta posrednik poruka.

RabbitMQ kao posrednik poruka
Sada znamo da je svrha posrednika poruka usmjeravanje poruka od proizvođača do potrošača. Ispitajmo jednog takvog posrednika poruka - RabbitMQ. To je jedan od najčešće korištenih posrednika poruka ovih dana.
Način na koji RabbitMQ usmjerava poruke ovisi o protokolu za razmjenu poruka koji provodi. RabbitMQ podržava više protokola za razmjenu poruka. Međutim, onaj koji nas zanima je AMQP. To je kratica za Advanced Message Queuing Protocol.
Dakle, bez ikakvog daljnjeg razgovora, pobliže ćemo pogledati model protokola AMQP.
Napredni protokol čekanja poruka
Konceptualni model AMQP-a vrlo je jednostavan i izravan. Ima tri cjeline:
- Red
- Uvez
- Razmjena
Kad izdavač pošalje poruku RabbitMQ-u, prvo dolazi na razmjenu. Tada razmjena distribuira kopije tih poruka u različito povezane redove. Napokon, potrošači dobivaju ove poruke.
Poruku smatrajte dijelom podataka. To je nužno paket s korisnim opterećenjem i nekim meta-podacima. Korisni teret sadrži pune podatke, dok su metapodaci svojstva koja koristi RabbitMQ.
Slika 2 prikazuje grafički prikaz AMQP modela.

AMQP je programabilni protokol. Programeri mogu koristiti knjižnice za konfiguriranje entiteta (razmjena, povezivanje i red čekanja) prema vlastitim potrebama. Administrator RabbitMQ nema ulogu u postavljanju tih entiteta.
Dostupno je puno knjižnica za rad s RabbitMQ-om. Možete birati između Nodejs, Python, .Net, Java i mnogih drugih.
Redovi
Ti su redovi nekako slični redovima iz naših klasa strukture podataka. RabbitMQ redovi također slijede FIFO - First-In-First-Out metodologiju. Red je mjesto na kojem RabbitMQ pohranjuje poruke / podatke.
Programeri mogu konfigurirati redove putem dostupnih programskih knjižnica. Red čekanja možete učiniti trajnim (sa Durability
svojstvom) kako biste zaštitili svoje podatke u slučaju da broker padne. Redu možete dati i ime (sa Name
svojstvom). Osim Name
i Durability
, red ima još nekoliko svojstava kao što su automatsko brisanje, ekskluzivno i argumenti.
Prije nego što krenete dalje, važno je razumjeti tko je izravni potrošač ovih redova. Štoviše, na koliko načina korisnik može trošiti poruke iz reda?
Potrošači
Potrošači su ti koji će koristiti poruke pohranjene u redu čekanja. Moguće je istovremeno povezati više potrošača u red čekanja. Potrošači mogu ili povući poruku iz reda udruživanjem, ili redovi čak mogu poslati poruku raznim potrošačima koji povezuju.
Vezovi
Vezi su pravila koja red definira uspostavljajući vezu s razmjenom. Možete imati red povezan s više razmjena. Svaki je red također povezan sa zadanom razmjenom. Razmjena će koristiti ove veze za usmjeravanje poruka u redove.
Razmjene i njihove vrste
Exchange je pristupnik RabbitMQ-u za vaše poruke. Udaljenost koju poruka mora prijeći unutar RabbitMQ-a ovisi o vrsti razmjene. Prvenstveno postoje četiri vrste.
- Direktno
- Fanout
- Tema
- Zaglavlje
Direktno
Ime sve objašnjava! - Izravna razmjena isporučuje poruku izravno u redove koji ispunjavaju donji uvjet:
Routing key == Binding key
Ključ usmjeravanja je atribut poruke. S druge strane, ključ vezanja je nešto što odredite tijekom stvaranja vezanja između reda i razmjene.
Slika 3 je vizualno objašnjenje kako poruke teku dok se koriste izravnom razmjenom.
Poruka potječe od proizvođača (zeleni krug) s ključem usmjeravanja - img.resize
. Jednom kada stigne do razmjene (narančasti krug), razmjena će pokušati pronaći sve redove s ključem koji veže - img.resize
. U slučaju podudaranja, poruka se gura u sve podudarne redove (u našem slučaju promijenite veličinu). Ako nije pronađeno podudaranje, poruka se može poslati natrag proizvođaču ili čak odbaciti. Imamo sreće da smo u našem primjeru pronašli podudarnost?
[gif slika]
Jednom kada poruka stigne do željenog reda (promjena veličine u našem slučaju), distribuira se u krugu svih povezanih potrošača (u našem slučaju resizer.1 / resizer.2).
Distribucijom poruka na okrugli način, RabbitMQ osigurava uravnoteženo opterećenje poruka.
Sigurno ste primijetili da red s nazivom obrezivanje ne prima nikakve poruke. Budući da je ključ usmjeravanja u ovom primjeru img.resize
. Da bismo poslali poruke u ovaj red, moramo poslati poruke s ključem usmjeravanja koji bi odgovarao ključu vezanja (recimo, img.crop
na primjer).
Fanout
Razmjena obožavatelja ignorira ključeve usmjeravanja i distribuira poruku svim povezanim redovima. Nije ni čudo što se zove Fanout (puhanje poruka u sve povezane redove!?).
Jedan od slučajeva korištenja ove vrste razmjene je emitiranje poruka.

Imajte na umu da će RabbitMQ i dalje raditi krugove ako postoji više od jednog potrošača u redu.
Tema
Razmjena tema usmjerava poruku usklađivanjem ključa usmjeravanja s uzorkom u ključu za povezivanje.
Routing key == Pattern in binding key.
RabbitMQ koristi dva zamjenska znaka za podudaranje uzoraka *
i #
. Koristite a *
za podudaranje 1 riječi i a #
za podudaranje 0 ili više riječi.
Slika 5 je vizualni prikaz razmjene tema. Poruke s ključem usmjeravanja - logs.error
podudarat će se s uzorcima - logs.error
i logs.*
. Stoga će ove poruke završiti u redovima - only error
i all logs
.
Dok će se za proizvođača u donjem lijevom dijelu poruke s ključem usmjeravanja - logs.success
podudarati s uzorcima ključa za povezivanje #success
i logs.*
. Stoga će ove poruke završiti u redovima - all logs
i only success
.
[gif]
Ova vrsta razmjene ima širok raspon slučajeva korištenja. Može se koristiti u obrascu objaviti-pretplatiti, distribuirajući relevantne podatke procesima koji žele radnike i još mnogo toga.
Zaglavlje
Zaglavlje je posebna vrsta razmjene koja usmjerava poruke na temelju ključeva prisutnih u zaglavlju poruke. Pregledava atribut ključa usmjeravanja poruke.
Prilikom stvaranja veza za razmjenu zaglavlja, moguće je vezati red koji odgovara više od jednog zaglavlja. U takvom slučaju, RabbitMQ bi od proizvođača trebao znati treba li odgovarati svim ili bilo kojem od ovih ključeva.
Producent / aplikacija to može učiniti pružajući dodatnu zastavicu nazvanu 'x-match'. 'x-match' može imati any
ili all
vrijednosti. Prva nalaže da se mora podudarati samo jedna vrijednost, dok druga nalaže da se sve moraju podudarati.
Potvrda poruke
Jednom kada poruka stigne na odredište, posrednik bi je trebao izbrisati iz reda čekanja. Neophodno je jer se može dogoditi preljev u redu ako se neprestano gomilaju poruke.
Prije brisanja bilo koje poruke, posrednik mora imati potvrdu o isporuci. Dva su moguća načina da potvrdite dostavu poruke.
- Automatsko potvrđivanje: Jednom kada potrošač primi poruku
- Eksplicitno priznanje: Kada potrošač pošalje natrag potvrdu
U većini slučajeva koristi se izričita potvrda jer osigurava da je potrošač poruku potrošio bez preusmjeravanja.
Što je sljedeće
RabbitMQ je vrlo zreo i koristan proizvod. Ovaj je članak samo uvod u RabbitMQ na visokoj razini. Pojednostavio sam koncepte kako bih vam pružio referentnu točku za daljnji napredak. Posjetite web stranicu RabbitMQ za složenije teme.
Nadam se da vam se svidio članak. Ne zaboravite pljeskati (ili pljeskati?). Slijedite i pročitajte moje nadolazeće priče. Do sljedećeg puta, zadržite red čekanja.