RabbitMQ. 2 dalis. Mainų supratimas

Exchange - keitiklis arba mainų taškas. Į jį siunčiami pranešimai. Exchange platina žinią vienoje ar keliose eilėse. Jis nukreipia pranešimus į eilę remiantis sukurtomis nuorodomis (bindings) tarp jo ir eilės.

Exchange nėra Erlango procesas. Dėl mastelio keitimo priežasčių exchange yra eilutė (nuoroda į modulį su kodu, kuriame yra maršruto parinkimo logika) integruotoje duomenų bazėje mnezija. 1 tūkst. šilumokaičių sunaudos tik 1 MB atminties.

Turinys

  • RabbitMQ. 1 dalis. Įvadas. Erlang, AMQP ir RPC
  • RabbitMQ. 2 dalis. Mainų supratimas
  • RabbitMQ. 3 dalis. Eilių ir surišimų supratimas
  • RabbitMQ. 4 dalis. Kaip elgtis su pranešimais ir rėmeliais
  • RabbitMQ. 5 dalis. Pranešimų publikavimas ir vartojimo efektyvumas
  • RabbitMQ. 6 dalis. Federacijos ir kastuvo modulių apžvalga
  • RabbitMQ. 7 dalis. Išsami informacija apie ryšį ir Chanel
  • RabbitMQ. 8 dalis. RabbitMQ .NET
  • RabbitMQ. 9 dalis. Stebėsena

Tiesioginiai mainai

Direct exchange - naudojamas kai reikia pristatyti pranešimą į konkrečias eiles. Žinutė publikuojama keitėjui su konkrečiu maršruto raktas ir patenka į visas eiles, kurios yra susietos su šiuo keitikliu su panašiu maršruto parinkimo raktu. Maršruto raktas yra eilutė. Suderinimas atliekamas naudojant tikrinant eilutes lygybei.

Grafinis pranešimų srauto vaizdas:

RabbitMQ. 2 dalis. Mainų supratimas

В rabbitmq yra koncepcija numatytasis šilumokaitis. Jis direct exchange be vardo. Jei naudojamas numatytasis keitiklis, pranešimas bus nukreiptas į eilę, kurios pavadinimas lygus pranešimų nukreipimo raktas.

Keitimasis temomis

Topic exchange - panašus direct exchange įgalina pasirinktinį maršrutą, lyginant maršruto parinkimo raktą. Tačiau šiuo atveju raktas yra duotas pagal šabloną. Kurdami šabloną naudokite 0 ar daugiau žodžių (raidžių AZ и az ir skaičiai 0-9), atskirtas tašku, taip pat simboliais * и #.

  • * - galima pakeisti tiksliai 1 žodis
  • # - gali būti pakeistas 0 ar daugiau žodžių

Grafinis pranešimų srauto vaizdas:

RabbitMQ. 2 dalis. Mainų supratimas

Pradedant nuo versijos RabbitMQ 2.4.0 maršruto parinkimo algoritmas topic exchange pradėjo dirbti iki 145 kartų greičiau. Jie tai pasiekė įgyvendindami metodą pabandyk įgyvendinti, o tai reiškia, kad šablonai pateikiami kaip medžio struktūra. Pavyzdžiui, šablonai a.b.c, a.*.b.c, a.#.c и b.b.c bus pavaizduotas tokia struktūra:

RabbitMQ. 2 dalis. Mainų supratimas

Rašto atitikimo ieškoma pradedant nuo šaknies ir einant iš viršaus į apačią.

Savybės:

  • šio keitiklio naudojimas gali tapti geras pasirinkimas būsimam programos kūrimui, nes šablonus visada galima pritaikyti taip, kad pranešimas būtų paskelbtas panašiai direct exchange arba fanout exchange
  • naudojami šablonai * daug greičiaunei naudojami šablonai #.
  • topic exchange lėčiau direct exchange

Fanout birža

Fanout exchange - visi pranešimai pristatomi į visas eiles net jei pranešime nurodytas maršruto parinkimo raktas.

Savybės:

  • RabbitMQ neveikia su maršruto parinkimo raktais ir šablonais kuris teigiamai veikia našumą. Tai greičiausia exchange;
  • visi vartotojai turi turėti galimybę apdoroti visus pranešimus;

Grafinis pranešimų srauto vaizdas:

RabbitMQ. 2 dalis. Mainų supratimas

Antraštės mainai

Headers exchange - nukreipia pranešimus į susijusias eiles, remiantis (rakto, vertės) savybių porų palyginimu headers įrišimo ir panašios žinutės savybė. headers yra a Dictionary<ключ, значение>.

Jei į žodyną įtrauksite specialų raktą x-match su prasme any, tada pranešimas nukreipiamas, jei poros (raktas, reikšmė) iš dalies sutampa. Šis elgesys yra panašus į operatoriaus elgesį or.

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

Numatytasis klavišas x-match yra reikšmė all. Tai reiškia, kad pranešimas nukreipiamas, kai poros (raktas, reikšmė) visiškai sutampa. Šis elgesys yra panašus į operatoriaus elgesį and.

Grafinis pranešimų srauto vaizdas:

RabbitMQ. 2 dalis. Mainų supratimas

Savybės:

  • papildomo lankstumo
  • papildomos skaičiavimo išlaidos. Visos atributo poros (raktas, reikšmė). headers turi būti surūšiuoti pagal rakto pavadinimą prieš apskaičiuojant pranešimų nukreipimo reikšmes. Lėtesnis nei kitų tipų mainai.

Nuoseklus maišos mainai

Šis keitiklis yra Prijunkite и neįmontuotas в RabbitMQ.

Consistent-hashing exchange (maišos nuoseklus mainai) – naudojamas, kai yra kelios eilės, kurios yra potencialūs pranešimo gavėjai, ir kai reikia nustatyti jų apkrovos balansą. Pranešimas susietas su eile pagal svorį (sąlyginė eilutės reikšmė iš 0 - n).

Ekvivalentinis eilių svoris – nurodo, kad kiekviena eilė gaus maždaug tiek pat pranešimus (kiekvienas pranešimas bus įrašytas tik į vieną eilę). Visiškai vienodo pranešimų platinimo garantijos nėra.

Grafinis pranešimų srauto vaizdas:

RabbitMQ. 2 dalis. Mainų supratimas

Hash apskaičiuojamas pagal maršruto raktą arba ypatybę headers žinutes. Jei visi paskelbti pranešimai turėjo skirtingus maršruto raktus, arba headers, tada pasiskirstymas vyks pagal svorį. Priešingu atveju bus naudojamas maršruto parinkimo raktas arba headers.

Turėtų padėti, kai vartotojų pralaidumas turi išaugti didesnis nei sprendimas, kai tą pačią eilę naudoja keli vartotojai.

Šilumokaičių derinys (E2E)

Visų šilumokaičių elgesys gali būti derinamas naudojant ryšį Keitimas į mainus (šilumokaičių derinys į specifikaciją neįtrauktas AMQP. Tai yra protokolo plėtinys iš šono RabbitMQ).

Grafinis pranešimų srauto vaizdas:

RabbitMQ. 2 dalis. Mainų supratimas

Jo sąskaita E2E galime rasti tinkamą keičiamo dydžio konfigūraciją, atitinkančią tiek esamus, tiek augančius reikalavimus.

Sukurkite biržą

Šilumokaitis sukuriamas naudojant sinchroninį RPC užklausa serveriui. Prašymas pateikiamas naudojant metodą Exchange.Declare, vadinamas su parametrais:

  • keitiklio pavadinimas
  • šilumokaičio tipas
  • kiti variantai

Kūrimo pavyzdys exchange pasinaudojant RabbitMQ.Client:

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

  • exchange - šilumokaičio, kurį norime sukurti, pavadinimas. Vardas turi būti unikalus
  • type - šilumokaičio tipas
  • durable - jei įdiegta true, Tada exchange bus nuolatinis. Jis bus saugomas diske ir galės atlaikyti serverio / brokerio paleidimą iš naujo. Jei vertė false, Tada exchange yra laikinas ir bus pašalintas, kai serveris / brokeris bus paleistas iš naujo
  • autoDelete - automatinis ištrynimas. Exchange bus ištrintas, kai bus ištrintos visos susijusios eilės
  • arguments yra neprivalomi argumentai. Dažniausiai per išdėstytus argumentus alternative exchange (alternatyvus keitiklis). Jei pranešimas negali pereiti per pradinį maršrutą, jis gali būti siunčiamas į alternatyvų mainų centrą, kad būtų nukreiptas kitu keliu.

RabbitMQ. 2 dalis. Mainų supratimas

Jei kūryba exchange galbūt, tada serveris klientui išsiųs sinchroninį pranešimą RPC atsakyti Exchange.DeclareOk. Jei kūryba neįmanoma (Prašymas buvo atmestas Exchange.Declare) tada kanalas bus uždarytas serveris naudojant asinchroninę komandą Channel.Close ir klientas gaus išimtį Operation InterruptedException, kuriame bus klaidos kodas ir jo aprašymas.

Prieš paskelbiant turi būti sukurtas keitiklis. Jei paskelbiate pranešimą kokiam neegzistuojančiam keitėjui - RabbitMQ tyliai jį pašalinkite.

Sukurkite „Exchange“ GUI

Eikite į administratoriaus skydelį RabbitMQ pagal vartotoją guest (Vartotojo vardas: guest ir slaptažodis: guest). Atkreipkite dėmesį, kad vartotojas guest gali prisijungti tik iš localhost. Dabar eikime į skirtuką Exchanges ir spustelėkite Add a new exchange. Užpildykite savybes:

RabbitMQ. 2 dalis. Mainų supratimas

Dauguma savybių buvo aprašytos aukščiau. Čia pažymime, kad jei nustatysime Internal, tada mainai gali būti naudojami tik E2E. Producer negalės siųsti žinučių į tokią biržą.

išvada

Kuriant sistemą patogu aprašyti topologiją maršruto parinkimas naudojant grafiką. Tačiau prieš pradedant kurti grafiką, verta paryškinti takus su dideliu srautu, nes. jie reikalauja didesnis pralaidumas (spektaklis). Tada galite klasifikuoti eismą. Ir tada pradėkite statyti.

Jei sudarytame grafike egzistuoja baigtinis rinkinys maršruto parinkimo raktus, tuomet verta pažvelgti į kelis fanout exchange, kurie yra 1:1 susiję su maršruto parinkimo raktu. Prisiminti, kad fanout exchange Greičiausias.

Jei maršrutų skaičius linkęs į begalybę, verta atkreipti dėmesį topic exchange arba, jei šablonas nereikalingas, galite pasirinkti direct exchnge, nes jis greitesnis topic exchange.

Įvairių derinių exchange turėtų padėti rasti tinkamą. keičiamo dydžio konfigūracija, kuris atitinka tiek esamus, tiek augančius sistemos reikalavimus.

Skaičius exchange o eilės turėtų būti minimalios, palyginti su maršrutų skaičiumi.

Kitame straipsnyje mes pradėsime daugiau suprasti apie eiles ir įrišimus.

Nuorodos

Šaltinis: www.habr.com

Добавить комментарий