RabbitMQ. 2. daļa. Izpratne par apmaiņām

Exchange - siltummainis vai maiņas punkts. Uz to tiek nosÅ«tÄ«tas ziņas. Exchange izplata ziņu vienā vai vairākās rindās. ViņŔ marÅ”rutē ziņojumus uz rindu pamatojoties uz izveidotajām saitēm (bindings) starp to un rindu.

Exchange nav Erlang process. MērogojamÄ«bas dēļ exchange ir virkne (saite uz moduli ar kodu, kurā atrodas marÅ”rutēŔanas loÄ£ika) iebÅ«vētajā datu bāzē mnēzija. 1 tÅ«kstotis siltummaiņu patērēs tikai 1 MB atmiņas.

Satura

  • RabbitMQ. 1. daļa. Ievads. Erlang, AMQP un RPC
  • RabbitMQ. 2. daļa. Izpratne par apmaiņām
  • RabbitMQ. 3. daļa. Izpratne par rindām un saistÄ«jumiem
  • RabbitMQ. 4. daļa. Darbs ar to, kas ir ziņojumi un rāmji
  • RabbitMQ. 5. daļa: Ziņojumu publicēŔana un izmantoÅ”ana
  • RabbitMQ. 6. daļa. Federācijas un lāpstas moduļu pārskats
  • RabbitMQ. 7. daļa. SÄ«kāka informācija par savienojumu un Chanel
  • RabbitMQ. 8. daļa. RabbitMQ .NET
  • RabbitMQ. 9. daļa. UzraudzÄ«ba

TieŔā apmaiņa

Direct exchange - izmanto, kad nepiecieÅ”ams nosÅ«tÄ«t ziņojumu noteiktām rindām. Ziņa tiek publicēta apmainÄ«tājam ar konkrētu marÅ”rutēŔanas atslēga un nokļūst visās rindās, kas ir saistÄ«tas ar Å”o apmainÄ«tāju ar lÄ«dzÄ«gu marÅ”rutēŔanas atslēgu. MarÅ”rutēŔanas atslēga ir virkne. SaskaņoÅ”ana tiek veikta, izmantojot virkņu vienlÄ«dzÄ«bas pārbaude.

Ziņojumu plūsmas grafisks attēlojums:

RabbitMQ. 2. daļa. Izpratne par apmaiņām

Š’ rabbitmq ir koncepcija noklusējuma siltummainis. Tā direct exchange nav vārda. Ja tiek izmantots noklusējuma apmainÄ«tājs, ziņojums tiks novirzÄ«ts uz rindu, kuras nosaukums ir vienāds ar ziņojumu marÅ”rutēŔanas atslēga.

Tēmu apmaiņa

Topic exchange - lÄ«dzÄ«gs direct exchange iespējo selektÄ«vu marÅ”rutēŔanu, salÄ«dzinot marÅ”rutēŔanas atslēgu. Bet Å”ajā gadÄ«jumā atslēga tiek dota pēc veidnes. Veidojot veidni, izmantojiet 0 vai vairāk vārdu (burti AZ Šø az un cipariem 0-9), atdalÄ«tas ar punktu, kā arÄ« simboliem * Šø #.

  • * - var aizstāt ar precÄ«zi 1 vārds
  • # - var aizstāt ar 0 vai vairāk vārdu

Ziņojumu plūsmas grafisks attēlojums:

RabbitMQ. 2. daļa. Izpratne par apmaiņām

Sākot no versijas RabbitMQ 2.4.0 marÅ”rutēŔanas algoritms topic exchange sāka strādāt lÄ«dz 145 reizes ātrāk. Viņi to panāca, ievieÅ”ot Å”o pieeju mēģiniet ieviest, kas nozÄ«mē veidņu attēloÅ”anu kā koka struktÅ«ru. Piemēram, veidnes a.b.c, a.*.b.c, a.#.c Šø b.b.c tiks attēlots ar Ŕādu struktÅ«ru:

RabbitMQ. 2. daļa. Izpratne par apmaiņām

Modeļa atbilstÄ«ba tiek meklēta, sākot no saknes un virzoties no augÅ”as uz leju.

Iezīmes:

  • Ŕī siltummaiņa izmantoÅ”ana var kļūt laba izvēle iespējamai turpmākai lietotņu izstrādei, jo veidnes vienmēr var pielāgot, lai ziņojums tiktu publicēts lÄ«dzÄ«gi direct exchange vai fanout exchange
  • izmantotās veidnes * daudz ātrāknekā izmantotās veidnes #.
  • topic exchange lēnāk direct exchange

Fanout Exchange

Fanout exchange - visi ziņojumi tiek piegādāti uz visām rindām pat ja ziņojumā ir norādÄ«ta marÅ”rutēŔanas atslēga.

Iezīmes:

  • RabbitMQ nedarbojas ar marÅ”rutēŔanas taustiņiem un veidnēm kas pozitÄ«vi ietekmē sniegumu. Å is ir ātrākais exchange;
  • visiem patērētājiem jāspēj apstrādāt visus ziņojumus;

Ziņojumu plūsmas grafisks attēlojums:

RabbitMQ. 2. daļa. Izpratne par apmaiņām

Virsrakstu apmaiņa

Headers exchange - novirza ziņojumus uz saistÄ«tām rindām, pamatojoties uz (atslēgas, vērtÄ«bas) rekvizÄ«tu pāru salÄ«dzinājumu headers saistoÅ”s un lÄ«dzÄ«gs ziņojuma Ä«paÅ”ums. headers ir a Dictionary<ŠŗŠ»ŃŽŃ‡, значение>.

Ja vārdnÄ«cai pievienojat Ä«paÅ”u atslēgu x-match ar nozÄ«mi any, tad ziņojums tiek marÅ”rutēts, ja pāri (atslēga, vērtÄ«ba) daļēji sakrÄ«t. Å Ä« uzvedÄ«ba ir lÄ«dzÄ«ga operatoram or.

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

Noklusējuma atslēga x-match satur vērtÄ«bu all. Tas nozÄ«mē, ka ziņojums tiek marÅ”rutēts, kad pāri (atslēga, vērtÄ«ba) pilnÄ«bā sakrÄ«t. Å Ä« uzvedÄ«ba ir lÄ«dzÄ«ga operatoram and.

Ziņojumu plūsmas grafisks attēlojums:

RabbitMQ. 2. daļa. Izpratne par apmaiņām

Iezīmes:

  • papildu elastÄ«ba
  • papildu skaitļoÅ”anas izmaksas. Visi atribÅ«ta pāri (atslēga, vērtÄ«ba). headers pirms ziņojumu marÅ”rutēŔanas vērtÄ«bu aprēķināŔanas ir jāsakārto pēc atslēgas nosaukuma. Lēnāk nekā citi apmaiņas veidi.

Konsekventa jaukÅ”anas apmaiņa

Å is siltummainis ir iespraust Šø nav iebÅ«vēts в RabbitMQ.

Consistent-hashing exchange (jaukÅ”anas konsekventa apmaiņa) — tiek izmantota, ja ir vairākas rindas, kas ir potenciālie ziņojuma adresāti, un ja nepiecieÅ”ams slodzes lÄ«dzsvars starp tām. Ziņojums ir saistÄ«ts ar rindu pēc svara (nosacÄ«juma virknes vērtÄ«ba no 0 - n).

Ekvivalents rindu svars - norāda, ka katra rinda saņems apmēram tikpat daudz ziņas (katrs ziņojums tiks ievietots tikai vienā rindā). Nav pilnÄ«gas garantijas vienveidÄ«gai ziņojumu izplatīŔanai.

Ziņojumu plūsmas grafisks attēlojums:

RabbitMQ. 2. daļa. Izpratne par apmaiņām

Hash aprēķināts, pamatojoties uz marÅ”rutēŔanas atslēgu vai rekvizÄ«tu headers ziņas. Ja visiem publicētajiem ziņojumiem bija atŔķirÄ«gas marÅ”rutēŔanas atslēgas, vai headers, tad sadalÄ«jums notiks pēc svara. Pretējā gadÄ«jumā tiks izmantota marÅ”rutēŔanas atslēga vai headers.

PalÄ«dzēs gadÄ«jumos, kad patērētāju caurlaidspējai ir jāpalielina nekā risinājumam, kurā vairāki patērētāji izmanto vienu un to paÅ”u rindu.

Apmainītāju kombinācija (E2E)

Visu siltummaiņu uzvedÄ«bu var apvienot, izmantojot komunikāciju Maiņa pret apmaiņu (apmainÄ«tāju kombinācija nav iekļauta specifikācijā AMQP. Å is ir protokola paplaÅ”inājums no sāniem RabbitMQ).

Ziņojumu plūsmas grafisks attēlojums:

RabbitMQ. 2. daļa. Izpratne par apmaiņām

Uz rēķina E2E mēs varam atrast pareizo mērogojamo konfigurāciju, kas atbilst gan paÅ”reizējām, gan augoÅ”ajām prasÄ«bām.

Izveidojiet apmaiņu

Siltummainis tiek izveidots, izmantojot sinhrono RPC pieprasījums serverim. Pieprasījums tiek veikts, izmantojot metodi Exchange.Declare, ko sauc ar parametriem:

  • apmainÄ«tāja nosaukums
  • siltummaiņa tips
  • citas iespējas

RadīŔanas piemērs exchange ar RabbitMQ.Client:

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

  • exchange - apmainÄ«tāja nosaukums, kuru vēlamies izveidot. Nosaukumam ir jābÅ«t unikālam
  • type - siltummaiņa veids
  • durable - ja ir uzstādÄ«ts truetad exchange bÅ«s pastāvÄ«ga. Tas tiks saglabāts diskā un spēs izturēt servera/brokera restartēŔanu. Ja vērtÄ«ba falsetad exchange ir Ä«slaicÄ«gs un tiks noņemts, kad serveris/brokeris tiks restartēts
  • autoDelete - automātiska dzēŔana. Exchange tiks dzēsts, kad tiks dzēstas visas saistÄ«tās rindas
  • arguments ir izvēles argumenti. Visbiežāk, izmantojot izvirzÄ«tos argumentus alternative exchange (alternatÄ«vais siltummainis). Ja ziņojums nevar iziet pa sākotnējo marÅ”rutu, to var nosÅ«tÄ«t uz alternatÄ«vu apmaiņas centru, lai to novirzÄ«tu pa citu ceļu.

RabbitMQ. 2. daļa. Izpratne par apmaiņām

Ja radīŔana exchange varbÅ«t, tad serveris nosÅ«tÄ«s klientam sinhronu RPC atbildēt Exchange.DeclareOk. Ja radīŔana nav iespējams (pieprasÄ«jums tika noraidÄ«ts Exchange.Declare), tad kanāls tiks aizvērts serveris, izmantojot asinhronu komandu Channel.Close un klients saņems izņēmumu OperationInterruptedException, kurā bÅ«s kļūdas kods un tā apraksts.

Pirms ievietoÅ”anas ir jāizveido siltummainis. Ja publicējat ziņojumu kādam neeksistējoÅ”am apmainÄ«tājam - RabbitMQ klusi noņemiet to.

Izveidojiet Exchange GUI

Dodieties uz admin paneli RabbitMQ zem lietotāja guest (lietotājvārds: guest un parole: guest). LÅ«dzu, ņemiet vērā, ka lietotājs guest var izveidot savienojumu tikai no localhost. Tagad pāriesim uz cilni Exchanges un noklikŔķiniet uz Add a new exchange. Aizpildiet rekvizÄ«tus:

RabbitMQ. 2. daļa. Izpratne par apmaiņām

Lielākā daļa Ä«paŔību ir aprakstÄ«tas iepriekÅ”. Å eit mēs atzÄ«mējam, ka, ja mēs iestatām Internal, tad apmaiņu var izmantot tikai priekÅ” E2E. Producer nevarēs nosÅ«tÄ«t ziņojumus uz Ŕādu apmaiņu.

Secinājums

Izstrādājot sistēmu, ir ērti aprakstÄ«t topoloÄ£iju marÅ”rutēŔana izmantojot grafiku. Bet pirms sākt veidot grafiku, ir vērts izcelt ceļus ar lielu satiksmi, jo. viņi pieprasa lielāka caurlaidspēja (performance). Tālāk varat klasificēt satiksmi. Un tad sāc bÅ«vēt.

Ja konstruētajā grafikā eksistē ierobežots kopums marÅ”rutēŔanas atslēgas, tad ir vērts skatÄ«ties uz vairākiem fanout exchange, kas ir 1:1 saistÄ«ti ar marÅ”rutēŔanas atslēgu. Atcerieties, ka fanout exchange ātrākais.

Ja marÅ”rutu skaits tiecas uz bezgalÄ«bu, ir vērts pievērst uzmanÄ«bu topic exchange vai, ja veidne nav vajadzÄ«ga, tad varat izvēlēties direct exchnge, jo viņŔ ir ātrāks topic exchange.

Dažādu kombinācijas exchange vajadzētu palÄ«dzēt jums atrast pareizo. mērogojama konfigurācija, kas atbilst gan paÅ”reizējām, gan augoÅ”ajām sistēmas prasÄ«bām.

Skaits exchange un rindām jābūt minimālām, salīdzinot ar marŔrutu skaitu.

Nākamajā rakstā mēs sāksim saprast vairāk par rindām un saitēm.

atsauces

Avots: www.habr.com

Pievieno komentāru