Bună ziua, Habr! Vreau să împărtășesc un ghid de studiu cu informațiile pe care le-am reușit să le adun RabbitMQ și să le compun în recomandări scurte și concluzii.
Cuprins
- RabbitMQ. Partea 1. Introducere. Erlang, AMQP și RPC
- RabbitMQ. Partea 2. Să înțelegem schimburile
- RabbitMQ. Partea 3. Înțelegem Queues și Bindings
- RabbitMQ. Partea 4. Să înțelegem ce sunt mesajele și cadrele
- RabbitMQ. Partea 5. Performanța publicării și consumului de mesaje
- RabbitMQ. Partea 6. Prezentarea modulelor Federation și Shovel
- RabbitMQ. Partea 7. Detalii despre Conexiune și Canal
- RabbitMQ. Partea 8. RabbitMQ în .NET
- RabbitMQ. Partea 9. Monitorizare
Pe scurt despre AMQP
AMQP (Advanced Message Queuing Protocol) — protocol deschis pentru transmiterea mesajelor între componentele sistemului. Ideea principală este că subsistemele separate (sau aplicațiile independente) pot schimba mesaje în mod arbitrar prin intermediul brokerului AMQP, care efectuează rutarea, garantează livrarea, distribuie fluxurile de date și se abonează la tipurile de mesaje dorite.
Protocolul AMQP introduce trei concepte:

exchange(punct de schimb sau schimb) — aici sunt trimise mesajele. Punctul de schimb distribuie mesajul în una sau mai multe cozi. Acesta rutează mesajele către coadă pe baza legăturilor create (binding) între acesta și coadăqueue(coadă) — structură de date pe disc sau în memoria RAM, care stochează referințe la mesaje și returnează copii ale mesajelorconsumers(consumatori)binding(legătura) — regulă care informează punctul de schimb în care coadă ar trebui să ajungă aceste mesaje
Protocolul funcționează deasupra .
Pe scurt despre Erlang
Codul sursă al proiectului se află în repository-ul de pe . Arhitectura se bazează pe și BEAM.
Erlanga fost dezvoltat de companiaEricssonîn mijlocul anilor 1980 ca un sistem distribuit, rezistent la erori, în timp real pentru aplicații care necesită funcționare fără defect timp de 99,999%.Erlangeste folosit în diferite industrii și aplicații moderne, de exemplu în
Pe scurt despre RabbitMQ
– este un broker de mesaje cu sursă deschisă. Acesta rutează mesajele conform principiilor de bază ale protocolului descrise în . RabbitMQ implementază și completează protocolul AMQP.
Ideea principală a modelului de schimb de mesaje în RabbitMQ constă în faptul că producer (editorul) nu trimite mesaje direct în coadă. De fapt, editorul nici nu știe adesea dacă mesajul va fi livrat vreodată în vreo coadă.
În schimb, editorul poate trimite mesaje doar către un exchange. Pe de o parte, exchange-ul primește mesaje de la editori, iar pe de altă parte, le trimite în cozi. Exchange-ul trebuie să știe exact ce să facă cu mesajul primit. Trebuie să fie adăugat într-o anumită coadă? Trebuie să fie adăugat în mai multe cozi? Sau mesajul trebuie ignorat.

În esență, funcționarea RabbitMQ poate fi descrisă astfel:
- Editorul trimite un mesaj către un anumit exchange
- Exchange-ul, după ce primește mesajul, îl rutează în una sau mai multe cozi conform regulilor de legătură dintre acesta și coadă
- Coadă păstrează un link către acest mesaj. Mesajul în sine este stocat în memorie sau pe disc.
- Odată ce consumatorul este pregătit să primească mesajul din coadă, serverul creează o copie a mesajului pe baza linkului și o trimite.
- Consumatorul primește mesajul și trimite brokerului o confirmare.
- Brokerul, după ce primește confirmația, șterge copia mesajului din coadă. Apoi o șterge din memorie și de pe disc.
RPC
Procesul stă la baza practic a tuturor interacțiunilor cu nucleul. RabbitMQ. De exemplu, discuțiile inițiale despre condițiile clientului cu RabbitMQ, demonstrează un anumit proces. RPC. Odată ce această secvență se finalizează, RabbitMQ va fi pregătit să primească cereri de la client:

De asemenea, în specificație AMQP atât clientul cât și serverul pot apela comenzi. Aceasta înseamnă că clientul așteaptă interacțiune cu serverul. Comenzile sunt clase și metode. De exemplu, Connection.Start – apelul metodei Start clasei Connection.
Conexiuni și canale
Pentru un astfel de schimb de informații între client și server se folosesc canale. Canalele sunt create în cadrul unei anumite conexiuni. Fiecare canal este izolat de celelalte canale. În cazul sincron, nu este posibil să execute următoarea comandă până nu se primește un răspuns.
Pentru a putea trimite comenzi în paralel, este necesar să se deschidă mai multe canale. Fiecare canal creează un proces distinct. O conexiune poate avea mai multe canale ( Erlang multiplexare). Pentru fiecare canal există anumite structuri și obiecte în memorie. Așadar, cu cât sunt mai multe canale în cadrul unei conexiuni, cu atât mai multă memorie folosește RabbitMQ pentru a gestiona o astfel de conexiune.

Un exemplu simplu de creare a unei conexiuni și a unui canal folosind :
// ...
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 nu este recomandată, deoarece aceasta va duce la costuri mari. Canalele trebuie, de asemenea, să fie permanente, dar multe erori de protocol duc la închiderea canalului, așadar durata de viață a canalului poate fi mai scurtă decât cea a conexiunii.
Unde este utilizat RabbitMQ?
În contextul microservicilor, protocolul AMQP și implementarea sa în RabbitMQ sunt adesea folosite pentru interacțiunea asincronă între servicii.
În contextul IIOT protocol AMQP și implementarea sa în RabbitMQ este folosit pentru schimbul de date între servere (server-server). De asemenea, se folosește pluginul care este o implementare a protocolului pentru transmiterea de date între un senzor și un server în medii cu viteză mică și latență mare (lista completă a protocoalelor suportate este enumerată pe ).
În următorul articol vom începe să ne aprofundăm în temă cu Exchanges.
Linkuri
Sursa: habr.com
