Dobrý den, Habr! Rád bych se podělil o učebnici-průvodce znalostmi, které se mi podařilo sesbírat, RabbitMQ a zkrátit do několika doporučení a závěrů.
Obsah
- RabbitMQ. Část 1. Úvod. Erlang, AMQP a RPC
- RabbitMQ. Část 2. Zkoumáme Exchanges
- RabbitMQ. Část 3. Zkoumáme Queues a Bindings
- RabbitMQ. Část 4. Pochopíme, co jsou zprávy a rámce.
- RabbitMQ. Část 5. Výkon publikace a spotřeby zpráv
- RabbitMQ. Část 6. Přehled modulů Federation a Shovel
- RabbitMQ. Část 7. Podrobně o Connection a Channel
- RabbitMQ. Část 8. RabbitMQ v .NET
- RabbitMQ. Část 9. Monitorování
Stručně o AMQP
AMQP (Advanced Message Queuing Protocol) — otevřený protokol pro přenos zpráv mezi komponenty systému. Hlavní myšlenkou je, že jednotlivé subsystémy (nebo nezávislé aplikace) mohou vzájemně komunikovat zasíláním zpráv přes AMQP broker, který zajišťuje směrování, může garantovat doručení, distribuci datových proudů a přihlášení k potřebným typům zpráv.
Protokol AMQP zavádí tři pojmy:

exchange(výměnný bod nebo výměna) — sem se zasílají zprávy. Výměnný bod distribuuje zprávu posílá do jedné nebo více front. On směřuje zprávy do fronty na základě vytvořených vazeb (binding) mezi ním a frontoufronta(fronta) — struktura dat na disku nebo v operační paměti, která uchovává odkazy na zprávy a předává kopie zprávspotřebitelé(konzumentům)binding(připojení) — pravidlo, které oznamuje výměnnému bodu, do které fronty tyto zprávy mají směřovat.
Protokol funguje na úrovni .
Stručně o Erlangu
Zdrojový kód projektu se nachází v repozitáři na . Architektura je založena na a BEAM.
Erlangbyl vyvinut společnostíEricssonv polovině 80. let jako distribuovaný, odolný systém reálného času pro aplikace vyžadující bezporuchový provoz 99,999%.Erlangse používá v různých odvětvích a moderních aplikacích, například v
Stručně o RabbitMQ
– je broker zpráv s otevřeným zdrojovým kódem. Směruje zprávy podle všech základních principů protokolu popisovaných v . RabbitMQ realizuje a doplňuje protokol. AMQP.
Hlavní myšlenka modelu výměny zpráv v RabbitMQ se skládá v tom, že producer (vydavatel) neposílá zprávy přímo do fronty. Ve skutečnosti a dost často ani vydavatel neví, zda bude zpráva vůbec doručena do nějaké fronty.
Místo toho může vydavatel posílat zprávy pouze na výměnu. Na jedné straně výměna přijímá zprávy od vydavatelů a na druhé je odesílá do front. Výměna musí přesně vědět, co dělat s přijatou zprávou. Má být přidána do určité fronty? Má být přidána do několika front? Nebo má být zpráva ignorována?

Krátce lze práci RabbitMQ popisovat následovně:
- Vydavatel posílá zprávu určitému výměně
- Výměna, která obdrží zprávu, směruje ji do jedné nebo více front podle pravidel vazby mezi ní a frontou
- Fronta uchovává odkaz na tuto zprávu. Samotná zpráva je uchovávána v paměti nebo na disku
- Jakmile je spotřebitel připraven obdržet zprávu z fronty, server vytvoří kopii zprávy podle odkazu a odešle ji
- Spotřebitel obdrží zprávu a pošle brokerovi potvrzení
- Broker, který obdržel potvrzení, odstraní kopii zprávy z fronty. Poté odstraní z paměti a z disku
RPC
Proces leží v základech prakticky všech interakcí s jádrem RabbitMQ. Například o počátečních jednáních o podmínkách klienta s RabbitMQ, demonstruje určitý proces RPC. Jakmile je tato sekvence dokončena, RabbitMQ bude připraven přijímat požadavky od klienta:

Také ve specifikaci AMQP a klient a server mohou volat příkazy. To znamená, že klient očekává interakci se serverem. Příkazy jsou třídy a metody. Například, Connection.Start – volání metody Spustit třídy Connection.
Připojení a kanály
Pro takovou výměnu informací mezi klientem a serverem se používají kanály. Kanály jsou vytvářeny v rámci určitého připojení. Každý kanál je izolován od ostatních kanálů. V synchronním případě není možné provést následující příkaz, dokud není obdržena odpověď.
Aby bylo možné posílat příkazy paralelně, je nutné otevřít několik kanálů. Každý kanál vytváří samostatný Erlang proces. Jedno připojení může mít mnoho kanálů (). Pro každý kanál existují určité struktury a objekty v paměti. Proto čím více kanálů existuje v rámci spojení, tím více paměti používá RabbitMQ pro správu takového spojení.

Jednoduchý příklad vytvoření připojení a kanálu pomocí :
// ...
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
}Otevírat nové spojení pro každou operaci se důrazně nedoporučuje, protože to povede k vyšším nákladům. Kanály by měly být také trvalé, avšak mnohé chyby protokolu vedou k uzavření kanálu, takže životnost kanálu může být kratší než u spojení.
Kde se používá RabbitMQ?
V kontextu mikroservisů je protokol AMQP a jeho implementaci v RabbitMQ často používán pro asynchronní interakci mezi službami.
V kontextu IIOT protokol AMQP a jeho implementaci v RabbitMQ se používá pro výměnu dat mezi servery (server-server). Také se používá plugin který je implementací protokolu pro přenos dat mezi senzorem a serverem v nízkorychlostních prostředích s vysokou latencí (úplný seznam podporovaných protokolů je uveden na ).
V následujícím článku se budeme podrobněji zabývat Exchange.
Odkazy
Zdroj: habr.com
