Dobar dan, Habr! Želim podijeliti udžbenik-priručnik znanja koji sam uspio prikupiti RabbitMQ te sažeti u kratke preporuke i zaključke.
pregled sadržaja
RabbitMQ. Dio 1. Uvod. Erlang, AMQP i RPC
RabbitMQ. Dio 2. Razumijevanje razmjena
RabbitMQ. Dio 3. Razumijevanje redova čekanja i povezivanja
RabbitMQ. Dio 4. Razumijevanje što su poruke i okviri
RabbitMQ. Dio 5: Izvedba poruke objavljivanja i konzumiranja
RabbitMQ. Dio 6. Pregled modula Federation i Shovel
RabbitMQ. Dio 7. Pojedinosti o vezi i Chanelu
RabbitMQ. Dio 8. RabbitMQ u .NET-u
RabbitMQ. Dio 9. Praćenje
Ukratko o AMQP
AMQP (Advanced Message Queuing Protocol) je otvoreni protokol za prijenos poruka između komponenti sustava. Osnovna ideja je da pojedinačni podsustavi (ili neovisne aplikacije) mogu razmjenjivati poruke na proizvoljan način preko AMQP brokera, koji obavlja usmjeravanje, eventualno jamči isporuku, distribuira tokove podataka i pretplaćuje se na željene vrste poruka.
protokol AMQP uvodi tri pojma:
exchange (mjenjačnica ili mjenjačnica) - na nju se šalju poruke. Mjenjačnica distribuira poruku u jednom ili više redova. Ona usmjerava poruke u red čekanja na temelju stvorenih poveznica (binding) između njega i reda čekanja
queue (queue) – struktura podataka na disku ili u RAM-u koja pohranjuje poveznice na poruke i daje kopije poruka consumers (potrošačima)
binding (obvezujući) - pravilo koje govori točki razmjene u koji red čekanja te poruke trebaju ići
Erlang razvila tvrtka Ericsson sredinom 1980-ih kao distribuirani sustav u stvarnom vremenu otporan na greške za aplikacije koje zahtijevaju 99,999% neprekidnog rada. Erlang koristi se u raznim industrijama i modernim primjenama, npr. WhatsApp. Više možete pročitati u članku WhatsApp arhitektura koju je Facebook kupio za 19 milijardi dolara
Ukratko o RabbitMQ
Zec MQ je broker poruka otvorenog koda. Usmjerava poruke uz sve osnovne principe protokola AMQP opisano u tehnički podaci. RabbitMQ provodi i dopunjuje protokol AMQP.
Glavna ideja modela slanja poruka u RabbitMQ stvar je producer (izdavač) ne šalje poruke izravno u red čekanja. Zapravo, i to prilično često, izdavač niti ne zna hoće li poruka uopće biti isporučena u bilo koji red čekanja.
Umjesto toga, izdavač može samo slati poruke burzi. S jedne strane, burza prima poruke od izdavača, as druge strane ih šalje u redove. Razmjena mora točno znati što učiniti s porukom koju primi. Treba li ga dodati u određeni red čekanja? Treba li ga dodati u više redova čekanja? Ili poruku treba ignorirati.
Kratak rad RabbitMQ može se opisati na sljedeći način:
Izdavač šalje poruku određenoj burzi
Razmjena, nakon što primi poruku, usmjerava je u jedan ili više redova čekanja u skladu s pravilima povezivanja između nje i reda čekanja
Red čekanja pohranjuje referencu na ovu poruku. Sama poruka pohranjuje se u RAM ili na disk
Nakon što je korisnik spreman primiti poruku iz reda čekanja, poslužitelj stvara kopiju poruke putem veze i šalje
Potrošač prima poruku i šalje potvrdu posredniku
Broker, nakon što dobije potvrdu, uklanja kopiju poruke iz reda čekanja. Zatim briše iz RAM-a i diska
RPC
proces RPC (poziv udaljene procedure) leži u osnovi gotovo svih interakcija s jezgrom RabbitMQ. Na primjer, početni razgovori o uvjetima klijenta s RabbitMQ, demonstrira određeni proces RPC. Kada se ovaj niz završi, RabbitMQ bit će spremni prihvatiti zahtjeve klijenta:
Također u specifikaciji AMQP i klijent i poslužitelj mogu izdavati naredbe. To znači da klijent čeka na komunikaciju s poslužiteljem. Naredbe su klase i metode. Na primjer, Connection.Start – poziv metode Start razred Connection.
Veza i kanali
Za takvu razmjenu informacija između klijenta i poslužitelja, kanali. Kanali se stvaraju unutar specifična veza. Svaki kanal je izoliran od ostalih kanala. U sinkronom slučaju nije moguće izvršiti sljedeću naredbu dok se ne primi odgovor.
Da biste mogli slati naredbe paralelno, morate otvoriti nekoliko kanala. Svaki kanal stvara zaseban Erlang postupak. Jedna veza može imati više kanala (multipleksiranje). Za svaki kanal postoje određene strukture i objekti u memoriji. Stoga, što je više kanala unutar veze, to RabbitMQ koristi više memorije upravljati takvom vezom.
Jednostavan primjer stvaranja 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
}
Stoga se izričito ne preporučuje otvaranje nove veze za svaku operaciju dovest će do visokih troškova. Kanali bi također trebali biti postojani, ali mnoge pogreške protokola uzrokuju zatvaranje kanala, tako da životni vijek kanala može biti kraći od vijeka trajanja veze.
Gdje se koristi RabbitMQ?
U kontekstu mikroservisa, protokol AMQP i njegovu implementaciju u RabbitMQ često se koristi za asinkrona interakcija između usluga.
U kontekstu IIOT protokol AMQP i njegovu implementaciju u RabbitMQ služi za razmjenu podataka između poslužitelja (poslužitelj-poslužitelj). Također koristite dodatak MQTT dodatak RabbitMQ što je implementacija protokola MQTT za prijenos podataka između senzora i poslužitelja u okruženjima male brzine i visoke latencije (potpuni popis podržanih protokola naveden je na web mjesto projekta).
U sljedećem ćemo članku detaljnije razumjeti Burze.