RabbitMQ. Část 1. Úvod. Erlang, AMQP

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:

RabbitMQ. Část 1. Úvod. Erlang, AMQP

  • 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 frontou
  • fronta (fronta) — struktura dat na disku nebo v operační paměti, která uchovává odkazy na zprávy a předává kopie zpráv spotř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 TCP/IP.

Stručně o Erlangu

Zdrojový kód projektu se nachází v repozitáři na GitHub. Architektura RabbitMQ-server je založena na Erlang a BEAM.

Erlang byl vyvinut společností Ericsson v polovině 80. let jako distribuovaný, odolný systém reálného času pro aplikace vyžadující bezporuchový provoz 99,999%. Erlang se používá v různých odvětvích a moderních aplikacích, například v WhatsApp. Více si můžete přečíst v článku architektura WhatsApp, kterou Facebook koupil za 19 miliard dolarů.

Stručně o RabbitMQ

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 AMQP popisovaných v specifikaci. 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?

RabbitMQ. Část 1. Úvod. Erlang, AMQP

Krátce lze práci RabbitMQ popisovat následovně:

  1. Vydavatel posílá zprávu určitému výměně
  2. Výměna, která obdrží zprávu, směruje ji do jedné nebo více front podle pravidel vazby mezi ní a frontou
  3. Fronta uchovává odkaz na tuto zprávu. Samotná zpráva je uchovávána v paměti nebo na disku
  4. Jakmile je spotřebitel připraven obdržet zprávu z fronty, server vytvoří kopii zprávy podle odkazu a odešle ji
  5. Spotřebitel obdrží zprávu a pošle brokerovi potvrzení
  6. Broker, který obdržel potvrzení, odstraní kopii zprávy z fronty. Poté odstraní z paměti a z disku

RPC

Proces RPC (remote procedure call) 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:

RabbitMQ. Část 1. Úvod. Erlang, AMQP

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ů (multiplexing). 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í.

RabbitMQ. Část 1. Úvod. Erlang, AMQP

Jednoduchý příklad vytvoření připojení a kanálu pomocí 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 
}

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 MQTT Plugin RabbitMQ který je implementací protokolu MQTT 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 stránkách projektu).

V následujícím článku se budeme podrobněji zabývat Exchange.

Odkazy

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster