RabbitMQ. Dio 1. Uvod. Erlang, AMQP

Dobar dan, Habr! Želim da podijelim udžbenik-priručnik znanja koje sam uspio prikupiti RabbitMQ i sažeti u kratke preporuke i zaključke.

Sadržaj

  • RabbitMQ. Dio 1. Uvod. Erlang, AMQP i RPC
  • RabbitMQ. Dio 2. Razumijevanje razmjena
  • RabbitMQ. Dio 3. Razumijevanje redova i veza
  • RabbitMQ. Dio 4. Razumijevanje šta su poruke i okviri
  • RabbitMQ. Dio 5: Izvedba objavljivanja i konzumiranja poruka
  • RabbitMQ. Dio 6. Pregled modula Federacije i Lopate
  • RabbitMQ. Dio 7. Detalji o Connectionu i Chanelu
  • RabbitMQ. Dio 8. RabbitMQ u .NET-u
  • RabbitMQ. Dio 9. Monitoring

Ukratko o AMQP-u

AMQP (Advanced Message Queuing Protocol) je otvoreni protokol za prosljeđivanje poruka između komponenti sistema. Osnovna ideja je da pojedinačni podsistemi (ili nezavisne aplikacije) mogu proizvoljno razmenjivati ​​poruke preko AMQP brokera koji vrši rutiranje, eventualno garantuje isporuku, distribuciju tokova podataka, pretplatu na željene tipove poruka.

Protokol AMQP uvodi tri koncepta:

RabbitMQ. Dio 1. Uvod. Erlang, AMQP

  • exchange (mesto razmene ili razmene) - poruke se šalju na njega. tačka razmene distribuira poruku u jednom ili više redova. Ona usmjerava poruke u red čekanja na osnovu kreiranih linkova (binding) između njega i reda
  • queue (red) - struktura podataka na disku ili u RAM-u, koja pohranjuje veze do poruka i daje kopije poruka consumers (potrošacima)
  • binding (obavezivanje) - pravilo koje govori tački razmjene u koji od redova ove poruke trebaju pasti

Protokol prestaje TCP / IP.

Ukratko o Erlangu

Izvorni kod projekta se nalazi u spremištu na adresi GitHub. Arhitektura rabbitmq-server na osnovu erlang i BEAM.

Erlang koju je razvila kompanija Ericsson sredinom 1980-ih kao distribuiran, otporan na greške, sistem u realnom vremenu za aplikacije koje zahtijevaju 99,999% neprekidnog rada. Erlang koristi se u raznim industrijama i modernim aplikacijama, na primjer u WhatsApp. Više možete pročitati u članku WhatsApp arhitektura, koju je Facebook kupio za 19 milijardi dolara

Ukratko o RabbitMQ-u

Rabbit MQ je posrednik poruka otvorenog koda. Usmjerava poruke prema svim osnovnim principima protokola AMQP opisano u specifikacije. RabbitMQ implementira i dopunjuje protokol AMQP.

Osnovna ideja modela razmjene poruka u RabbitMQ stvar je producer (izdavač) ne šalje poruke direktno u red čekanja. U stvari, i prilično često, izdavač čak i ne zna hoće li poruka uopće biti isporučena u bilo koji red čekanja.

Umjesto toga, izdavač može samo slati poruke na razmjenu. S jedne strane, berza prima poruke od izdavača, a sa druge strane ih šalje u redove. Razmjena mora tačno znati šta da radi sa primljenom porukom. Treba li ga dodati u određeni red čekanja? Treba li ga dodati u više redova? Ili poruku treba zanemariti.

RabbitMQ. Dio 1. Uvod. Erlang, AMQP

Kratko radi RabbitMQ može se opisati na sljedeći način:

  1. Izdavač šalje poruku određenoj razmjeni
  2. Razmjena, nakon što je primila poruku, usmjerava je na jedan ili više redova u skladu s pravilima povezivanja između nje i reda
  3. Red pohranjuje vezu do ove poruke. Sama poruka je pohranjena u RAM-u ili na disku
  4. Čim je potrošač spreman da primi poruku iz reda čekanja, server kreira kopiju poruke referencom i šalje
  5. Potrošač prima poruku i šalje brokeru potvrdu
  6. Broker, nakon što je primio potvrdu, uklanja kopiju poruke iz reda čekanja. Zatim briše iz RAM-a i sa diska

RPC

proces RPC (poziv udaljene procedure) leži u osnovi gotovo svih interakcija sa jezgrom RabbitMQ. Na primjer, početne rasprave o uslovima klijenta sa RabbitMQ, pokazuje određeni proces RPC. Kada se ovaj niz završi, RabbitMQ će biti spreman da prihvati zahtjeve klijenta:

RabbitMQ. Dio 1. Uvod. Erlang, AMQP

Takođe u specifikaciji AMQP i klijent i server mogu izdavati komande. To znači da klijent čeka na interakciju sa serverom. Naredbe su klase i metode. Na primjer, Connection.Start - poziv metode Start razred Connection.

Veza i kanali

Za ovu razmjenu informacija između klijenta i servera, kanala. Kanali se kreiraju unutar specifična veza. Svaki kanal je izolovan od ostalih kanala. U sinhronom slučaju, nije moguće izvršiti sljedeću naredbu dok se ne primi odgovor.

Da biste mogli paralelno slati komande, morate otvoriti nekoliko kanala. Svaki kanal stvara zaseban Erlang proces. Jedna veza može imati više kanala (multipleksiranje). Za svaki kanal postoje određene strukture i objekti u memoriji. Stoga, što više kanala postoji unutar veze, to RabbitMQ koristi više memorije za upravljanje takvom vezom.

RabbitMQ. Dio 1. Uvod. Erlang, AMQP

Jednostavan primjer kreiranja veze i korištenja kanala 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 
}

Otvaranje nove veze za svaku operaciju se ne preporučuje dovesti do visokih troškova. Kanali također moraju biti uporni, ali mnoge greške u protokolu uzrokuju zatvaranje kanala, tako da životni vijek kanala može biti kraći od životnog vijeka veze.

Gdje se RabbitMQ koristi?

U kontekstu mikroservisa, protokol AMQP i njegovu implementaciju u RabbitMQ često se koristi za asinhrona interakcija između službi.

U kontekstu IIOT protokol AMQP i njegovu implementaciju u RabbitMQ koristi se za razmjenu podataka između servera (server-server). Također koristeći dodatak MQTT dodatak RabbitMQ što je implementacija protokola MQTT za prijenos podataka između senzora i servera u okruženjima male brzine i velike latencije (za potpunu listu podržanih protokola, pogledajte web stranica projekta).

U sljedećem članku ćemo početi detaljnije razumjeti razmjene.

reference

izvor: www.habr.com

Dodajte komentar