Exchange - siltummainis vai maiņas punkts. Uz to tiek nosūtītas ziņas. Exchangeizplata 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.
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 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:
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:
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
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:
RabbitMQnedarbojas 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:
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:
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:
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:
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:
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.
Ja radīšana exchangevarbū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:
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.