U današnjem tekstu, istražićemo metode za ubrzanje učitavanja vaših veb stranica, koristeći asinhrono izvršavanje složenih procesa. Sve ovo je izvodljivo na jednostavan način, uz pomoć RabbitMQ.
Stabilnost i brzina aplikacije ili veb stranice su ključni aspekti korisničkog iskustva. Svi smo se nekada suočili sa situacijom da napustimo veb lokaciju pre nego što se uopšte učita zbog dugog vremena čekanja.
Šta je RabbitMQ?
RabbitMQ je open-source, distribuirani i skalabilni broker za razmenu poruka. On deluje kao posrednik koji omogućava efikasnu komunikaciju između proizvođača i potrošača informacija.
RabbitMQ implementira protokol za razmenu poruka na nivou aplikacije, poznat kao AMQP (Advanced Message Queuing Protocol). Ovaj protokol je usmeren na asinhronu komunikaciju poruka, garantujući njihovu dostavu putem potvrda prijema, kako od brokera ka proizvođaču, tako i od potrošača ka brokeru.
Kako funkcioniše RabbitMQ?
Pojednostavljeno, RabbitMQ definiše redove u koje se smeštaju poruke koje šalju proizvođači. Te poruke ostaju u redovima dok ih aplikacije, koje su potrošači, ne preuzmu i obrade. Na taj način, omogućavamo dizajniranje i implementaciju distribuiranih sistema, gde je sistem sastavljen od nezavisnih modula koji komuniciraju putem poruka.
Kao i kod bilo koje druge komunikacije, potreban nam je proizvođač, poruka i primalac. U tom procesu, RabbitMQ zauzima centralnu ulogu, delujući kao mesto gde poruke čekaju na preuzimanje od strane primaoca.
Da bismo bolje razumeli kako sve funkcioniše, treba da se upoznamo sa tipovima razmena koje su ključne za razmenu poruka.
Vrste razmene
Kada šaljemo poruku preko RabbitMQ, ne šaljemo je direktno u red. Umesto toga, poruka se prosleđuje razmeni. Razmena je zadužena za usmeravanje poruka u odgovarajuće redove, omogućavajući da ih drugi sistemi pročitaju.
Slika kredita: CloudAKMP
Tipovi razmene uključuju: Direktna, Fanout, Tema i Zaglavlja (Headers).
Direktna razmena
Pretpostavimo da proizvođač želi da pošalje poruku o potvrdi kupovine na tri različita potrošača. Drugim rečima, sistem treba da komunicira sa tri različita sistema kako bi realizovao kupovinu.
S obzirom na to da RabbitMQ šalje poruku pojedinačno svakom redu, postoji potreba da se ovi drugi sistemi direktno usmere da prime poruku.
Uobičajeno je da razmena prosleđuje poruku u redove, ali često nije poželjno da se poruke šalju u sve redove. Zbog toga se mogu primeniti uslovi koji definišu kako razmena radi.
Na taj način, možete poslati poruku samo jednom potrošaču umesto da je šaljete svima.
Ključ za povezivanje: Da biste povezali red sa razmenom, potrebno je uspostaviti vezu između njih, nešto poput konektora.
Ključ za rutiranje: U procesu povezivanja, možete kreirati i ključ za rutiranje, koji, u suštini, predstavlja ključ za prosleđivanje poruka u određeni red.
Ako postoje ključevi za rutiranje X, Y i Z, poruka sa ključem za rutiranje Y će biti prosleđena u red Y i dostavljena direktno potrošaču koji je definisan da primi tu poruku.
Na ovaj način, možemo imati više redova povezanih sa razmenom, pri čemu svaki red ima poseban odnos sa razmenom pomoću ključeva za rutiranje.
Fanout razmena
Kada se poruka pošalje u fanout razmenu, ona se distribuira svim redovima koji su povezani sa njom. To znači da ako je 10 redova povezano sa fanout razmenom, svi će primiti istu poruku.
Razmena tema
Ova razmena je veoma fleksibilna i omogućava nam da šaljemo poruke na osnovu teme. Korišćenjem specifičnih imenovanja ključeva za rutiranje, moguće je definisati pravila i odnose između sistema.
Na primer: ključ za rutiranje (k.*); ključ za rutiranje (*.z); ključ za rutiranje (*.y.*).
Šta je AMQP u RabbitMQ-u?
AMQP (Advanced Message Queuing Protocol) je otvoreni protokol za razmenu poruka. Koristi se za definisanje načina na koji se poruke prenose između različitih aplikacija. Sličan je HTTP i TCP protokolima, ali je dizajniran za asinhroni prenos poruka.
RabbitMQ je odlučio da implementira AMQP iz nekoliko razloga. Prvi je da je ovaj protokol definisan kao standard za međusobnu komunikaciju softvera, za razliku od JMS-a (Java Message Service) koji definiše API.
Međunarodni konzorcijum, koji uključuje kompanije kao što su Red Hat, Cisco Systems i Microsoft, je razvio AMQP specifikaciju. Drugi razlog je interoperabilnost ovog protokola, koja omogućava bilo kojoj aplikaciji koja implementira AMQP da komunicira sa AMQP brokerom.
AMQP nije jedini protokol koji RabbitMQ koristi. Slika ispod prikazuje sve protokole, jezike i API-je koje RabbitMQ implementira i/ili podržava.
Najbolje karakteristike RabbitMQ-a
Pored toga što omogućava integraciju različitih aplikacija putem asinhronih poruka, RabbitMQ nudi i druge karakteristike koje su ga učinile popularnim u svetu brokera za razmenu poruka:
Pouzdanost skladištenja
RabbitMQ sadrži brojne funkcije koje osiguravaju pouzdanu dostavu poruka. On čuva poruke kada nijedan potrošač nije u mogućnosti da ih primi. Takođe, potrošači mogu da potvrde prijem poruke, što garantuje da je poruka uspešno obrađena.
Ako obrada ne uspe, RabbitMQ omogućava da se poruka ponovo stavi u red, kako bi je preuzela druga instanca potrošača, ili isti potrošač nakon oporavka.
RabbitMQ takođe garantuje redosled dostave poruka; odnosno, poruke se konzumiraju istim redosledom kojim su dospele u redove RabbitMQ-a.
Kreiranje klastera
Iako RabbitMQ pruža izvrsne performanse pri obradi hiljada poruka u sekundi, ponekad je potrebno da obradi još veći broj poruka bez uticaja na performanse aplikacije.
U tu svrhu, RabbitMQ omogućava kreiranje klastera za horizontalno skaliranje rešenja, što je transparentno za proizvođače i potrošače.
Redovi visoke dostupnosti
U RabbitMQ, redovi se mogu replicirati na više čvorova u klasteru. To osigurava da u slučaju pada čvora, broker može nastaviti da prima poruke od proizvođača i dostavlja ih odgovarajućim potrošačima.
Fleksibilno rutiranje
U RabbitMQ, fleksibilna pravila rutiranja mogu se definisati, prateći određene obrasce, za usmeravanje poruka između razmena i redova pomoću veza.
Podrška za više protokola
Pored AMQP protokola, RabbitMQ podržava i STOMP, MQTT i HTTP putem dodataka. Takođe uključuje mehanizme autentifikacije i kontrole pristupa za komponente svakog brokera.
Stvarni slučajevi upotrebe RabbitMQ-a
Najvažniji slučajevi upotrebe RabbitMQ-a uključuju garantovanje asinhronosti između aplikacija, smanjenje zavisnosti između aplikacija, distribuciju upozorenja i kontrolu pozadinskih zadataka.
Praktična primena RabbitMQ-a se često viđa u e-trgovini, gde se koristi za obradu, manipulaciju i prosleđivanje prodajnih porudžbina drugim sistemima, poput onih za distribuciju i fakturisanje.
Prilikom obrade porudžbina, prodajna poruka se može proslediti distributivnom centru i službi za fakturisanje. U ovom scenariju, sve funkcioniše horizontalno, prateći asinhroni obrazac za slanje poruka. Takođe je moguće poslati akciju u nekoliko redova istovremeno.
Nastavljajući prethodni primer, ova funkcionalnost je vrlo korisna kada kupac izvrši kupovinu i proizvod treba da bude pripremljen za distribuciju, transport i fakturisanje.
S obzirom da su ovi sektori različiti sistemi, uloga RabbitMQ-a je da prosledi sve poruke odgovarajućim sistemima.
RabbitMQ alternative:
RabbitMQ je jednostavniji nego što izgleda, a postoji nekoliko alternativa, uključujući:
#1. IronMQ
IronMQ je izuzetno brz softver za redove poruka. Poznat je po svojoj visokoj dostupnosti i izdržljivosti, a preporučuje se za dostavu „jednom i samo jednom“. IronMQ je snažno rešenje zasnovano na cloud-u, idealno za moderne arhitekture aplikacija.
Podržava push redove, pull redove i long polling. To znači da zahtevi za anketiranje ostaju otvoreni duže. Pored toga, može da koristi više data centara visoke dostupnosti, što olakšava skalabilnost.
Možete ga implementirati u oblaku, na deljenom ili namenskom hardveru, ili lokalno. Takođe poseduje brojne klijentske biblioteke sa lako razumljivom dokumentacijom.
#2. Apache Kafka
Kafka je platforma sa snažnim prisustvom u distribuiranom strimingu događaja. U svojoj osnovi, Kafka je dizajnirana kao replicirani, distribuirani, trajni log zapisa.
Najčešće se koristi za napajanje mikroservisa zasnovanih na događajima ili aplikacija za obradu tokova velikih razmera. Automatski replicira događaje asinhrono unutar klastera, što obezbeđuje toleranciju grešaka i visoku dostupnost.
#3. Apache ActiveMQ
ActiveMQ je multi-protokolni broker za poruke zasnovan na Javi. Omogućava integraciju aplikacija koristeći AMQP protokol za redove poruka na sloju aplikacije.
Implementira različite protokole za integraciju, kao što su JMS (nativni Java) i STOMP (koji mogu da koriste PHP aplikacije), između ostalih.
Pored toga, Amazon nudi svoju „managed“ verziju pod nazivom Amazon MQ, što značajno olakšava korišćenje servisa.
Završne reči
Brokeri za razmenu poruka su tradicionalno igrali važnu ulogu u arhitekturi organizacija. Međutim, sa porastom broja korisnika koji pristupaju sistemima kompanije putem različitih kanala, potrebni su proizvodi koji omogućavaju horizontalno skaliranje uz niske troškove. Takođe je važno da se obezbedi obrada velikog broja poruka u sekundi.
U tom kontekstu, nova generacija brokera, poput RabbitMQ-a, postaje sve relevantnija u savremenim aplikacijama. Ove aplikacije teže da ponude visoke nivoe dostupnosti, pouzdanosti, interoperabilnosti i performansi našim klijentima.
Takođe, možete istražiti pouzdane RabbitMQ hosting platforme za svoju aplikaciju.