Bună ziua, Habr! Vreau să vă împărtășesc un manual de referință pe care am reușit să o adun RabbitMQ și condensați în recomandări și concluzii scurte.
Cuprins
RabbitMQ. Partea 1. Introducere. Erlang, AMQP și RPC
RabbitMQ. Partea 2. Înțelegerea schimburilor
RabbitMQ. Partea 3. Înțelegerea cozilor și legăturilor
RabbitMQ. Partea 4. Înțelegerea ce sunt mesajele și cadrele
RabbitMQ. Partea 5: Publicarea mesajelor și performanța consumului
RabbitMQ. Partea 6. Revizuirea modulelor Federație și Shovel
RabbitMQ. Partea 7. Detalii despre Connection și Chanel
RabbitMQ. Partea 8. RabbitMQ în .NET
RabbitMQ. Partea 9. Monitorizare
Pe scurt despre AMQP
AMQP (Advanced Message Queuing Protocol) este un protocol deschis pentru transmiterea mesajelor între componentele sistemului. Ideea de bază este că subsistemele individuale (sau aplicațiile independente) pot schimba mesaje într-o manieră arbitrară printr-un broker AMQP, care efectuează rutarea, eventual garantează livrarea, distribuie fluxuri de date și se abonează la tipurile de mesaje dorite.
protocol AMQP introduce trei concepte:
exchange (punct de schimb sau schimb) - i se trimit mesaje. Punct de schimb distribuie mesajul în una sau mai multe cozi. Ea direcționează mesajele către o coadă pe baza conexiunilor create (binding) între el și coadă
queue (coadă) - o structură de date pe disc sau în RAM care stochează link-uri către mesaje și oferă copii ale mesajelor consumers (pentru consumatori)
binding (obligatorie) - o regulă care spune punctului de schimb în ce coadă ar trebui să intre aceste mesaje
Codul sursă al proiectului se află în depozitul la GitHub. Arhitectură RabbitMQ-server bazat pe erlang și BEAM.
Erlang dezvoltat de companie Ericsson la mijlocul anilor 1980 ca un sistem distribuit, tolerant la erori, în timp real pentru aplicații care necesită un timp de funcționare de 99,999%. Erlang utilizat în diverse industrii și aplicații moderne, de ex. WhatsApp. Puteți citi mai multe în articol Arhitectura WhatsApp, pe care Facebook a cumpărat-o cu 19 miliarde de dolari
Pe scurt despre RabbitMQ
Iepure MQ este un broker de mesaje open source. Dirija mesajele de-a lungul tuturor principiilor de bază ale protocolului AMQP descris în specificații. RabbitMQ implementează și completează protocolul AMQP.
Ideea principală a modelului de mesagerie în RabbitMQ lucru este producer (editorul) nu trimite mesaje direct la coadă. De fapt, și destul de des, editorul nici măcar nu știe dacă mesajul va fi livrat la vreo coadă.
În schimb, editorul poate trimite mesaje doar către schimb. Pe de o parte, schimbul primește mesaje de la editori, iar pe de altă parte, le trimite la cozi. Schimbul trebuie să știe exact ce să facă cu mesajul pe care îl primește. Ar trebui adăugat la o anumită coadă? Ar trebui adăugat la mai multe cozi? Sau mesajul ar trebui ignorat.
Lucru scurt RabbitMQ poate fi descris astfel:
Editorul trimite un mesaj unui anumit schimb
Un schimb, după ce a primit un mesaj, îl direcționează către una sau mai multe cozi în conformitate cu regulile obligatorii dintre el și coadă
Coada stochează o referință la acest mesaj. Mesajul în sine este stocat în RAM sau pe disc
Odată ce consumatorul este gata să primească un mesaj din coadă, serverul creează o copie a mesajului prin intermediul linkului și trimite
Consumatorul primește mesajul și trimite o confirmare către broker
Brokerul, la primirea confirmării, șterge o copie a mesajului din coadă. Apoi șterge din RAM și disc
RPC
proces RPC (apel de procedură la distanță) sta la baza aproape tuturor interactiunilor cu nucleul RabbitMQ. De exemplu, discuții inițiale despre condițiile clientului cu RabbitMQ, demonstrează un anumit proces RPC. Odată ce această secvență este completă, RabbitMQ va fi gata să accepte cereri de la client:
De asemenea, în caietul de sarcini AMQP atât clientul cât și serverul pot emite comenzi. Aceasta înseamnă că clientul așteaptă să comunice cu serverul. Comenzile sunt clase și metode. De exemplu, Connection.Start – apel de metodă Start clasă Connection.
Conexiune și canale
Pentru un astfel de schimb de informații între client și server, canale. Canalele sunt create în interior conexiune specifică. Fiecare canal este izolat de celelalte canale. În cazul sincron, nu este posibilă executarea următoarei comenzi până la primirea unui răspuns.
Pentru a putea trimite comenzi în paralel, trebuie să deschideți mai multe canale. Fiecare canal creează un canal separat Erlang proces. O conexiune poate avea mai multe canale (multiplexare). Pentru fiecare canal există anumite structuri și obiecte în memorie. Prin urmare, cu cât există mai multe canale într-o conexiune, cu atât RabbitMQ folosește mai multă memorie pentru a gestiona o astfel de conexiune.
Un exemplu simplu de creare a unei conexiuni și a unui canal folosind RabbitMQ.Client:
// ...
private void TryConnect()
{
var factory = new ConnectionFactory()
{
HostName = "host_name",
UserName = "user_name",
Password = "p@ssword",
// Включение автоматичекого восстановления
// соединения после сбоев сети
AutomaticRecoveryEnabled = true
};
_connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
_channel = _connection.CreateModel();
// other options
}
Deschiderea unei noi conexiuni pentru fiecare operațiune este puternic descurajată, deoarece aceasta va duce la costuri mari. Canalele ar trebui să fie, de asemenea, persistente, dar multe erori de protocol fac ca canalul să se închidă, astfel încât durata de viață a canalului poate fi mai scurtă decât cea a conexiunii.
Unde se folosește RabbitMQ?
În contextul microserviciilor, protocolul AMQP și implementarea acesteia în RabbitMQ adesea folosit pentru interacțiune asincronă între servicii.
În context IIOT protocol AMQP și implementarea acesteia în RabbitMQ folosit pentru schimbul de date între servere (server-server). Utilizați și pluginul Plugin MQTT RabbitMQ care este o implementare a protocolului MQTT pentru transmiterea datelor între senzor și server în medii cu viteză mică și cu latență ridicată (o listă completă a protocoalelor acceptate este listată la site-ul proiectului).
În următorul articol vom începe să înțelegem Schimburile mai detaliat.