RabbitMQ. Dio 1. Uvod. Erlang, AMQP

Dobar dan, Habr! Želim podijeliti priručnik s znanjem koji sam uspio prikupiti o RabbitMQ i sažeti u kratke preporuke i zaključke.

Sadržaj

  • RabbitMQ. Dio 1. Uvod. Erlang, AMQP i RPC
  • RabbitMQ. Dio 2. Razmatramo Exchanges
  • RabbitMQ. Dio 3. Razumijemo Redove i Povezivanja
  • RabbitMQ. Dio 4. Razjašnjavanje što su poruke i okviri
  • RabbitMQ. Dio 5. Performanse objavljivanja i konzumiranja poruka
  • RabbitMQ. Dio 6. Pregled modula Federation i Shovel
  • RabbitMQ. Dio 7. Detaljno o vezi i kanalu
  • RabbitMQ. Dio 8. RabbitMQ u .NET
  • RabbitMQ. Dio 9. Praćenje

Kratko o AMQP

AMQP (Advanced Message Queuing Protocol) — otvoreni protokol za prenos poruka između komponenti sustava. Osnovna ideja je da pojedinačne pod-sustave (ili neovisne aplikacije) mogu razmjenjivati poruke raznim načinima preko AMQP posrednika, koji provodi rutiranje, eventualno jamči dostavu, raspodjelu tokova podataka, i pretplatu na potrebne tipove poruka.

Protokol AMQP uvodi tri pojma:

RabbitMQ. Dio 1. Uvod. Erlang, AMQP

  • exchange (točka razmjene ili exchange) — u nju se šalju poruke. Točka razmjene raspodjeljuje poruku u jedan ili više redova. Ona rutira poruke u red na temelju stvorenih veza (binding) između nje i reda
  • queue (red) — struktura podataka na disku ili u RAM-u, koja pohranjuje reference na poruke i isporučuje kopije poruka consumers (konzumentima)
  • binding (binding) — pravilo koje javlja točki razmjene u koji red ove poruke trebaju ići

Protokol radi iznad TCP/IP.

Kratko o Erlangu

Izvorni kod projekta nalazi se u repozitoriju na GitHub. Arhitektura RabbitMQ-server temelji se na Erlangu i BEAM-u.

Erlangu razvijen od strane Ericssona sredinom 1980-ih kao distribuirani, otporan sustav u stvarnom vremenu za aplikacije koje zahtijevaju pouzdan rad 99,999%. Erlangu koristi se u raznim industrijama i suvremenim aplikacijama, primjerice u WhatsApp. O tome se može više pročitati u članku arhitektura WhatsApp, kojeg je Facebook kupio za 19 milijardi dolara

Kratko o RabbitMQ

RabbitMQ – to je posrednik za poruke s otvorenim izvorom. Rutinira poruke prema svim osnovnim principima protokola AMQP opisanim u specifikaciji. RabbitMQ implementira i dopunjava protokol AMQP.

Osnovna ideja modela razmjene poruka u RabbitMQ je da producer (izdavač) ne šalje poruke izravno u red. U stvarnosti, a vrlo često, izdavač čak ne zna hoće li poruka uopće biti isporučena u neki red.

Umjesto toga, izdavač može slati poruke samo na razmjenu. S jedne strane, razmjena prima poruke od izdavača, a s druge strane ih šalje u redove. Razmjena mora točno znati što učiniti s primljenom porukom. Treba li ju dodati u određeni red? Treba li ju dodati u više redova? Ili poruku treba ignorirati.

RabbitMQ. Dio 1. Uvod. Erlang, AMQP

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

  1. Izdavač šalje poruku određenoj razmjeni
  2. Razmjena, primivši poruku, usmjerava je u jedan ili više redova prema pravilima vezivanja između nje i reda
  3. Red čuva vezu na ovu poruku. Sama poruka se pohranjuje u radnu memoriju ili na disku.
  4. Čim potrošač bude spreman primiti poruku iz reda, poslužitelj stvara kopiju poruke prema vezi i šalje je.
  5. Potrošač prima poruku i šalje brokeru potvrdu.
  6. Broker, primivši potvrdu, uklanja kopiju poruke iz reda. Zatim uklanja iz radne memorije i s diska.

RPC

Proces RPC (remote procedure call) leži u osnovi praktički svih interakcija s kernelom. RabbitMQ. Na primjer, početne rasprave o uvjetima klijenta s RabbitMQ, demonstrira određeni proces RPC. Kada se ovaj niz završi, RabbitMQ bit će spreman primati zahtjeve od klijenta:

RabbitMQ. Dio 1. Uvod. Erlang, AMQP

Također u specifikaciji AMQP i klijent i poslužitelj mogu pozivati naredbe. To znači da klijent očekuje interakciju s poslužiteljem. Naredbe su klase i metode. Na primjer, Connection.Start – poziv metode Pokrenuti klase Connection.

Povezivanje i kanali

Za takvu razmjenu informacija između klijenta i poslužitelja koriste se kanali. Kanali se stvaraju unutar određene veze. Svaki kanal je izoliran od drugih kanala. U sinkronom slučaju nije moguće izvršiti sljedeću naredbu dok se ne primi odgovor.

Kako biste imali mogućnost slanja naredbi paralelno, morate otvoriti više kanala. Svaki kanal stvara poseban Erlangu proces. Jedna veza može imati mnogo kanala (multiplexing). Za svaku vezu postoje određene strukture i objekti u memoriji. Stoga, što više veza postoji unutar konekcije, to više memorije koristi RabbitMQ za upravljanje takvom vezom.

RabbitMQ. Dio 1. Uvod. Erlang, AMQP

Jednostavan primjer stvaranja veze i kanala pomoću 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 nije preporučljivo jer to može uzrokovati velike troškove. Kanali bi također trebali biti stalni, ali mnoge greške u protokolu dovode do zatvaranja kanala, pa trajanje kanala može biti kraće od trajanja veze.

Gdje se koristi RabbitMQ?

U kontekstu mikroservisa, protokol AMQP i njegova implementacija u RabbitMQ često se koriste za asinhronu interakciju među servisima.

U kontekstu IIOT protokol AMQP i njegova implementacija u RabbitMQ koristi se za razmjenu podataka između servera (server-server). Također se koristi dodatak MQTT Plugin RabbitMQ koji je implementacija protokola MQTT za prijenos podataka između senzora i servera u niskbrzinskim okruženjima s visokim kašnjenjem (cijeli popis podržanih protokola naveden je na web stranici projekta).

U sljedećem članku ćemo se detaljnije pozabaviti razmjenama.

Linkovi

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster