RabbitMQ. Partea 1. Introducere. Erlang, AMQP

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:

RabbitMQ. Partea 1. Introducere. Erlang, AMQP

  • 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 mesajelor consumers (consumatori)
  • binding (legătura) — regulă care informează punctul de schimb în care coadă ar trebui să ajungă aceste mesaje

Protocolul funcționează deasupra TCP/IP.

Pe scurt despre Erlang

Codul sursă al proiectului se află în repository-ul de pe GitHub. Arhitectura RabbitMQ-server se bazează pe Erlang și BEAM.

Erlang a fost dezvoltat de compania Ericsson î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%. Erlang este folosit în diferite industrii și aplicații moderne, de exemplu în WhatsApp. Puteți citi mai multe în articolul arhitectura WhatsApp, pe care Facebook l-a cumpărat pentru 19 miliarde de dolari.

Pe scurt despre RabbitMQ

RabbitMQ – este un broker de mesaje cu sursă deschisă. Acesta rutează mesajele conform principiilor de bază ale protocolului AMQP descrise în specificații. 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.

RabbitMQ. Partea 1. Introducere. Erlang, AMQP

În esență, funcționarea RabbitMQ poate fi descrisă astfel:

  1. Editorul trimite un mesaj către un anumit exchange
  2. Exchange-ul, după ce primește mesajul, îl rutează în una sau mai multe cozi conform regulilor de legătură dintre acesta și coadă
  3. Coadă păstrează un link către acest mesaj. Mesajul în sine este stocat în memorie sau pe disc.
  4. Odată ce consumatorul este pregătit să primească mesajul din coadă, serverul creează o copie a mesajului pe baza linkului și o trimite.
  5. Consumatorul primește mesajul și trimite brokerului o confirmare.
  6. Brokerul, după ce primește confirmația, șterge copia mesajului din coadă. Apoi o șterge din memorie și de pe disc.

RPC

Procesul RPC (apel de procedură la distanță) 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:

RabbitMQ. Partea 1. Introducere. Erlang, AMQP

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 multiplexaremultiplexare). 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.

RabbitMQ. Partea 1. Introducere. Erlang, AMQP

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 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 MQTT Plugin RabbitMQ care este o implementare a protocolului MQTT 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 site-ul proiectului).

În următorul articol vom începe să ne aprofundăm în temă cu Exchanges.

Linkuri

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster