Dobré popoludnie, Habr! Chcem sa podeliť o učebnicu-príručku vedomostí, ktoré sa mi podarilo nazbierať RabbitMQ a zhustiť do krátkych odporúčaní a záverov.
obsah
RabbitMQ. Časť 1. Úvod. Erlang, AMQP a RPC
RabbitMQ. Časť 2. Pochopenie výmen
RabbitMQ. Časť 3. Pochopenie frontov a väzieb
RabbitMQ. Časť 4. Pochopenie toho, čo sú správy a rámce
RabbitMQ. Časť 5: Zverejňovanie správ a spotreba
RabbitMQ. Časť 6. Prehľad modulov Federation a Shovel
RabbitMQ. Časť 7. Podrobnosti o Connection a Chanel
RabbitMQ. Časť 8. RabbitMQ v .NET
RabbitMQ. Časť 9. Monitorovanie
Stručne o AMQP
AMQP (Advanced Message Queuing Protocol) je otvorený protokol na prenos správ medzi systémovými komponentmi. Základnou myšlienkou je, že jednotlivé subsystémy (alebo nezávislé aplikácie) si môžu vymieňať správy ľubovoľným spôsobom cez AMQP brokera, ktorý vykonáva smerovanie, prípadne garantuje doručenie, distribuuje dátové toky a odoberá požadované typy správ.
protokol AMQP zavádza tri pojmy:
exchange (výmenné miesto alebo zmenáreň) - do nej sa odosielajú správy. Výmenný bod distribuuje správu v jednom alebo viacerých frontoch. Ona smeruje správy do frontu na základe vytvorených spojení (binding) medzi ním a radom
queue (front) - dátová štruktúra na disku alebo v RAM, ktorá ukladá odkazy na správy a poskytuje kópie správ consumers (pre spotrebiteľov)
binding (záväzný) – pravidlo, že hovorí výmennému bodu, do ktorého frontu by tieto správy mali ísť
Zdrojový kód projektu je v úložisku na adrese GitHub. Architektúra RabbitMQ server založené na Erlang a BEAM.
Erlang vyvinuté spoločnosťou Ericsson v polovici osemdesiatych rokov minulého storočia ako distribuovaný systém v reálnom čase odolný voči chybám pre aplikácie vyžadujúce 1980% dostupnosť. Erlang používa sa v rôznych priemyselných odvetviach a moderných aplikáciách, napr. WhatsApp. Viac sa dočítate v článku Architektúra WhatsApp, ktorú Facebook kúpil za 19 miliárd dolárov
Stručne o RabbitMQ
RabbitMQ je sprostredkovateľ správ s otvoreným zdrojom. Smeruje správy podľa všetkých základných princípov protokolu AMQP popísané v technické údaje. RabbitMQ implementuje a dopĺňa protokol AMQP.
Hlavná myšlienka modelu správ v RabbitMQ vec je producer (vydavateľ) neposiela správy priamo do poradia. V skutočnosti, a dosť často, vydavateľ ani nevie, či bude správa vôbec doručená do nejakého frontu.
Namiesto toho môže vydavateľ posielať správy iba na burzu. Na jednej strane burza prijíma správy od vydavateľov a na druhej strane ich posiela do frontov. Ústredňa musí presne vedieť, čo má robiť so správou, ktorú dostane. Má sa pridať do konkrétneho poradia? Má sa pridať do viacerých frontov? Alebo by sa správa mala ignorovať.
Krátka práca RabbitMQ možno opísať takto:
Vydavateľ odošle správu na konkrétnu burzu
Výmena po prijatí správy ju nasmeruje do jedného alebo viacerých frontov v súlade so záväznými pravidlami medzi ňou a frontom
Vo fronte je uložený odkaz na túto správu. Samotná správa je uložená v RAM alebo na disku
Keď je spotrebiteľ pripravený prijať správu z frontu, server vytvorí kópiu správy prostredníctvom odkazu a odošle
Spotrebiteľ dostane správu a odošle potvrdenie sprostredkovateľovi
Sprostredkovateľ po prijatí potvrdenia odstráni kópiu správy z frontu. Potom sa odstráni z pamäte RAM a disku
RPC
Proces RPC (vzdialené volanie procedúry) je základom takmer všetkých interakcií s jadrom RabbitMQ. Napríklad počiatočné diskusie o podmienkach klienta s RabbitMQ, demonštruje určitý proces RPC. Po dokončení tejto sekvencie RabbitMQ bude pripravený akceptovať požiadavky od klienta:
Aj v špecifikácii AMQP klient aj server môžu zadávať príkazy. To znamená, že klient čaká na komunikáciu so serverom. Príkazy sú triedy a metódy. Napríklad, Connection.Start – volanie metódy Start trieda Connection.
Pripojenie a kanály
Pre takúto výmenu informácií medzi klientom a serverom, kanály. Kanály sa vytvárajú v rámci konkrétne spojenie. Každý kanál je izolovaný od ostatných kanálov. V synchrónnom prípade nie je možné vykonať nasledujúci príkaz, kým nie je prijatá odpoveď.
Aby ste mohli posielať príkazy paralelne, musíte otvoriť niekoľko kanálov. Každý kanál vytvára samostatný Erlang proces. Jedno pripojenie môže mať viacero kanálov (multiplexovanie). Pre každý kanál sú v pamäti určité štruktúry a objekty. Preto čím viac kanálov je v rámci spojenia, tým RabbitMQ využíva viac pamäte spravovať takéto spojenie.
Jednoduchý príklad vytvorenia spojenia a použitia kanála 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
}
Dôrazne sa neodporúča otvárať nové pripojenie pre každú operáciu povedie k vysokým nákladom. Kanály by tiež mali byť trvalé, ale mnohé chyby protokolu spôsobujú zatvorenie kanála, takže životnosť kanála môže byť kratšia ako životnosť pripojenia.
Kde sa používa RabbitMQ?
V kontexte mikroslužieb protokol AMQP a jeho implementácia v RabbitMQ často používané na asynchrónna interakcia medzi službami.
V kontexte IIOT protokol AMQP a jeho implementácia v RabbitMQ slúži na výmenu dát medzi servermi (server-server). Použite tiež plugin Doplnok MQTT RabbitMQ čo je implementácia protokolu MQTT na prenos údajov medzi snímačom a serverom v prostredí s nízkou rýchlosťou a vysokou latenciou (úplný zoznam podporovaných protokolov je uvedený na webová stránka projektu).
V ďalšom článku začneme výmenám rozumieť podrobnejšie.