Astăzi vom explora modalități de a accelera încărcarea paginilor web prin externalizarea proceselor intensive către sarcini asincrone, gestionate eficient cu ajutorul RabbitMQ.
Stabilitatea și rapiditatea unei aplicații sau a unui site web sunt factori cruciali pentru experiența utilizatorilor. Câți dintre noi nu au abandonat un site din cauza timpului de încărcare excesiv?
Ce este RabbitMQ?
RabbitMQ este un broker de mesagerie open-source, distribuit și scalabil, care acționează ca un intermediar pentru comunicarea eficientă între surse și destinații de date.
RabbitMQ folosește protocolul de mesagerie AMQP, care pune accent pe transmiterea asincronă a mesajelor, oferind garanția livrării prin confirmări de primire, atât de la broker către sursă, cât și de la destinație către broker.
Cum funcționează RabbitMQ?
Simplificat, RabbitMQ utilizează cozi pentru a stoca mesajele trimise de surse, până când aplicațiile destinație le preiau și le procesează. Aceasta permite proiectarea și implementarea sistemelor distribuite, unde componente independente comunică prin mesaje.
Într-o comunicare, avem nevoie de un producător, un mesaj și un consumator. RabbitMQ este, practic, locul unde mesajul așteaptă să fie preluat de destinatar.
Pentru a înțelege mai bine funcționarea sa, să analizăm tipurile de schimburi care facilitează transmiterea mesajelor.
Tipuri de schimburi
În RabbitMQ, mesajele nu sunt trimise direct la cozi. În schimb, ele sunt transmise către un schimb, o componentă responsabilă de a direcționa mesajele către diferitele cozi.
Credit imagine: CloudAQMP
Există patru tipuri principale de schimburi: Direct, Fanout, Topic și Headers.
Schimb direct
Să presupunem că o sursă trebuie să trimită o confirmare de achiziție către trei sisteme destinație. Sistemul va trebui să comunice cu aceste trei sisteme pentru a finaliza tranzacția.
RabbitMQ trimite mesajul separat către fiecare coadă, astfel sistemele destinație primesc mesajul direct.
În mod normal, schimbul direcționează mesajul către cozi, dar adesea nu dorim ca un mesaj să fie trimis tuturor cozilor. Putem aplica diverse condiții pentru a controla direcționarea mesajelor.
Astfel, un mesaj poate fi trimis unui singur consumator, în loc să ajungă la toți.
Cheie de legare: Pentru a conecta o coadă la un schimb, este necesară o legătură, o relație între coadă și schimb, un fel de conector.
Cheie de rutare: În cadrul legăturii, putem defini o cheie de rutare, care este practic o etichetă pentru a direcționa mesajele către o anumită coadă.
Dacă avem chei de rutare X, Y și Z, un mesaj cu cheia de rutare Y va fi transmis către coada Y și livrat direct consumatorului corespunzător.
Prin urmare, putem avea mai multe cozi conectate la un schimb, dar acestea pot avea relații diferite cu schimbul prin intermediul cheilor de rutare.
Schimb de tip Fanout
Când un mesaj este trimis către un schimb de tip fanout, acesta va fi transmis tuturor cozilor conectate la acel schimb. Deci, dacă există 10 cozi conectate, toate vor primi mesajul.
Schimb de tip Topic
Acesta este unul dintre cele mai flexibile tipuri de schimburi, care permite transmiterea mesajelor în funcție de subiect. Prin denumirea cheilor de rutare, se pot crea reguli complexe și relații între sisteme.
De exemplu, chei de rutare: (x.*); (*.z); (*.y.*).
Ce este AMQP în RabbitMQ?
AMQP (Advanced Message Queuing Protocol) este un protocol de mesagerie deschis, folosit pentru a defini transportul mesajelor între diverse aplicații. Similar protocoalelor HTTP și TCP, este un protocol la nivel de rețea, dar permite transportul asincron.
RabbitMQ a ales să implementeze AMQP din mai multe motive. În primul rând, este considerat un standard pentru middleware, spre deosebire de JMS, care definește un API.
Specificația AMQP a fost creată de un consorțiu internațional care include companii precum Red Hat, Cisco Systems și Microsoft. În al doilea rând, interoperabilitatea protocolului permite oricărei aplicații care îl implementează să comunice cu un broker AMQP.
AMQP nu este singurul protocol folosit de RabbitMQ. Imaginea de mai jos ilustrează protocoalele, limbile și API-urile implementate sau acceptate de RabbitMQ.
Cele mai bune caracteristici ale RabbitMQ
Pe lângă faptul că permite integrarea aplicațiilor prin mesaje asincrone și din locații diferite, RabbitMQ oferă și alte caracteristici care l-au consacrat ca un lider în rândul brokerilor de mesagerie:
Stocare sigură
RabbitMQ dispune de funcții care garantează livrarea mesajelor. Oferă stocare temporară atunci când niciun consumator nu este disponibil. Permite consumatorilor să confirme livrarea mesajelor pentru a asigura procesarea cu succes.
În cazul unei erori de procesare, RabbitMQ permite repunerea mesajului în coadă, pentru a fi preluat de o altă instanță a consumatorului sau reprocesat de aceeași instanță atunci când își revine.
De asemenea, RabbitMQ garantează ordinea livrării mesajelor, acestea fiind consumate în aceeași ordine în care au ajuns în cozi.
Crearea de clustere
Deși RabbitMQ oferă performanțe ridicate, procesând mii de mesaje pe secundă, uneori este necesară procesarea unui volum mai mare de mesaje fără a afecta aplicația.
Pentru aceasta, RabbitMQ permite crearea de clustere pentru a scala orizontal soluția, lucru transparent atât pentru surse, cât și pentru destinații.
Cozi cu disponibilitate ridicată
În RabbitMQ, cozile pot fi replicate pe mai multe noduri ale unui cluster, asigurând că, în cazul unei defecțiuni sau a indisponibilității unui nod, brokerul poate primi în continuare mesaje de la surse și le poate livra consumatorilor corespunzători.
Rutare flexibilă
În RabbitMQ, se pot defini reguli de rutare flexibile, inclusiv modele de rutare, pentru a direcționa mesajele între schimburi și cozi, prin intermediul legăturilor.
Suport pentru diverse protocoale
Pe lângă AMQP, RabbitMQ suportă STOMP, MQTT și HTTP prin intermediul pluginurilor. Include și mecanisme de autentificare și control al accesului pentru componentele brokerului.
Cazuri reale de utilizare a RabbitMQ
RabbitMQ este ideal pentru a asigura asincronitatea dintre aplicații, a reduce dependența dintre ele, a distribui alerte și a controla cozile de joburi în fundal.
Un caz practic de utilizare este în comerțul electronic, unde RabbitMQ gestionează, procesează și transmite comenzile de vânzare către sistemele din alte sectoare, cum ar fi distribuția și facturarea.
La procesarea comenzilor, mesajul de vânzare poate fi direcționat către centrul de distribuție și către sistemul de facturare. În această schemă, totul funcționează pe orizontală, conform modelului asincron, dar o acțiune poate fi trimisă la mai multe cozi.
Urmând exemplul anterior, această funcție este utilă atunci când clientul face o achiziție și produsul trebuie pregătit pentru distribuție, transport și facturare.
Deoarece fiecare dintre aceste sectoare reprezintă un sistem diferit, rolul RabbitMQ este de a transmite toate mesajele către sistemele corespunzătoare.
Alternative la RabbitMQ:
RabbitMQ este destul de simplu și există mai multe alternative, inclusiv:
#1. IronMQ
IronMQ este un software de tip coadă de mesaje foarte rapid. Este foarte disponibil, proiectat pentru durabilitate și, preferabil, pentru livrare unică. IronMQ este o soluție puternică, bazată pe cloud pentru arhitectura modernă a aplicațiilor.
Suportă cozi push, cozi pull și sondaje lungi, menținând cererile de sondare deschise mai mult timp. În plus, poate folosi mai multe centre de date de înaltă disponibilitate, facilitând scalabilitatea.
Implementarea poate fi făcută în cloud, pe hardware partajat sau dedicat, sau on-premise. De asemenea, are biblioteci client și documentație ușor de utilizat.
#2. Apache Kafka
Kafka este o platformă puternică pentru fluxul de evenimente distribuite. În esență, este conceput ca un jurnal de comitere replicat, distribuit și persistent.
Este folosit în microservicii bazate pe evenimente sau în aplicații de procesare a fluxurilor la scară largă, replicând automat evenimentele asincron în cluster, oferind toleranță la erori și disponibilitate ridicată.
#3. Apache ActiveMQ
ActiveMQ este un broker de mesaje multiprotocol, bazat pe Java. Cu el se pot integra aplicații folosind protocolul de coadă de mesaje AMQP.
Implementează mai multe protocoale de integrare, cum ar fi JMS (nativ Java) și Stomp (folosit de aplicațiile PHP), printre altele.
În plus, Amazon oferă o versiune „gestionată” numită Amazon MQ, simplificând utilizarea serviciului.
Concluzie
Brokerii de mesaje au fost mereu esențiali în arhitectura organizațiilor. Odată cu creșterea numărului de utilizatori care accesează sistemele prin diverse canale, sunt necesare produse care să permită scalarea orizontală la costuri reduse, procesând un volum mare de mesaje pe secundă.
O nouă generație de brokeri, precum RabbitMQ, devin tot mai importanți în aplicațiile moderne, care caută să ofere clienților niveluri ridicate de disponibilitate, fiabilitate, interoperabilitate și performanță.
De asemenea, puteți explora platforme de găzduire RabbitMQ pentru aplicația dvs.