RabbitMQ. Část 2. Zkoumáme Exchanges

Exchange — směnárna nebo výměnný bod. Do něj se odesílají zprávy. Exchange distribuuje zprávu do jedné nebo více front. On směřuje zprávy do fronty na základě vytvořených vazeb (bindings) mezi ním a frontou.

Exchange není Erlang-procesem. Z hlediska škálovatelnosti exchange — to je řetězec (odkaz na modul s kódem, kde leží logika směrování) ve vestavěné databázi mnesia. 1 tisíc výměn bude potřebovat jen 1MB paměti.

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. Zkoumáme, co jsou zprávy a rámy
  • 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í

Direct Exchange

Direct exchange — používá se, když je potřeba doručit zprávu do určitých front. Zpráva je publikována v směnárně s určitým směrovacím klíčem a dostává se do všech front, které jsou s touto směnárnou spojeny stejným směrovacím klíčem. Směrovací klíč — to je řetězec. Hledání shody probíhá pomocí ověřování řetězců na ekvivalenci.

Grafické znázornění toku zpráv:

RabbitMQ. Část 2. Zkoumáme Exchanges

V rabbitmq existuje pojem směnárna podle defaultu. To je direct exchange bez názvu. Pokud se používá směnárna podle defaultu, zpráva bude směrována do fronty s názvem rovným směrovacímu klíči zprávy.

Topic Exchange

Topic exchange – obdobně direct exchange umožňuje selektivní směrování porovnáváním směrovacího klíče. Ale v tomto případě je klíč zadán podle vzoru. Při vytváření vzoru se používá 0 nebo více slov (znaky AZ a az a číslice 0-9), oddělených tečkou, a také symboly * a #.

  • * — může být nahrazen přesně 1 slovo
  • # — může být nahrazen 0 nebo více slovy

Grafické znázornění toku zpráv:

RabbitMQ. Část 2. Zkoumáme Exchanges

Začínaje verzí RabbitMQ 2.4.0 se algoritmus směrování pro topic exchange stal pracovat až 145 o několik rychlostí. Dosáhli toho pomocí implementace trie implementation, která подразумевает представление шаблонů в виде структуры дерева. Například vzory a.b.c, a.*.b.c, a.#.c a b.b.c budou zobrazeny následující strukturou:

RabbitMQ. Část 2. Zkoumáme Exchanges

Hledání shody vzoru se provádí počínaje kořenem a pokračuje shora dolů.

Vlastnosti:

  • Použití tohoto výměníku může být dobrou volbou pro možné budoucí rozšíření aplikace, protože šablony lze vždy nastavit tak, aby zprávy byly publikovány obdobně direct exchange nebo fanout exchange
  • šablony, které používají * mnohem rychleji, než šablony, které používají #.
  • topic exchange pomaleji direct exchange

Fanout Exchange

Fanout exchange – všechny zprávy jsou doručovány do všech front i když je v zprávě uveden klíč pro směrování.

Vlastnosti:

  • RabbitMQ nepracuje s klíči pro směrování a šablonami což pozitivně ovlivňuje výkonnost. Je to nejrychlejší exchange;
  • všichni spotřebitelé by měli mít možnost zpracovávat všechny zprávy;

Grafické znázornění toku zpráv:

RabbitMQ. Část 2. Zkoumáme Exchanges

Headers Exchange

Headers exchange – směruje zprávy do souvisejících front na základě porovnání párů (klíč, hodnota) vlastnosti headers vazeb a podobné vlastnosti zprávy. headers představuje Dictionary<klíč, hodnota>.

Pokud do slovníku přidáme speciální klíč x-match s hodnotou any, zpráva je směrována při částečné shodě párů (klíč, hodnota). Toto chování je podobné operátoru or.

var bindingArguments = new Dictionary<String, Object>();
bindingArguments.add("x-match", "any");

Ve výchozím nastavení klíč x-match obsahuje hodnotu all. To znamená, že zpráva je směrována při úplné shodě párů (klíč, hodnota). Toto chování je podobné operátoru and.

Grafické znázornění toku zpráv:

RabbitMQ. Část 2. Zkoumáme Exchanges

Vlastnosti:

  • další flexibilita
  • dodatečné náklady na výpočet. Všechny páry (klíč, hodnota) atributu headers musí být seřazeny podle názvu klíče před výpočtem hodnot směrování zprávy. Pomalější než ostatní typy exchange.

Consistent-Hashing Exchange

Tento výměník je pluginem a není zabudován v RabbitMQ.

Consistent-hashing exchange (exchange s konzistentním hashováním) – používá se, když existuje několik front, které jsou potenciálními příjemci zprávy, a když je potřeba vyvážit zátěž mezi nimi. Spojení zprávy s frontou se děje na základě váhy (podmínková řetězcová hodnota od 0 - n).

Ekvivalentní váha front – říká, že do každé fronty přijde přibližně stejný počet zpráv (každá zpráva bude umístěna pouze do jedné fronty). Není zaručeno rovnoměrné rozložení zpráv.

Grafické znázornění toku zpráv:

RabbitMQ. Část 2. Zkoumáme Exchanges

Hash je vypočítán na základě klíče pro směrování nebo vlastnosti headers zprávy. Pokud všechny publikované zprávy měly různé klíče pro směrování nebo headers, distribuce bude probíhat podle hmotnosti. Jinak se použije směrovací klíč nebo headers.

Mělo by pomáhat, když šířka pásma spotřebitele potřebuje růst více než řešení s více spotřebiteli, kteří sdílejí jednu frontu.

Kombinování směnníků (E2E)

Chování všech směnníků lze kombinovat pomocí spojení Exchange-to-Exchange (kombinace směnníků není součástí specifikace AMQP. To je rozšíření protokolu z pohledu RabbitMQ).

Grafické znázornění toku zpráv:

RabbitMQ. Část 2. Zkoumáme Exchanges

Díky E2E můžeme najít správnou škálovatelnou konfiguraci, která vyhovuje jak aktuálním, tak rostoucím požadavkům.

Vytvoření Exchange

Vytvoření směnníku probíhá pomocí synchronního RPC žádosti k serveru. Žádost je realizována pomocí metody Exchange.Declare, volané s parametry:

  • název směnníku
  • typ směnníku
  • další parametry

Příklad vytvoření exchange pomocí RabbitMQ.Client:

//...
channel.ExchangeDeclare(
    exchange: "my_exchange",
    type: "direct",
    durable: "false",
    autoDelete: "false",
    arguments: null
);
//...

  • exchange — název směnníku, který chceme vytvořit. Název musí být jedinečný
  • type — typ směnníku
  • durable — pokud je nastaveno true, pak exchange bude trvalý. Bude uložen na disku a přečká restart serveru/brokera. Pokud je hodnota false, pak exchange dočasná a bude odstraněna, když bude server/broker restartován
  • autoDelete — automatické odstranění. Exchange bude odstraněn, když budou odstraněny všechny s ním spojené fronty
  • arguments — volitelné argumenty. Nejčastěji se prostřednictvím argumentů určuje alternative exchange (alternativní směnník). Pokud zpráva nemůže projít původní trasou, může být odeslána do alternativního směnníku pro směrování jinou cestou.

RabbitMQ. Část 2. Zkoumáme Exchanges

Pokud je vytvoření exchange možné, pak server odešle klientovi synchronní RPC odpověď Exchange.DeclareOk. Pokud je vytvoření nemožné (došlo k odmítnutí žádosti Exchange.Declare), pak kanál bude uzavřen serverem pomocí asynchronního příkazu Channel.Close a klient obdrží výjimku OperationInterruptedException, která bude obsahovat kód chyby a její popis.

Směnník musí být vytvořen před publikováním zpráv. Pokud publikujete zprávu do neexistujícího směnníku — RabbitMQ tiše ji odstraní.

Vytvoření Exchange prostřednictvím grafického rozhraní

Přejdeme do administrátorské panelu RabbitMQ pod uživatelským jménem guest (uživatelské jméno: guest a heslo: guest). Všimněte si, že uživatel guest se může připojit pouze z místního hostitele. Nyní přejdeme na kartu Exchanges a klikneme na Přidat nový exchange. Vyplňte vlastnosti:

RabbitMQ. Část 2. Zkoumáme Exchanges

Většina vlastností byla popsána výše. Zde zdůrazníme, že pokud nastavíte Interní, bude možné používat exchange pouze pro E2E. Producent nebude moci posílat zprávy na takový exchange.

Závěr

Při vývoji systému je pohodlné popisovat topologii směrování pomocí grafu. Ale než začnete stavět graf, je dobré vyčlenit cesty s vysokým provozem, protože právě ty vyžadují vyšší propustnost (výkon). Dále můžete klasifikovat provoz. A až poté přistoupit k budování.

Pokud v postaveném grafu existuje konečné množství klíčů směrování, je dobré podívat se na několik fanout exchange, které jsou 1:1 spojeny s klíčem směrování. Pamatujeme, že fanout exchange je nejrychlejší.

Pokud se počet tras blíží k nekonečnu, je dobré věnovat pozornost topic exchange nebo, pokud šablona není potřebná, můžete zvolit přímý exchange, protože je rychlejší. topic exchange.

Kombinace různých exchange by měla pomoci nalézt správnou škálovatelnou konfiguraci, která splňuje jak aktuální, tak rostoucí požadavky systému.

Počet exchange a front by mělo být minimální v porovnání s počtem tras.

V dalším článku se začneme podrobněji zabývat Queues a Bindings.

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