KunikloMQ. Parto 2. Kompreni Interŝanĝojn

Exchange - interŝanĝilo aŭ interŝanĝpunkto. Mesaĝoj estas sendataj al ĝi. Exchange distribuas la mesaĝon en unu aŭ pluraj vicoj. Li direktas mesaĝojn al atendovico surbaze de kreitaj ligiloj (bindings) inter ĝi kaj la vico.

Exchange ne estas Erlang-procezo. Pro kialoj de skaleblo exchange estas ĉeno (ligilo al la modulo kun la kodo kie la enruta logiko estas) en la enigita datumbazo mnezio. 1 mil interŝanĝiloj konsumos nur 1MB da memoro.

Enhavtabelo

Rekta Interŝanĝo

Direct exchange - uzata kiam bezonate liveri mesaĝon al specifaj atendovicoj. La mesaĝo estas publikigita al la interŝanĝanto kun specifa vojŝlosilo kaj eniras ĉiujn atendovicojn kiuj estas asociitaj kun ĉi tiu interŝanĝilo kun simila vojŝlosilo. La vojŝlosilo estas ŝnuro. Kongruo estas farita uzante kontrolante ŝnurojn por egaleco.

Grafika reprezentado de la mesaĝfluo:

KunikloMQ. Parto 2. Kompreni Interŝanĝojn

В rabbitmq estas koncepto defaŭlta interŝanĝilo. Ĉi direct exchange neniu nomo. Se la defaŭlta interŝanĝilo estas uzata, tiam la mesaĝo estos sendita al vosto kun nomo egala al mesaĝo-vojigo ŝlosilo.

Temo-Interŝanĝo

Topic exchange – simile direct exchange ebligas selekteman vojigon komparante la vojigŝlosilon. Sed, en ĉi tiu kazo, la ŝlosilo estas donita per ŝablono. Kiam vi kreas ŝablonon, uzu 0 aŭ pli da vortoj (literoj AZ и az kaj nombroj 0-9), apartigitaj per punkto, same kiel simboloj * и #.

  • * - povas esti anstataŭigita per ekzakte 1 la vorto
  • # - povas esti anstataŭigita per 0 aŭ pli da vortoj

Grafika reprezentado de la mesaĝfluo:

KunikloMQ. Parto 2. Kompreni Interŝanĝojn

Komencante de versio RabbitMQ 2.4.0 vojigo-algoritmo por topic exchange eklaboris ĝis 145 fojojn pli rapide. Ili atingis ĉi tion efektivigante la aliron provi efektivigon, kiu implicas la reprezentadon de ŝablonoj kiel arbstrukturo. Ekzemple ŝablonoj a.b.c, a.*.b.c, a.#.c и b.b.c estos reprezentita per la sekva strukturo:

KunikloMQ. Parto 2. Kompreni Interŝanĝojn

Ŝablona kongruo estas serĉata komencante de la radiko kaj irante de supre ĝis malsupre.

Elstaraĵoj

  • la uzo de ĉi tiu interŝanĝilo povas fariĝi bona elekto por ebla estonta ap-disvolviĝo, ĉar ŝablonoj ĉiam povas esti personecigitaj tiel ke la mesaĝo estas publikigita simile direct exchangefanout exchange
  • ŝablonoj kiuj uzas * multe pli rapideol ŝablonoj kiuj uzas #.
  • topic exchange pli malrapida direct exchange

Fanout Exchange

Fanout exchange - ĉiuj mesaĝoj estas liveritaj al ĉiuj atendovicoj eĉ se vojŝlosilo estas specifita en la mesaĝo.

Elstaraĵoj

  • RabbitMQ ne funkcias kun vojŝlosiloj kaj ŝablonoj kiu havas pozitivan efikon sur rendimento. Ĉi tio estas la plej rapida exchange;
  • ĉiuj konsumantoj devas povi prilabori ĉiujn mesaĝojn;

Grafika reprezentado de la mesaĝfluo:

KunikloMQ. Parto 2. Kompreni Interŝanĝojn

Kapoj Interŝanĝo

Headers exchange - direktas mesaĝojn al rilataj vostoj surbaze de komparo de paroj de (ŝlosilo, valoro) propraĵoj headers liga kaj simila mesaĝo propraĵo. headers estas a Dictionary<ключ, значение>.

Se vi aldonas specialan ŝlosilon al la vortaro x-match kun signifo any, tiam la mesaĝo estas direktita se la paroj (ŝlosilo, valoro) parte kongruas. Ĉi tiu konduto estas simila al la funkciigisto or.

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

Defaŭlta ŝlosilo x-match enhavas valoron all. Ĉi tio signifas, ke la mesaĝo estas sendita kiam la paroj (ŝlosilo, valoro) tute kongruas. Ĉi tiu konduto estas simila al la funkciigisto and.

Grafika reprezentado de la mesaĝfluo:

KunikloMQ. Parto 2. Kompreni Interŝanĝojn

Elstaraĵoj

  • plia fleksebleco
  • kroma komputa superkosto. Ĉiuj paroj (ŝlosilo, valoro) de la atributo headers devas esti ordigita laŭ ŝlosila nomo antaŭ ol kalkuli mesaĝajn vojvalorojn. Pli malrapida ol aliaj specoj de interŝanĝo.

Konsekvenca Hashing Exchange

Ĉi tiu interŝanĝilo estas konekti и ne enkonstruita в RabbitMQ.

Consistent-hashing exchange (hash-konsekvenca interŝanĝo) - uzata kiam ekzistas pluraj vicoj kiuj estas eblaj ricevantoj de mesaĝo kaj kiam vi bezonas ŝarĝi ekvilibron inter ili. La mesaĝo estas asociita kun la atendovico laŭ pezo (kondiĉa ĉenvaloro de 0 - n).

Ekvivalenta pezo de vostoj - indikas ke ĉiu vosto ricevos proksimume la sama kvanto mesaĝoj (ĉiu mesaĝo estos metita en nur unu vicon). Ne estas kompleta garantio pri unuforma distribuo de mesaĝoj.

Grafika reprezentado de la mesaĝfluo:

KunikloMQ. Parto 2. Kompreni Interŝanĝojn

Hash komputita surbaze de vojŝlosilo aŭ posedaĵo headers mesaĝojn. Se ĉiuj publikigitaj mesaĝoj havus malsamajn vojŝlosilojn, aŭ headers, tiam la distribuo okazos laŭ pezo. Alie, la vojŝlosilo estos uzata, aŭ headers.

Devus helpi kiam konsumanta trairo devas kreski pli alta ol solvo kun pluraj konsumantoj uzante la saman atendovico.

Kombinaĵo de interŝanĝiloj (E2E)

La konduto de ĉiuj interŝanĝiloj povas esti kombinita uzante komunikadon Interŝanĝo-al-Interŝanĝo (kombinaĵo de interŝanĝiloj ne estas inkluzivita en la specifo AMQP. Ĉi tio estas protokola etendo de la flanko RabbitMQ).

Grafika reprezentado de la mesaĝfluo:

KunikloMQ. Parto 2. Kompreni Interŝanĝojn

Koste de E2E ni povas trovi la ĝustan skaleblan agordon, kiu plenumas kaj nunajn kaj kreskantajn postulojn.

Kreu Interŝanĝon

La interŝanĝilo estas kreita uzante sinkronan RPC peto al la servilo. La peto estas farita per la metodo Exchange.Declare, vokita kun parametroj:

  • interŝanĝilo nomo
  • interŝanĝilo tipo
  • aliaj ebloj

Ekzemplo de kreado exchange kun la helpo RabbitMQ.Kliento:

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

  • exchange - la nomo de la interŝanĝilo, kiun ni volas krei. Nomo devas esti unika
  • type - speco de interŝanĝilo
  • durable - se instalite true, tiam exchange estos konstanta. Ĝi estos stokita sur disko kaj povos travivi servilo/makleristo rekomenco. Se la valoro false, tiam exchange estas provizora kaj estos forigita kiam la servilo/makleristo estas rekomencita
  • autoDelete - aŭtomata forigo. Exchange estos forigita kiam ĉiuj rilataj vostoj estas forigitaj
  • arguments estas nedevigaj argumentoj. Plej ofte, per la argumentoj fiksitaj alternative exchange (alternativa interŝanĝilo). Se mesaĝo ne povas trairi la originan itineron, ĝi povas esti sendita al alterna interŝanĝo por esti sendita laŭ malsama vojo.

KunikloMQ. Parto 2. Kompreni Interŝanĝojn

Se kreado exchange eble, tiam la servilo sendos al la kliento sinkronan RPC la respondo Exchange.DeclareOk. Se kreado estas neebla (estis rifuzo pri la peto Exchange.Declare), tiam la kanalo fermiĝos servilo uzante nesinkronan komandon Channel.Close kaj la kliento ricevos escepton OperationInterruptedException, kiu enhavos la erarkodon kaj ĝian priskribon.

Interŝanĝilo devas esti kreita antaŭ afiŝi. Se vi publikigas mesaĝon al iu neekzistanta interŝanĝilo - RabbitMQ silente forigu ĝin.

Krei Exchange GUI

Iru al la administra panelo RabbitMQ sub uzanto guest (uzantnomo: guest kaj pasvorto: guest). Bonvolu noti ke la uzanto guest povas nur konekti de loka gastiganto. Nun ni iru al la langeto Exchanges kaj klaku sur Add a new exchange. Plenigu la proprietojn:

KunikloMQ. Parto 2. Kompreni Interŝanĝojn

La plej multaj el la propraĵoj estis priskribitaj supre. Ĉi tie ni rimarkas, ke se ni starigas Internal, tiam la interŝanĝo povas esti uzata nur por E2E. Producer ne povos sendi mesaĝojn al tia interŝanĝo.

konkludo

Dum evoluigado de sistemo, estas oportune priskribi la topologion vojigo uzante grafeon. Sed antaŭ ol vi komencas konstrui grafeon, indas reliefigi la vojojn kun alta trafiko, ĉar. ili postulas pli alta trafluo (prezento). Poste, vi povas klasifiki la trafikon. Kaj tiam komencu konstrui.

Se en la konstruita grafeo ekzistas finia aro vojŝlosiloj, do, indas rigardi al pluraj fanout exchange, kiuj estas 1:1 rilataj al la vojŝlosilo. Memori tion fanout exchange la plej rapida.

Se la nombro da vojoj tendencas al senfineco, indas atenti topic exchange aŭ, se la ŝablono ne estas bezonata, tiam vi povas elekti direct exchnge, ĉar li estas pli rapida topic exchange.

Kombinoj de diversaj exchange devus helpi vin trovi la ĝustan. skalebla agordo, kiu renkontas kaj nunajn kaj kreskantajn sistemajn postulojn.

Nombro de exchange kaj vicoj devus esti minimumaj kompare kun la nombro da itineroj.

En la sekva artikolo, ni komencos kompreni pli pri Queues kaj Bindings.

referencoj

fonto: www.habr.com

Aldoni komenton