Exchange — výmenník alebo výmenné miesto. Na ňu sa odosielajú správy. Exchangedistribuuje 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.
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 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:
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:
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:
RabbitMQnefunguje 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:
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:
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:
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:
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:
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.
Ak tvorba exchangemož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:
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.