Dobré odpoledne, Habr! Chci se podělit o učebnici-referenční knihu znalostí, které se mi podařilo nasbírat RabbitMQ a zhustit do krátkých doporučení a závěrů.
obsah
RabbitMQ. Část 1. Úvod. Erlang, AMQP a RPC
RabbitMQ. Část 2. Pochopení výměn
RabbitMQ. Část 3. Pochopení front a vazeb
RabbitMQ. Část 4. Pochopení toho, co jsou zprávy a rámce
RabbitMQ. Část 5: Publikování a konzumace zpráv
RabbitMQ. Část 6. Přehled modulů Federation a Shovel
RabbitMQ. Část 7. Podrobnosti o Connection a Chanel
RabbitMQ. Část 8. RabbitMQ v .NET
RabbitMQ. Část 9. Monitorování
Krátce o AMQP
AMQP (Advanced Message Queuing Protocol) je otevřený protokol pro přenos zpráv mezi komponentami systému. Základní myšlenkou je, že jednotlivé subsystémy (nebo nezávislé aplikace) si mohou vyměňovat zprávy libovolným způsobem prostřednictvím zprostředkovatele AMQP, který provádí směrování, případně garantuje doručení, distribuuje datové toky a odebírá požadované typy zpráv.
Protokol AMQP uvádí tři koncepty:
exchange (výměnné místo nebo ústředna) - jsou na něj odesílány zprávy. Směnárna distribuuje zprávu v jedné nebo více frontách. Ona směruje zprávy do fronty na základě vytvořených odkazů (binding) mezi ním a frontou
queue (fronta) - datová struktura na disku nebo v RAM, která ukládá odkazy na zprávy a poskytuje kopie zpráv consumers (pro spotřebitele)
binding (vazba) – pravidlo, že říká výměnnému bodu, do které fronty by tyto zprávy měly jít
Zdrojový kód projektu je v úložišti na adrese GitHub. Architektura RabbitMQ server na základě Erlang a BEAM.
Erlang vyvinuté společností Ericsson v polovině 1980. let jako distribuovaný systém v reálném čase odolný proti chybám pro aplikace vyžadující 99,999 % provozuschopnosti. Erlang používá se v různých průmyslových odvětvích a moderních aplikacích, např. WhatsApp. Více si můžete přečíst v článku Architektura WhatsApp, kterou Facebook koupil za 19 miliard dolarů
Krátce o RabbitMQ
RabbitMQ je open source zprostředkovatel zpráv. Směruje zprávy podle všech základních principů protokolu AMQP popsané v Specifikace. RabbitMQ implementuje a doplňuje protokol AMQP.
Hlavní myšlenka modelu zasílání zpráv v RabbitMQ věc je producer (vydavatel) neposílá zprávy přímo do fronty. Vlastně a dost často vydavatel ani neví, jestli bude zpráva vůbec doručena do nějaké fronty.
Místo toho může vydavatel odesílat zprávy pouze na burzu. Na jedné straně ústředna přijímá zprávy od vydavatelů a na druhé straně je posílá do front. Burza musí přesně vědět, co dělat se zprávou, kterou obdrží. Má být přidán do konkrétní fronty? Má být přidán do více front? Nebo by měla být zpráva ignorována.
Krátká práce RabbitMQ lze popsat následovně:
Vydavatel odešle zprávu na konkrétní burzu
Ústředna, která přijala zprávu, ji směruje do jedné nebo více front v souladu se závaznými pravidly mezi ní a frontou
Ve frontě je uložen odkaz na tuto zprávu. Samotná zpráva je uložena v paměti RAM nebo na disku
Jakmile je spotřebitel připraven přijmout zprávu z fronty, server vytvoří kopii zprávy prostřednictvím odkazu a odešle
Spotřebitel obdrží zprávu a zašle potvrzení zprostředkovateli
Broker po obdržení potvrzení odstraní kopii zprávy z fronty. Poté smaže z RAM a disku
RPC
Proces RPC (vzdálené volání procedury) je základem téměř všech interakcí s jádrem RabbitMQ. Například počáteční diskuse 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:
I ve specifikaci AMQP klient i server mohou vydávat příkazy. To znamená, že klient čeká na komunikaci se serverem. Příkazy jsou třídy a metody. Například, Connection.Start – volání metody Start třída Connection.
Připojení a kanály
Pro takovou výměnu informací mezi klientem a serverem kanály. Kanály jsou vytvořeny uvnitř konkrétní spojení. Každý kanál je izolován od ostatních kanálů. V synchronním případě není možné provést další příkaz, dokud není přijata odpověď.
Abyste mohli posílat příkazy paralelně, musíte otevřít několik kanálů. Každý kanál vytváří samostatný Erlang proces. Jedno připojení může mít více kanálů (multiplexování). Pro každý kanál jsou v paměti určité struktury a objekty. Proto čím více kanálů je v rámci připojení, tím více kanálů je v rámci připojení RabbitMQ využívá více paměti spravovat takové připojení.
Jednoduchý příklad vytvoření spojení a použití kanálu 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ůrazně se nedoporučuje otevření nového připojení pro každou operaci povede k vysokým nákladům. Kanály by také měly být trvalé, ale mnoho chyb protokolu způsobuje uzavření kanálu, takže životnost kanálu může být kratší než životnost připojení.
Kde se RabbitMQ používá?
V kontextu mikroslužeb protokol AMQP a jeho implementace v RabbitMQ často používané pro asynchronní interakce mezi službami.
V kontextu IIOT protokol AMQP a jeho implementace v RabbitMQ slouží k výměně dat mezi servery (server-server). Použijte také plugin Plugin MQTT RabbitMQ což je implementace protokolu MQTT pro přenos dat mezi senzorem a serverem v prostředí s nízkou rychlostí a vysokou latencí (úplný seznam podporovaných protokolů je uveden na projektové místo).
V dalším článku začneme Exchangem rozumět podrobněji.