RabbitMQ. Část 2. Pochopení výměn

Exchange - výměník nebo výměnné místo. Na něj se posílají zprávy. Exchange distribuuje zprávu v jedné nebo více frontách. On směruje zprávy do fronty na základě vytvořených odkazů (bindings) mezi ním a frontou.

Exchange není Erlangův proces. Z důvodů škálovatelnosti exchange je řetězec (odkaz na modul s kódem, kde je logika směrování) ve vložené databázi Paměť. 1 tisíc výměníků spotřebuje pouze 1 MB paměti.

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. Zacházení s tím, 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í

Přímá výměna

Direct exchange - používá se v případě potřeby doručit zprávu do konkrétních front. Zpráva je zveřejněna výměníku s konkrétním směrovací klíč a dostane se do všech front spojených s tímto výměníkem s podobným směrovacím klíčem. Směrovací klíč je řetězec. Párování se provádí pomocí kontrola rovnosti řetězců.

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

RabbitMQ. Část 2. Pochopení výměn

В rabbitmq existuje koncept výchozí výměník. To direct exchange beze jména. Pokud je použit výchozí výměník, bude zpráva směrována do fronty s názvem rovným klíč pro směrování zpráv.

Výměna témat

Topic exchange – podobný direct exchange umožňuje selektivní směrování porovnáním směrovacího klíče. Ale v tomto případě je klíč dán podle šablony. Při vytváření šablony použijte 0 nebo více slov (písmen AZ и az a čísla 0-9), oddělené tečkou, stejně jako symboly * и #.

  • * - lze přesně nahradit 1 slovo
  • # - lze nahradit 0 nebo více slov

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

RabbitMQ. Část 2. Pochopení výměn

Počínaje verzí RabbitMQ 2.4.0 směrovací algoritmus pro topic exchange začal pracovat až do 145 krát rychlejší. Dosáhli toho implementací tohoto přístupu zkuste implementaci, což implikuje reprezentaci šablon jako stromové struktury. Například šablony a.b.c, a.*.b.c, a.#.c и b.b.c bude reprezentována následující strukturou:

RabbitMQ. Část 2. Pochopení výměn

Shoda vzorů se prohledává od kořene směrem shora dolů.

Vlastnosti:

  • použití tohoto výměníku se může stát dobrá volba pro možný budoucí vývoj aplikací, protože šablony lze vždy upravit tak, aby zpráva byla publikována podobně direct exchange nebo fanout exchange
  • šablony, které používají * mnohem rychlejšínež šablony, které používají #.
  • topic exchange pomalejší direct exchange

Výměna Fanout

Fanout exchange - všechny zprávy jsou doručeny do všech front i když je ve zprávě uveden směrovací klíč.

Vlastnosti:

  • RabbitMQ nefunguje se směrovacími klíči a šablonami což má pozitivní vliv na výkon. Toto je nejrychlejší exchange;
  • všichni spotřebitelé musí být schopni zpracovat všechny zprávy;

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

RabbitMQ. Část 2. Pochopení výměn

Výměna záhlaví

Headers exchange - směruje zprávy do souvisejících front na základě porovnání dvojic (klíč, hodnota) vlastností headers vazba a podobná vlastnost zprávy. headers je a Dictionary<ключ, значение>.

Pokud do slovníku přidáte speciální klíč x-match s hodnotou any, pak je zpráva směrována, pokud se dvojice (klíč, hodnota) částečně shodují. Toto chování je podobné jako u operátora or.

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

Výchozí klíč x-match obsahuje hodnotu all. To znamená, že zpráva je směrována, když se dvojice (klíč, hodnota) zcela shodují. Toto chování je podobné jako u operátora and.

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

RabbitMQ. Část 2. Pochopení výměn

Vlastnosti:

  • další flexibilita
  • další výpočetní režie. Všechny páry (klíč, hodnota) atributu headers musí být před výpočtem hodnot směrování zpráv seřazeny podle názvu klíče. Pomalejší než jiné typy směny.

Konzistentní hashovací výměna

Tento výměník je zapojit и není zabudován в RabbitMQ.

Consistent-hashing exchange (hash-consistent exchange) – používá se, když existuje více front, které jsou potenciálními příjemci zprávy, a když mezi nimi potřebujete načíst rovnováhu. Zpráva je přiřazena k frontě podle váhy (podmíněná řetězcová hodnota z 0 - n).

Ekvivalentní váha front – udává, že každá fronta obdrží zhruba stejnou částku zprávy (každá zpráva bude zařazena pouze do jedné fronty). Neexistuje úplná záruka jednotné distribuce zpráv.

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

RabbitMQ. Část 2. Pochopení výměn

Hash vypočítané na základě směrovacího klíče nebo vlastnosti headers zprávy. Pokud by všechny publikované zprávy měly různé směrovací klíče, popř headers, pak dojde k rozdělení podle hmotnosti. V opačném případě bude použit směrovací klíč, popř headers.

Mělo by pomoci, když propustnost spotřebitelů potřebuje růst výše než řešení s více zákazníky používajícími stejnou frontu.

Kombinace výměníků (E2E)

Chování všech výměníků lze kombinovat pomocí komunikace Exchange-to-Exchange (kombinace výměníků není součástí specifikace AMQP. Toto je rozšíření protokolu ze strany RabbitMQ).

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

RabbitMQ. Část 2. Pochopení výměn

Na úkor E2E dokážeme najít správnou škálovatelnou konfiguraci, která splňuje současné i rostoucí požadavky.

Vytvořte Exchange

Výměník je vytvořen pomocí synchronního RPC požadavek na server. Žádost se provádí pomocí metody Exchange.Declare, voláno s parametry:

  • název výměníku
  • typ výměníku
  • jiné možnosti

Příklad stvoření exchange prostřednictvím RabbitMQ.Client:

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

  • exchange - název výměníku, který chceme vytvořit. Název musí být jedinečný
  • type - typ výměníku
  • durable - pokud je nainstalován truepak exchange bude trvalý. Bude uložen na disku a bude schopen přežít restart serveru/brokera. Pokud je hodnota falsepak exchange je dočasný a bude odstraněn po restartování serveru/brokera
  • autoDelete - automatické mazání. Exchange budou odstraněny, když budou odstraněny všechny přidružené fronty
  • arguments jsou volitelné argumenty. Nejčastěji prostřednictvím sady argumentů alternative exchange (alternativní výměník). Pokud zpráva nemůže projít původní cestou, může být odeslána na alternativní ústřednu, aby byla směrována jinou cestou.

RabbitMQ. Část 2. Pochopení výměn

Pokud tvoření exchange možná, pak server odešle klientovi synchronní RPC odpověď Exchange.DeclareOk. Pokud tvoření je nemožné (žádost byla zamítnuta Exchange.Declare), pak kanál se uzavře server pomocí asynchronního příkazu Channel.Close a klient dostane výjimku OperationInterruptedException, který bude obsahovat kód chyby a její popis.

Před zaúčtováním musí být vytvořen výměník. Pokud zveřejníte zprávu nějakému neexistujícímu výměníku - RabbitMQ tiše jej odstraňte.

Vytvořte grafické uživatelské rozhraní Exchange

Přejděte na panel správce RabbitMQ pod uživatelem guest (uživatelské jméno: guest a heslo: guest). Vezměte prosím na vědomí, že uživatel guest lze se připojit pouze z localhost. Nyní přejdeme na záložku Exchanges a klikněte na Add a new exchange. Vyplňte vlastnosti:

RabbitMQ. Část 2. Pochopení výměn

Většina vlastností byla popsána výše. Zde si všimneme, že pokud nastavíme Internal, pak lze výměnu použít pouze pro E2E. Producer nebude moci posílat zprávy na takovou ústřednu.

Závěr

Při vývoji systému je vhodné popsat topologii směrování pomocí grafu. Než se ale pustíte do sestavování grafu, vyplatí se zvýraznit cesty s vysokou návštěvností, protože. vyžadují vyšší propustnost (výkon). Dále můžete klasifikovat provoz. A pak začít stavět.

Pokud v sestrojeném grafu existuje konečná množina směrovací klíče, pak stojí za to podívat se na několik fanout exchange, které jsou 1:1 související se směrovacím klíčem. Pamatuj si to fanout exchange nejrychlejší.

Pokud počet tras inklinuje k nekonečnu, stojí za to věnovat pozornost topic exchange nebo, pokud šablona není potřeba, můžete si vybrat direct exchnge, protože je rychlejší topic exchange.

Kombinace různých exchange by vám měl pomoci najít ten správný. škálovatelná konfigurace, který splňuje současné i rostoucí systémové požadavky.

Číslo exchange a fronty by měly být minimální ve srovnání s počtem tras.

V příštím článku začneme chápat více o frontách a vazbách.

reference

Zdroj: www.habr.com

Přidat komentář