RabbitMQ. Partea 1. Introducere. Erlang, AMQP

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:

RabbitMQ. Partea 1. Introducere. Erlang, AMQP

  • 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

Protocolul rulează pe deasupra TCP / IP.

Pe scurt despre Erlang

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.

RabbitMQ. Partea 1. Introducere. Erlang, AMQP

Lucru scurt RabbitMQ poate fi descris astfel:

  1. Editorul trimite un mesaj unui anumit schimb
  2. 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ă
  3. Coada stochează o referință la acest mesaj. Mesajul în sine este stocat în RAM sau pe disc
  4. Odată ce consumatorul este gata să primească un mesaj din coadă, serverul creează o copie a mesajului prin intermediul linkului și trimite
  5. Consumatorul primește mesajul și trimite o confirmare către broker
  6. 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:

RabbitMQ. Partea 1. Introducere. Erlang, AMQP

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.

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

referințe

Sursa: www.habr.com

Adauga un comentariu