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:

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 redaqueue(red) — struktura podataka na disku ili u RAM-u, koja pohranjuje reference na poruke i isporučuje kopije porukaconsumers(konzumentima)binding(binding) — pravilo koje javlja točki razmjene u koji red ove poruke trebaju ići
Protokol radi iznad .
Kratko o Erlangu
Izvorni kod projekta nalazi se u repozitoriju na . Arhitektura temelji se na i BEAM-u.
Erlangurazvijen od straneEricssonasredinom 1980-ih kao distribuirani, otporan sustav u stvarnom vremenu za aplikacije koje zahtijevaju pouzdan rad 99,999%.Erlangukoristi se u raznim industrijama i suvremenim aplikacijama, primjerice u
Kratko o RabbitMQ
– to je posrednik za poruke s otvorenim izvorom. Rutinira poruke prema svim osnovnim principima protokola opisanim u . 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.

Kratko, rad RabbitMQ može se opisati na sljedeći način:
- Izdavač šalje poruku određenoj razmjeni
- Razmjena, primivši poruku, usmjerava je u jedan ili više redova prema pravilima vezivanja između nje i reda
- Red čuva vezu na ovu poruku. Sama poruka se pohranjuje u radnu memoriju ili na disku.
- Čim potrošač bude spreman primiti poruku iz reda, poslužitelj stvara kopiju poruke prema vezi i šalje je.
- Potrošač prima poruku i šalje brokeru potvrdu.
- Broker, primivši potvrdu, uklanja kopiju poruke iz reda. Zatim uklanja iz radne memorije i s diska.
RPC
Proces 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:

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

Jednostavan primjer stvaranja veze i kanala pomoću :
// ...
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 koji je implementacija protokola za prijenos podataka između senzora i servera u niskbrzinskim okruženjima s visokim kašnjenjem (cijeli popis podržanih protokola naveden je na ).
U sljedećem članku ćemo se detaljnije pozabaviti razmjenama.
Linkovi
Izvor: habr.com
