RabbitMQ. 2. osa. Vahetuste mõistmine

Exchange - soojusvaheti või vahetuspunkt. Sellele saadetakse sõnumeid. Exchange levitab sõnumit ühes või mitmes järjekorras. Tema suunab sõnumid järjekorda loodud linkide põhjal (bindings) selle ja järjekorra vahel.

Exchange ei ole Erlangi protsess. Skaleeritavuse huvides exchange on string (link moodulile koodiga, kus on marsruutimisloogika) manustatud andmebaasis mneesia. 1 soojusvaheti tarbib ainult 1 MB mälu.

Sisukord

Otsene vahetus

Direct exchange - kasutatakse vajadusel edastada sõnum konkreetsetele järjekordadele. Teade avaldatakse vahetajale konkreetsega marsruutimisvõti ja satub kõikidesse järjekordadesse, mis on sarnase marsruutimisvõtmega selle soojusvahetiga seotud. Marsruutimisvõti on string. Sobitamine toimub kasutades stringide võrdsuse kontrollimine.

Sõnumivoo graafiline esitus:

RabbitMQ. 2. osa. Vahetuste mõistmine

В rabbitmq on kontseptsioon vaikimisi soojusvaheti. See direct exchange nimetu. Kui kasutatakse vaikevahetit, suunatakse sõnum järjekorda, mille nimi on võrdne sõnumite suunamise võti.

Teemavahetus

Topic exchange - sarnane direct exchange võimaldab valikulist marsruutimist, võrreldes marsruutimisvõtit. Kuid sel juhul on võti antud malli järgi. Malli loomisel kasutage 0 või rohkem sõnu (tähti AZ и az ja numbrid 0-9), eraldatud punktiga, samuti sümbolid * и #.

  • * - saab täpselt asendada 1 sõna
  • # - saab asendada 0 või rohkem sõnu

Sõnumivoo graafiline esitus:

RabbitMQ. 2. osa. Vahetuste mõistmine

Alates versioonist RabbitMQ 2.4.0 marsruutimisalgoritm jaoks topic exchange alustas tööd kuni 145 korda kiiremini. Nad saavutasid selle lähenemisviisi rakendamisega proovi rakendamist, mis tähendab mallide esitamist puustruktuurina. Näiteks mallid a.b.c, a.*.b.c, a.#.c и b.b.c on esindatud järgmise struktuuriga:

RabbitMQ. 2. osa. Vahetuste mõistmine

Mustri sobivust otsitakse alustades juurest ja liikudes ülevalt alla.

Omadused:

  • selle soojusvaheti kasutamine võib muutuda hea valik võimalikuks tulevaseks rakenduste arendamiseks, sest malle saab alati kohandada nii, et sõnum avaldatakse sarnaselt direct exchange või fanout exchange
  • kasutatavad mallid * palju kiireminikui kasutatavad mallid #.
  • topic exchange aeglasemalt direct exchange

Fanout Exchange

Fanout exchange - kõik sõnumid toimetatakse kõikidesse järjekordadesse isegi kui sõnumis on määratud marsruutimisvõti.

Omadused:

  • RabbitMQ ei tööta marsruutimisvõtmete ja mallidega millel on positiivne mõju sooritusvõimele. See on kiireim exchange;
  • kõik tarbijad peavad saama kõiki sõnumeid töödelda;

Sõnumivoo graafiline esitus:

RabbitMQ. 2. osa. Vahetuste mõistmine

Päiste vahetus

Headers exchange - suunab teated (võti, väärtus) omaduste paaride võrdluse alusel seotud järjekordadesse headers siduv ja sarnane sõnumi omadus. headers on a Dictionary<ключ, значение>.

Kui lisate sõnastikku spetsiaalse võtme x-match tähendusega any, siis sõnum suunatakse, kui paarid (võti, väärtus) osaliselt kattuvad. See käitumine sarnaneb operaatori käitumisega or.

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

Vaikevõti x-match sisaldab väärtust all. See tähendab, et sõnum suunatakse siis, kui paarid (võti, väärtus) kattuvad täielikult. See käitumine sarnaneb operaatori käitumisega and.

Sõnumivoo graafiline esitus:

RabbitMQ. 2. osa. Vahetuste mõistmine

Omadused:

  • täiendav paindlikkus
  • täiendavad arvutuskulud. Kõik atribuudi paarid (võti, väärtus). headers enne sõnumite suunamise väärtuste arvutamist tuleb sortida võtme nime järgi. Aeglasem kui muud tüüpi vahetus.

Järjepidev räsivahetus

See soojusvaheti on sisse panema и ei ole sisse ehitatud в RabbitMQ.

Consistent-hashing exchange (räsijärjekindel vahetus) – kasutatakse juhul, kui sõnumi potentsiaalseteks adressaatideks on mitu järjekorda ja kui peate nende vahel laadima tasakaalu. Sõnum on järjekorraga seotud kaalu järgi (tingimuslik stringi väärtus alates 0 - n).

Järjekordade samaväärne kaal – näitab, et iga järjekord saab umbes sama palju sõnumid (iga sõnum pannakse ainult ühte järjekorda). Sõnumite ühtlase levitamise täielikku garantiid ei ole.

Sõnumivoo graafiline esitus:

RabbitMQ. 2. osa. Vahetuste mõistmine

Hash arvutatakse marsruutimisvõtme või atribuudi põhjal headers sõnumid. Kui kõigil avaldatud sõnumitel olid erinevad marsruutimisvõtmed või headers, siis toimub jaotus kaalu järgi. Vastasel juhul kasutatakse marsruutimisvõtit või headers.

Peaks aitama, kui tarbija läbilaskevõime peab kasvama kõrgemaks kui lahendus, kus sama järjekorda kasutab mitu tarbijat.

Vahetajate kombinatsioon (E2E)

Kõigi soojusvahetite käitumist saab kombineerida kasutades sidet Vahetusest vahetusse (vahetite kombinatsioon ei sisaldu spetsifikatsioonis AMQP. See on protokolli laiendus küljelt RabbitMQ).

Sõnumivoo graafiline esitus:

RabbitMQ. 2. osa. Vahetuste mõistmine

Kulul E2E leiame õige skaleeritava konfiguratsiooni, mis vastab nii praegustele kui ka kasvavatele nõuetele.

Looge Exchange

Vaheti luuakse sünkroonse RPC päring serverile. Taotlus esitatakse meetodil Exchange.Declarekutsutakse parameetritega:

  • vahetaja nimi
  • soojusvaheti tüüp
  • muud võimalused

Loomise näide exchange abil RabbitMQ.Client:

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

  • exchange — soojusvaheti nimi, mille tahame luua. Nimi peab olema kordumatu
  • type - soojusvaheti tüüp
  • durable - kui see on paigaldatud truesiis exchange saab olema alaline. See salvestatakse kettale ja suudab serveri/maakleri taaskäivitamise üle elada. Kui väärtus falsesiis exchange on ajutine ja eemaldatakse serveri/maakleri taaskäivitamisel
  • autoDelete - automaatne kustutamine. Exchange kustutatakse, kui kõik seotud järjekorrad on kustutatud
  • arguments on valikulised argumendid. Kõige sagedamini seatud argumentide kaudu alternative exchange (alternatiivne soojusvaheti). Kui teade ei saa algset marsruuti läbida, saab selle saata alternatiivsele vahetusele, et suunata see teist teed pidi.

RabbitMQ. 2. osa. Vahetuste mõistmine

Kui looming exchange ehk, siis saadab server kliendile sünkroonse RPC vastus Exchange.DeclareOk. Kui looming on võimatu (taotlus lükati tagasi Exchange.Declare) kanal suletakse server, kasutades asünkroonset käsku Channel.Close ja klient saab erandi OperationInterruptedException, mis sisaldab veakoodi ja selle kirjeldust.

Enne postitamist tuleb luua soojusvaheti. Kui avaldate sõnumi mõnele olematule soojusvahetile - RabbitMQ vaikselt eemaldage see.

Looge Exchange'i GUI

Minge administraatori paneelile RabbitMQ kasutaja all guest (kasutajanimi: guest ja parool: guest). Pange tähele, et kasutaja guest saab ühenduse luua ainult kohalikust hostist. Nüüd läheme vahekaardile Exchanges ja klõpsake edasi Add a new exchange. Täitke omadused:

RabbitMQ. 2. osa. Vahetuste mõistmine

Enamikku omadusi on kirjeldatud eespool. Siin märgime, et kui seame Internal, siis saab vahetust kasutada ainult E2E. Producer ei saa sellisele vahetusele sõnumeid saata.

Järeldus

Süsteemi arendamisel on mugav topoloogiat kirjeldada marsruutimine kasutades graafikut. Kuid enne graafiku koostamist tasub esile tõsta suure liiklusega rajad, sest. nad nõuavad suurem läbilaskevõime (etendus). Järgmisena saate liiklust klassifitseerida. Ja siis hakka ehitama.

Kui konstrueeritud graafikus on olemas lõplik kogum siis tasub vaadata mitme poole fanout exchange, mis on 1:1 seotud marsruutimisvõtmega. Mäleta seda fanout exchange kiireim.

Kui marsruutide arv kipub lõpmatuseni, tasub sellele tähelepanu pöörata topic exchange või kui malli pole vaja, saate valida direct exchnge, sest ta on kiirem topic exchange.

Erinevate kombinatsioonid exchange peaks aitama teil seda õiget leida. skaleeritav konfiguratsioon, mis vastab nii praegustele kui ka kasvavatele süsteeminõuetele.

Kogus exchange ja järjekorrad peaksid olema minimaalsed võrreldes liinide arvuga.

Järgmises artiklis hakkame järjekordade ja sidumiste kohta rohkem aru saama.

Viited

Allikas: www.habr.com

Lisa kommentaar