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:
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
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.
Kratko radi RabbitMQ može se opisati na sljedeći način:
Izdavač šalje poruku određenoj razmjeni
Razmjena, nakon što je primila poruku, usmjerava je na jedan ili više redova u skladu s pravilima povezivanja između nje i reda
Red pohranjuje vezu do ove poruke. Sama poruka je pohranjena u RAM-u ili na disku
Čim je potrošač spreman da primi poruku iz reda čekanja, server kreira kopiju poruke referencom i šalje
Potrošač prima poruku i šalje brokeru potvrdu
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:
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.
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.