RabbitMQ. Časť 2. Pochopenie výmen

Exchange — výmenník alebo výmenné miesto. Na ňu sa odosielajú správy. Exchange distribuuje správu v jednom alebo viacerých frontoch. On smeruje správy do frontu na základe vytvorených spojení (bindings) medzi ním a radom.

Exchange nie je Erlangov proces. Z dôvodov škálovateľnosti exchange - toto je riadok (odkaz na modul s kódom, kde leží logika smerovania) vo vstavanej databáze mnesia. 1 tisíc výmenníkov spotrebuje iba 1 MB pamäte.

obsah

  • RabbitMQ. Časť 1. Úvod. Erlang, AMQP a RPC
  • RabbitMQ. Časť 2. Pochopenie výmen
  • RabbitMQ. Časť 3. Pochopenie frontov a väzieb
  • RabbitMQ. Časť 4. Pochopenie toho, čo sú správy a rámce
  • RabbitMQ. Časť 5: Zverejňovanie správ a spotreba
  • RabbitMQ. Časť 6. Prehľad modulov Federation a Shovel
  • RabbitMQ. Časť 7. Podrobnosti o Connection a Chanel
  • RabbitMQ. Časť 8. RabbitMQ v .NET
  • RabbitMQ. Časť 9. Monitorovanie

Priama výmena

Direct exchange - používa sa v prípade potreby doručiť správu do konkrétnych frontov. Správa je zverejnená na výmenník s konkrétnym smerovací kľúč a dostane sa do všetkých radov, ktoré sú pripojené k tomuto výmenníku s podobným smerovacím kľúčom. Smerovací kľúč je reťazec. Zhoda sa nájde pomocou kontrola ekvivalencie reťazcov.

Grafické znázornenie toku správ:

RabbitMQ. Časť 2. Pochopenie výmen

В rabbitmq existuje koncept predvolený výmenník. To direct exchange bez mena. Ak sa použije predvolený výmenník, správa bude smerovaná do frontu s názvom rovným kľúč na smerovanie správy.

Výmena tém

Topic exchange - podobný direct exchange umožňuje selektívne smerovanie porovnaním smerovacieho kľúča. Ale v tomto prípade je kľúč daný podľa šablóny. Pri vytváraní šablóny použite 0 alebo viac slov (písmen AZ и az a čísla 0-9), oddelené bodkou, ako aj symboly * и #.

  • * - možno nahradiť presne 1 слово
  • # - môže byť nahradený 0 alebo viac slov

Grafické znázornenie toku správ:

RabbitMQ. Časť 2. Pochopenie výmen

Od verzie RabbitMQ 2.4.0 smerovací algoritmus pre topic exchange začal pracovať až do 145 krát rýchlejšie. Dosiahli to zavedením prístupu skúste implementáciu, ktorá zahŕňa reprezentáciu vzorov ako stromovej štruktúry. Napríklad šablóny a.b.c, a.*.b.c, a.#.c и b.b.c bude reprezentovaná nasledujúcou štruktúrou:

RabbitMQ. Časť 2. Pochopenie výmen

Hľadanie zhody vzoru sa vykonáva od koreňa a postupuje zhora nadol.

Vlastnosti:

  • použitie tohto výmenníka sa môže stať dobrá voľba pre možný budúci vývoj aplikácie, pretože šablóny je možné vždy prispôsobiť tak, aby bola správa zverejnená rovnakým spôsobom direct exchange alebo fanout exchange
  • šablóny, ktoré používajú * oveľa rýchlejšieako šablóny, ktoré používajú #.
  • topic exchange pomalšie direct exchange

Fanout Exchange

Fanout exchange - všetky správy sú doručené do všetkých frontov aj keď je v správe špecifikovaný smerovací kľúč.

Vlastnosti:

  • RabbitMQ nefunguje so smerovacími kľúčmi a šablónami čo má pozitívny vplyv na produktivitu. Toto je najrýchlejšie exchange;
  • všetci spotrebitelia musia byť schopní spracovať všetky správy;

Grafické znázornenie toku správ:

RabbitMQ. Časť 2. Pochopenie výmen

Výmena hlavičiek

Headers exchange - smeruje správy do priradených frontov na základe porovnania párov vlastností (kľúč, hodnota). headers väzby a podobné vlastnosti správ. headers je a Dictionary<ключ, значение>.

Ak do slovníka pridáte špeciálny kľúč x-match so zmyslom any, potom je správa smerovaná, ak existuje čiastočná zhoda párov (kľúč, hodnota). Toto správanie je podobné ako u operátora or.

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

Predvolený kľúč x-match obsahuje hodnotu all. To znamená, že správa je smerovaná, ak sa páry (kľúč, hodnota) presne zhodujú. Toto správanie je podobné ako u operátora and.

Grafické znázornenie toku správ:

RabbitMQ. Časť 2. Pochopenie výmen

Vlastnosti:

  • dodatočná flexibilita
  • dodatočná výpočtová réžia. Všetky páry (kľúč, hodnota) atribútu headers musia byť zoradené podľa názvu kľúča pred výpočtom hodnôt smerovania správ. Pomalšie ako iné typy výmen.

Konzistentná hašovacia výmena

Tento výmenník je zapojiť и nezabudované в RabbitMQ.

Consistent-hashing exchange (výmena s konzistentným hashovaním) - používa sa, keď existuje niekoľko frontov, ktoré sú potenciálnymi príjemcami správy, a keď medzi nimi potrebujete vyrovnať zaťaženie. K spojeniu správy s frontom dochádza podľa váhy (podmienená hodnota reťazca z 0 - n).

Ekvivalentná váha frontov – označuje, že každá fronta dostane približne rovnaké množstvo správy (každá správa bude zaradená len do jedného frontu). Neexistuje úplná záruka rovnomernej distribúcie správ.

Grafické znázornenie toku správ:

RabbitMQ. Časť 2. Pochopenie výmen

Hash vypočítané na základe smerovacieho kľúča alebo vlastnosti headers správy. Ak by všetky zverejnené správy mali rôzne smerovacie kľúče resp headers, potom dôjde k rozdeleniu podľa hmotnosti. V opačnom prípade sa použije smerovací kľúč resp headers.

Malo by pomôcť, keď musí priepustnosť spotrebiteľov rásť vyššie ako riešenie s viacerými spotrebiteľmi používajúcimi jeden front.

Kombinované výmenníky (E2E)

Správanie všetkých výmenníkov je možné kombinovať pomocou komunikácie Exchange-to-Exchange (kombinované výmenníky nie sú zahrnuté v špecifikácii AMQP. Toto je rozšírenie protokolu zo strany RabbitMQ).

Grafické znázornenie toku správ:

RabbitMQ. Časť 2. Pochopenie výmen

Na úkor E2E dokážeme nájsť správnu škálovateľnú konfiguráciu, ktorá spĺňa súčasné aj rastúce požiadavky.

Vytvoriť Exchange

Vytvorenie výmenníka prebieha pomocou synchrónneho RPC žiadosť na server. Žiadosť sa podáva pomocou metódy Exchange.Declarevolané s parametrami:

  • názov výmenníka
  • typ výmenníka
  • iné parametre

Príklad stvorenia exchange prostredníctvom RabbitMQ.Client:

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

  • exchange — názov výmenníka, ktorý chceme vytvoriť. Názov musí byť jedinečný
  • type — typ výmenníka
  • durable - ak je nainštalovaný true, Potom exchange bude trvalý. Bude uložený na disku a môže prežiť reštart servera/sprostredkovateľa. Ak je hodnota false, Potom exchange je dočasný a vymaže sa pri reštarte servera/sprostredkovateľa
  • autoDelete - automatické odstránenie. Exchange sa vymaže, keď sa vymažú všetky s ním spojené fronty
  • arguments - voliteľné argumenty. Najčastejšie špecifikujú prostredníctvom argumentov alternative exchange (alternatívny výmenník). Ak správa nemôže prejsť pôvodnou trasou, možno ju poslať do alternatívneho výmenníka, aby bola smerovaná inou cestou.

RabbitMQ. Časť 2. Pochopenie výmen

Ak tvorba exchange možná, potom server odošle klientovi synchrónne RPC odpoveď Exchange.DeclareOk. Ak tvorba je nemožné (žiadosť bola zamietnutá Exchange.Declare), potom kanál sa zatvorí server pomocou asynchrónneho príkazu Channel.Close a klient dostane výnimku OperationInterruptedException, ktorá bude obsahovať kód chyby a jej popis.

Pred odoslaním správ musí byť vytvorený výmenník. Ak zverejníte správu nejakému neexistujúcemu výmenníku - RabbitMQ potichu to odstráni.

Vytvorenie Exchange cez GUI

Prejdite na panel správcu RabbitMQ pod užívateľom guest (používateľské meno: guest a heslo: guest). Upozorňujeme, že používateľ guest môže sa pripojiť iba z localhost. Teraz poďme na kartu Exchanges a kliknite na Add a new exchange. Vyplňte vlastnosti:

RabbitMQ. Časť 2. Pochopenie výmen

Väčšina vlastností bola opísaná vyššie. Tu si všimneme, že ak nastavíme Internal, potom je možné výmenu použiť len na E2E. Producer nebude môcť posielať správy do takejto ústredne.

Záver

Pri vývoji systému je vhodné popísať topológiu smerovanie pomocou grafu. Ale skôr ako začnete vytvárať graf, stojí za to zdôrazniť cesty s vysokou návštevnosťou, pretože sú to tí, ktorí požadujú vyššia priepustnosť (výkon). Ďalej môžete klasifikovať premávku. A až potom začať stavať.

Ak v zostrojenom grafe existuje konečná množina smerovacie kľúče, potom stojí za to pozrieť sa na niekoľko fanout exchange, ktoré sú 1:1 súvisiace so smerovacím kľúčom. To si pamätáme fanout exchange najrýchlejší.

Ak počet trás inklinuje k nekonečnu, potom by ste mali venovať pozornosť topic exchange alebo, ak šablóna nie je potrebná, môžete si vybrať direct exchnge, pretože je rýchlejší topic exchange.

Kombinácie rôznych exchange by vám mal pomôcť nájsť ten správny škálovateľná konfigurácia, ktorý spĺňa súčasné aj rastúce systémové požiadavky.

Číslo exchange a fronty by mali byť minimálne v porovnaní s počtom trás.

V ďalšom článku začneme chápať fronty a väzby podrobnejšie.

referencie

Zdroj: hab.com

Pridať komentár