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