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í . 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 . 1 tisíc výměn bude potřebovat jen 1MB paměti.
Obsah
- 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:

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ě1slovo#— může být nahrazen0nebo více slovy
Grafické znázornění toku zpráv:

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 , která подразумевает представление шаблонů в виде структуры дерева. Například vzory a.b.c, a.*.b.c, a.#.c a b.b.c budou zobrazeny následující strukturou:

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 exchangenebofanout exchange - šablony, které používají
*mnohem rychleji, než šablony, které používají#. topic exchangepomalejidirect 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:
RabbitMQnepracuje 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:

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:

Vlastnosti:
- další flexibilita
- dodatečné náklady na výpočet. Všechny páry (klíč, hodnota) atributu
headersmusí 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 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:

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:

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í :
//...
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íkudurable— pokud je nastavenotrue, pakexchangebude trvalý. Bude uložen na disku a přečká restart serveru/brokera. Pokud je hodnotafalse, pakexchangedočasná a bude odstraněna, když bude server/broker restartovánautoDelete— automatické odstranění.Exchangebude odstraněn, když budou odstraněny všechny s ním spojené frontyarguments— volitelné argumenty. Nejčastěji se prostřednictvím argumentů určujealternative 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.

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 , 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:

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 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
