Dobrý deň, Habr! Chcem sa podeliť o príručku, ktorú som zostavil o RabbitMQ a zhrnuť do krátkych odporúčaní a záverov.
Obsah
- RabbitMQ. Časť 1. Úvod. Erlang, AMQP a RPC
- RabbitMQ. Časť 2. Rozoberieme si Exchanges
- RabbitMQ. Časť 3. Pochopenie Queues a Bindings
- RabbitMQ. Časť 4. Zaoberáme sa tým, čo sú správy a rámce
- RabbitMQ. Časť 5. Výkon publikovania a spotreby správ
- RabbitMQ. Časť 6. Prehľad modulov Federation a Shovel
- RabbitMQ. Časť 7. Podrobne o Connection a Channel
- RabbitMQ. Časť 8. RabbitMQ v .NET
- RabbitMQ. Časť 9. Monitorovanie
Stručne o AMQP
AMQP (Advanced Message Queuing Protocol) — otvorený protokol na prenos správ medzi komponentmi systému. Hlavná myšlienka spočíva v tom, že jednotlivé subsystémy (alebo nezávislé aplikácie) môžu medzi sebou vymieňať správy prostredníctvom AMQP brokera, ktorý vykonáva preposielanie, môže zaručiť doručenie, rozdeľovanie prúdov dát, predplatné na požadované typy správ.
Protokol AMQP zavádza tri pojmy:

exchange(výmena) — je to miesto, kam sa posielajú správy. Výmena distribuuje správy do jednej alebo viacerých front. Ona smeruje správy do fronty na základe vytvorených väzieb (binding) medzi ňou a frontouqueue(fronta) — dátová štruktúra na disku alebo v operačnej pamäti, ktorá uchováva odkazy na správy a poskytuje kópie správconsumers(spotrebiteľom)binding(väzba) — pravidlo, ktoré oznamuje výmene, do ktorej fronty by tieto správy mali ísť
Protokol funguje nad .
Stručne o Erlang
Zdrojový kód projektu sa nachádza v repozitári na . Architektúra je založená na a BEAM.
Erlangvyvinula spoločnosťEricssonv polovici 80. rokov ako distribuovaný, odolný voči poruchám, reálny systém pre aplikácie, ktoré vyžadujú bezporuchovú prevádzku 99,999%.Erlangpoužíva sa v rôznych odvetviach a moderných aplikáciách, napríklad v
Stručne o RabbitMQ
je broker správ s otvoreným zdrojovým kódom. Smeruje správy podľa všetkých základných princípov protokolu popísaných v . RabbitMQ realizuje a dopĺňa protokol AMQP.
Hlavná myšlienka modelu výmeny správ v RabbitMQ spočíva v tom, že producer (vydavateľ) neodosiela správy priamo do fronty. V skutočnosti a dosť často vydavateľ ani nevie, či bude správa vôbec doručená do nejakej fronty.
Namiesto toho môže vydavateľ odosielať správy iba na výmenník. Na jednej strane výmenník prijíma správy od vydavateľov, na druhej strane ich odosiela do front. Výmenník musí presne vedieť, čo robiť s prijatou správou. Má byť pridaná do určitej fronty? Má byť pridaná do niekoľkých front? Alebo má byť správa ignorovaná.

Prácu RabbitMQ je možné opísať nasledovne:
- Vydavateľ odosiela správu určitému výmenníku
- Výmenník, ktorý prijme správu, ju smeruje do jednej alebo viacerých front podľa pravidiel viazania medzi ním a frontou.
- Fronta uchováva odkaz na túto správu. Samotná správa sa uchováva v operačnej pamäti alebo na disku.
- Keď je spotrebiteľ pripravený prijať správu z fronty, server vytvorí kópiu správy podľa odkazu a odošle ju.
- Spotrebiteľ prijíma správu a posiela brokerovi potvrdenie.
- Broker, ktorý dostane potvrdenie, odstraňuje kópiu správy z fronty. Potom ju odstráni z operačnej pamäte a z disku.
RPC
Proces tvorí základ 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. Keď je táto sekvencia dokončená, RabbitMQ bude pripravený prijímať požiadavky od klienta:

Tiež v špecifikácii AMQP a klient a server môžu vyvolať príkazy. To znamená, že klient očakáva interakciu so serverom. Príkazy sú triedy a metódy. Napríklad, Connection.Start – vyvolanie metódy Spustiť triedy Pripojenie.
Pripojenia a kanály
Na takúto výmenu informácií medzi klientom a serverom sa používajú kanály. Kanály sa vytvárajú v rámci určitého pripojenia. Každý kanál je izolovaný od ostatných kanálov. V synchronnom prípade nie je možné vykonať ďalší príkaz, kým sa nedostane odpoveď.
Aby bolo možné odosielať príkazy paralelne, je potrebné otvoriť niekoľko kanálov. Každý kanál vytvára samostatný Erlang proces. Jedno pripojenie môže mať mnohé kanály (). Pre každého kanála existujú určité štruktúry a objekty v pamäti. Preto čím viac kanálov je v rámci spojenia, tým viac pamäte využíva RabbitMQ na správu takéhoto spojenia.

Jednoduchý príklad vytvorenia pripojenia a kanála pomocou :
// ...
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
}Otvorenie nového spojenia pre každú operáciu sa dôrazne neodporúča, pretože to vedie k vysokým nákladom. Kanály by mali byť tiež trvalé, ale mnohé protokolové chyby vedú k uzavretiu kanála, preto môže mať kanál kratšiu životnosť ako spojenie.
Kde sa používa RabbitMQ?
V kontexte mikroservisov sa protokol AMQP a jeho implementácia v RabbitMQ často používa na asynchrónnu interakciu medzi servisami.
V kontexte IIOT protokol AMQP a jeho implementácia v RabbitMQ sa používa na výmenu dát medzi servermi (server-server). Taktiež sa používa plugin ktorý je implementáciou protokolu pre prenos dát medzi snímačom a serverom v nízkorychlostných prostrediach s vysokou latenciou (kompletný zoznam podporovaných protokolov je uvedený na ).
V nasledujúcom článku sa podrobnejšie zaoberáme Exchanges.
Odkazy
Zdroj: habr.com
