O introducere la RabbitMQ – Ce este RabbitMQ?

De ce Rabbit? Ce este MQ? Cum ne poate îmbunătăți aplicațiile? De ce aș vrea să aflu mai multe despre el? – Acestea sunt întrebări pe care mi le-am pus atunci când am fost introdus pentru prima dată în RabbitMQ. Mă numesc Gabor, iar acum sunt inginer și consultant RabbitMQ. În timpul în care am lucrat cu RabbitMQ, am învățat că și clienții experimentați își pun aceste întrebări.

TL;DR > Consultați pagina noastră de produs RabbitMQ pentru cazuri de utilizare, caracteristici și pentru a contacta consultanții noștri experți.

Ce problemă rezolvă RabbitMQ?

Înainte de a aprofunda ce este RabbitMQ și cum să îl folosim, merită să aflăm mai multe despre domeniul problemei în sine. Comunicarea între diferite servicii (a.k.a. calculatoare) este o problemă veche de când lumea.

Pe de o parte, există diferite protocoale care definesc mijloacele de transport și proprietățile comunicării. Câteva exemple de astfel de protocoale includ SMTP, FTP, HTTP sau WebSockets (pentru a numi doar câteva), care se bazează toate pe TCP/UDP. Acestea se ocupă de formatarea, fiabilitatea și găsirea destinatarului corect al unui mesaj.

Pe de altă parte, putem explora comunicarea din perspectiva mesajului. Acesta există într-un sistem, apoi este transportat în altul, este transformat, adică are un ciclu de viață. Pe măsură ce călătorește de la un sistem la altul, ar trebui să fim conștienți de locul în care se află mesajul și cine îl deține la un moment dat.

Protocoalele de comunicare menționate mai sus se pot asigura că proprietatea (și locația „fizică”) a mesajului este transferată de la un sistem la altul (deși poate dura ceva timp pentru a executa această tranzacție). Putem considera transferul ca fiind o tranzacție între cele două părți cât timp ambele sunt prezente. De cele mai multe ori, acest schimb activ este de dorit, de exemplu, solicitarea stării serviciului și așteptarea unui răspuns prompt și precis. Un exemplu din lumea fizică ar fi să sunăm pe cineva la telefon:
1) începem convorbirea,
2) așteptăm ca interlocutorul să răspundă,
3) purtăm o discuție plăcută,
4) închidem telefonul.

Dar există și alte momente în care nu avem nevoie de răspuns, avem nevoie doar ca receptorul să-și însușească mesajul și să-și facă treaba. În acest caz, avem nevoie de un agent intermediar, un alt sistem care să preia proprietatea mesajului (temporar) și să se asigure că mesajul ajunge la destinație. Pentru a duce exemplul telefonic mai departe, cealaltă parte nu este disponibilă în acest moment, așa că lăsăm un mesaj vocal. Serviciul de mesagerie vocală va notifica destinatarul.

Această livrare asincronă (întârziată) a mesajelor este ceea ce oferă RabbitMQ. Evident, poate face mai mult decât un simplu robot telefonic, așa că haideți să explorăm mai jos câteva dintre opțiunile pe care le oferă

(Dacă sunteți interesați să aflați mai multe despre istoria RabbitMQ, vă recomand primul capitol din „RabbitMQ in Action” de Alvaro Videla și Jason Williams. Acesta va dezvălui răspunsul la motivul pentru care este numit după iepuri).

RabbitMQ este o soluție gratuită, open-source și extensibilă de coadă de mesaje. Este un broker de mesaje care înțelege AMQP (Advanced Message Queuing Protocol), dar poate fi utilizat și cu alte soluții populare de mesagerie, cum ar fi MQTT. Este foarte disponibil, tolerant la erori și scalabil. Este implementat în Erlang OTP, o tehnologie adaptată pentru a construi sisteme stabile, fiabile, tolerante la erori și foarte scalabile, care posedă capacități native de a gestiona un număr foarte mare de operațiuni concurente, cum este cazul RabbitMQ și alte sisteme precum WhatsApp, MongooseIM, pentru a menționa doar câteva.

La un nivel foarte înalt, este un strat de middleware care permite diferitelor servicii din aplicația dumneavoastră să comunice între ele fără a se îngrijora de pierderea mesajelor, oferind în același timp diferite cerințe de calitate a serviciului (QoS). De asemenea, permite o rutare fină și eficientă a mesajelor, permițând o decuplare extinsă a aplicațiilor.

Cazuri de utilizare

Pentru a arăta versatilitatea RabbitMQ, vom folosi trei studii de caz care demonstrează modul în care RabbitMQ se potrivește bine ca o abordare de serviciu gestionat de tip black-box, ca unul care se integrează strâns cu aplicația, permițând o arhitectură de microservicii care funcționează bine, sau ca o poartă de acces către alte proiecte moștenite.

RabbitMQ ca un message-bus general

Când un sistem monolit este descompus în subsisteme separate, una dintre cele mai mari probleme care trebuie rezolvate este ce tehnologie de comunicare trebuie folosită. O soluție precum Mulesoft, sau MassTransit poate „cabla” serviciile prin declararea de ascultători și expeditori HTTP. Acest tip de soluție tratează RabbitMQ ca pe o cutie neagră, dar este totuși capabilă să valorifice capacitățile RabbitMQ. Ca un exemplu de comunicare directă, să folosim HTTP pentru a „conecta” serviciile individuale. Deși este o alegere solidă și bine suportată, are câteva dezavantaje:
1) Descoperirea serviciilor nu este rezolvată. O soluție posibilă este utilizarea DNS. Pe măsură ce sistemul se scalează și crește, crește și complexitatea găsirii și echilibrării acestei sarcini. RabbitMQ poate atenua complexitatea crescută a soluției.
2) Comunicarea este efemeră. Mesajele sunt predispuse să fie abandonate sau duplicate pe stratul de rețea. Dacă un serviciu este indisponibil temporar, livrarea eșuează.

RabbitMQ poate ajuta în ambele cazuri prin utilizarea cozilor de mesaje ca mijloc de transport. Serviciile pot publica și consuma mesaje, ceea ce decuplează livrarea mesajelor de la un capăt la altul de disponibilitatea serviciului de destinație. În cazul în care un serviciu consumator este temporar indisponibil, spre deosebire de HTTP, mesajul este tamponat și reținut în siguranță în RabbitMQ și, în cele din urmă, este livrat atunci când serviciul revine online.

Descoperirea este, de asemenea, simplificată. Tot ce trebuie să știm este unde se află RabbitMQ și care este numele cozii. Deși pare că acest lucru nu face decât să reinventeze problema, acest lucru este scalabil. Numele cozii acționează ca o adresă a serviciului. Consumarea mesajelor din cozile de așteptare de către serviciile individuale oferă un mijloc de scalabilitate, adică fiecare coadă poate servi mai mulți consumatori și poate echilibra sarcina. Nu este nevoie să se modifice configurația cozilor de așteptare deja încorporată în servicii.

Această configurație moderat statică a cozilor de așteptare împinge RabbitMQ către un strat de middleware în care o proiectare solidă poate garanta o calitate stabilă a serviciului pe termen lung.

RabbitMQ ca strat avansat de rutare pentru microservicii

La celălalt capăt al spectrului se află o arhitectură care este mai fluidă și se adaptează la nevoile în continuă schimbare ale multor microservicii. Ceea ce face RabbitMQ să strălucească în acest mediu sunt capacitățile foarte puternice de rutare pe care le oferă.

Logica de rutare este implementată în diferite (așa-numitele) tipuri de schimb care pot fi create în mod dinamic de către aplicație atunci când este nevoie. Serviciile de destinație creează cozile din care doresc să consume, apoi le leagă de schimburi prin specificarea unui model pentru cheile pe care editorii le pot folosi la publicarea mesajului. (Gândiți-vă la aceste chei ca la niște metadate pe care schimburile le pot folosi pentru a direcționa și livra mesajele către una sau mai multe cozi de așteptare.)

Logica de direcționare este implementată în diferite (așa-numitele) tipuri de schimb care pot fi create dinamic de către aplicație atunci când este necesar. Serviciile de destinație creează cozile din care doresc să consume, apoi le leagă de schimburi prin specificarea unui model pentru cheile pe care editorii le pot utiliza atunci când publică mesajul. (Gândiți-vă la aceste chei ca la niște metadate pe care schimburile le pot folosi pentru a direcționa și livra mesajele către una sau mai multe cozi.)

RabbitMQ vine cu patru tipuri de schimburi utile care acoperă majoritatea cazurilor de utilizare a mesageriei:
1) Schimb direct. Acesta va livra mesajul primit către orice coadă a cărei cheie de legare se potrivește exact cu cheia de rutare a mesajului. Dacă legați cozile de așteptare cu numele cozii ca și chei de rutare, atunci vă puteți gândi la aceasta ca la o livrare de mesaj unu la unu. Este simplă livrarea aceluiași mesaj către mai multe cozi de așteptare prin utilizarea cheilor de legare pentru mai multe cozi de așteptare.
2) Schimb de subiecte. Aceasta va livra mesajul primit către orice coadă a cărei cheie de legare wild-card se potrivește cu cheia de rutare a mesajului publicat. Cheile de legare pot conține criterii de potrivire wild-card pentru o cheie de rutare compusă. (de exemplu, cheia de legătură logs.*.error se va potrivi cu cheile de rutare logs.accounting.error și logs.ui.error). Acest lucru ne permite să scriem servicii simple în care logica este bine conținută, iar mesajul va ajunge la serviciile corecte prin „magia” RabbitMQ.
3) Schimbul Fanout. Unele mesaje trebuie să fie livrate către toate cozile de așteptare, aici se poate utiliza un schimb de fanout în loc de a scrie o logică elaborată de multicast în aplicație. Cu un schimb RabbitMQ fanout, fiecare serviciu leagă coada corespunzătoare la schimb fără a fi nevoie să se specifice o cheie de legare, iar totul se întâmplă automat. În cazul în care este specificată o cheie de legare, schimbul fanout o va ignora pur și simplu și va continua să direcționeze/difuzeze mesaje către toate cozile de așteptare legate de el.
4) Schimb de antet. Acest schimb valorifică structura mesajelor AMQP și este capabil de o rutare complexă bazată pe antetele (inclusiv cele personalizate) ale mesajului AMQP. Antetele sunt metadate atașate fiecărui mesaj trimis prin AMQP.

În plus față de schimburi, există și alte caracteristici utile în RabbitMQ care permit implementarea unei logici de mesagerie foarte complexe. Unele dintre cele mai importante caracteristici includ:
1) Plug-in-uri personalizate. RabbitMQ este extensibil, permițând utilizatorilor săi să adauge plug-in-uri. Aproape fiecare aspect al RabbitMQ poate fi personalizat, inclusiv managementul, autentificarea și autorizarea, soluțiile de back-up și clustering.
2) Clustering. Atunci când un singur server RabbitMQ nu este suficient, mai mulți brokeri RabbitMQ pot fi conectați pentru a lucra împreună și a scala sistemul. Aceasta poate permite RabbitMQ să proceseze mai multe mesaje sau să crească rezistența la erori.
3) Reglarea calității serviciului. Livrarea mesajelor sensibile la timp poate fi ajutată prin atașarea unei valori TTL (Time-to-Live) fie la mesaj, fie la coadă. Mesajele expirate în timp pot fi livrate automat într-o coadă Dead-letter. Combinarea logicii de rutare obișnuite cu aceste caracteristici suplimentare poate duce la o logică de rutare foarte avansată. O altă caracteristică utilă este utilizarea cozilor prioritare în care editorul poate atribui un nivel de prioritate fiecărui mesaj. De asemenea, este posibil să se limiteze numărul de mesaje neacceptate, ceea ce permite reglarea performanțelor serviciilor consumatoare, în acest caz, RabbitMQ aplică un mecanism de contra-presiune.

RabbitMQ integrat în sisteme moștenite

În cazul de utilizare anterior, am menționat posibilitatea de a utiliza plug-in-uri pentru a extinde funcționalitatea RabbitMQ. Această caracteristică puternică permite RabbitMQ să acționeze ca un strat de mediere între serviciile dvs. native RabbitMQ (capabile AMQP) și alte aplicații moștenite. Câteva exemple notabile includ:
1) Utilizarea RabbitMQ ca broker MQTT prin simpla activare a unui plug-in. Acest lucru deschide peisajul pentru multe tehnologii IoT.
2) Plug-in-ul RabbitMQ JMS (Java Message Service), care permite RabbitMQ să comunice cu orice soluție de mesagerie capabilă de JMS.
3) Dacă aplicația dvs. folosește un protocol proprietar pentru comunicare, este posibil să dezvoltați un plugin personalizat pentru a vă conecta la orice astfel de servicii.

Concluzie

După cum demonstrează exemplele de mai sus, nu există aproape nimic cu care RabbitMQ să nu poată comunica. Dar, ca orice lucru în viață, are un preț. Deși configurarea RabbitMQ este în mare parte simplă, uneori simplul număr de caracteristici poate fi copleșitor. Dacă întâmpinați probleme cu proiectarea, implementarea sau susținerea brokerilor RabbitMQ, contactați echipa noastră de experți aici. Sau, dacă doriți să vă începeți cariera într-una dintre cele mai solicitate tehnologii, înscrieți-vă la cursul nostru de formare RabbitMQ de 3 zile.

Debugging RabbitMQ

Vreți un sistem intuitiv care să faciliteze monitorizarea și întreținerea RabbitMQ-ului dumneavoastră? Obțineți acum versiunea de încercare gratuită de 45 de zile a WombatOAM.

Pagina noastră RabbitMQ Capabilities

.