Apmaiņa — apmaiņas punkts vai mezgls. Tajā tiek nosūtītas ziņas. Apmaiņa izdala ziņu vienā vai vairākās rindās. Tas maršrutē ziņas rindā balstoties uz izveidotajām saitēm (bindings) starp to un rindu.
Apmaiņa nav . No mērogojamības apsvērumiem apmaiņa — tas ir virkne (saite uz moduļu kodu, kur atrodas maršrutēšanas loģika) iebūvētajā datu bāzē . 1 tūkstotis apmaiņas punktu patērēs tikai 1 MB atmiņas.
Saturs
- RabbitMQ. 3. daļa. Apskatām Rindas un Bindings
- RabbitMQ. 4. daļa. Apskatām, kas ir ziņas un ietvari
- RabbitMQ. 5. daļa. Ziņu publicēšanas un patēriņa veiktspēja
- RabbitMQ. 6. daļa. Moduļu Federation un Shovel pārskats
- RabbitMQ. 7. daļa. Detalizēti par Savienojumu un Kanalizāciju
- RabbitMQ. 8. daļa. RabbitMQ .NET vidē
- RabbitMQ. 9. daļa. Uzraudzība
Tiešā apmaiņa
Tiešā apmaiņa — tiek izmantota, kad nepieciešams nogādāt ziņu noteiktās rindās. Ziņa tiek publicēta apmaiņas punktā ar noteiktu maršrutēšanas atslēgu un nokļūst visās rindās, kas ir saistītas ar šo apmaiņas punktu ar tādu pašu maršrutēšanas atslēgu. Maršrutēšanas atslēga — tā ir virkne. Atbilstības meklēšana tiek veikta, salīdzinot virknes par vienādībām.
Grafisks ziņu plūsmas attēlojums:

No rabbitmq pastāv jēdziens noklusējuma apmaiņas punkts. Tas tiešā apmaiņa bez nosaukuma. Ja tiek izmantots noklusējuma apmaiņas punkts, tad ziņa tiks maršrutēta rindā ar nosaukumu, kas ir vienāds ar ziņas maršrutēšanas atslēgu.
Tematiskā apmaiņa
Tematiskā apmaiņa – līdzīgi tiešā apmaiņa nodrošina iespēju veikt izvēles maršrutēšanu, salīdzinot maršrutēšanas atslēgu. Bet šajā gadījumā atslēga tiek noteikta pēc šablona. Izveidojot šablonu, tiek izmantoti 0 vai vairāki vārdi (burti AZ un az un cipari 0-9), atdalīti ar punktu, kā arī simboli * un #.
*— var tikt aizvietoti ar precīzi1vārds#— var tikt aizvietoti ar0vai vairākiem vārdiem
Grafisks ziņu plūsmas attēlojums:

Sākot ar versiju RabbitMQ 2.4.0 maršrutēšanas algoritms tematiskiem tematiskās apmaiņas sāka darboties līdz 145 reizes ātrāk. Viņi to sasniedza, ieviešot pieeju , kas paredz šablonu pārstāvniecību koka struktūrā. Piemēram, šabloni a.b.c, a.*.b.c, a.#.c un b.b.c tiks attēloti šādā struktūrā:

Atbilstības meklēšana šablonam notiek sākot no saknes un sekojot no augšas uz apakšu.
Īpašības:
- šīs apmaiņas izmantošana var kļūt labs ceramica nākotnes attīstībai, jo veidnes vienmēr var pielāgot, lai ziņojums būtu publicēts līdzīgi
tiešā apmaiņavaifanout apmaiņa - veidnes, kuras izmanto
*daudz ātrāk, nekā veidnes, kuras izmanto#. tematiskās apmaiņaslēnāktiešā apmaiņa
Fanout apmaiņa
Fanout apmaiņa – visi ziņojumi tiek piegādāti visās rindās pat ja ziņojumam ir iestatīts maršrutēšanas atslēga.
Īpašības:
RabbitMQneeikpat ar maršrutēšanas atslēgām un veidnēm kas pozitīvi ietekmē veiktspēju. Tas ir ātrākaisapmaiņa;- visi patērētājiem jāspēj apstrādāt visus ziņojumus;
Grafisks ziņu plūsmas attēlojums:

Headers apmaiņa
Headers apmaiņa – nosūta ziņojumus saistītajām rindām, pamatojoties uz pāru (atslēga, vērtība) īpašību salīdzināšanu headers saistīšanu un ziņojuma līdzīgu īpašību. headers ir Dictionary<atslēga, vērtība>.
Ja vārdnīcā pievieno īpašu atslēgu x-match ar vērtību any, tad ziņojums tiek maršrutēts, ja ir daļēja atbilstība pāriem (atslēga, vērtība). Šī 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, ja pāriem ir pilna atbilstība (atslēga, vērtība). Šī uzvedība ir līdzīga operatoram un.
Grafisks ziņu plūsmas attēlojums:

Īpašības:
- papildu elastīgums
- papildu aprēķinu izdevumi. Visām (atslēga, vērtība) atribūtu pāriem
headersjābūt sakārtotiem pēc atslēgas vārda pirms maršrutēšanas vērtību aprēķināšanas. Lēnāk nekā citi apmaiņas veidi.
Consistent-Hashing Exchange
Šī apmaiņa ir un nav iebūvēta par RabbitMQ.
Consistent-hashing exchange (apmaiņa ar saskaņotu hashēšanu) – tiek izmantota, kad ir vairāki rindas, kas ir potenciālie ziņojuma saņēmēji, un ir nepieciešams līdzsvarot slodzi starp tām. Ziņojuma saistīšana ar rindu notiek pēc svara (nosacījuma virknes vērtības no 0 - n).
Vienādu rindu svars nozīmē, ka katrā rindā nonāks aptuveni vienāds skaits ziņojumu (katrs ziņojums tiks ievietots tikai vienā rindā). Nav pilnīgas garantijas, ka ziņojumi tiks sadalīti vienmērīgi.
Grafisks ziņu plūsmas attēlojums:

Hash tiek aprēķināts, pamatojoties uz maršrutēšanas atslēgu vai headers ziņojuma īpašību. Ja visi publicētie ziņojumi ir ar dažādām maršrutēšanas atslēgām vai headers, tad sadalījums notiks pēc svara. Pretējā gadījumā tiks izmantota maršrutēšanas atslēga vai headers.
Jāpalīdz, kad patērētāja caurlaidspējai ir nepieciešama palielināšana, kas pārsniedz risinājumu ar vairākiem patērētājiem, kas izmanto vienu rindu.
Apmaiņas starp apmaiņām (E2E)
Visu apmaiņu uzvedību var kombinēt, izmantojot saites Exchange-to-Exchange (apmaiņas kombinēšana nav iekļauta specifikācijā AMQP. Tas ir protokola paplašinājums no puses RabbitMQ).
Grafisks ziņu plūsmas attēlojums:

Izmantojot E2E mēs varam atrast pareizu mērogojamo konfigurāciju, kas atbilst gan pašreizējiem, gan pieaugošajiem prasībām.
Apmaiņas izveide
Apmaiņas izveide notiek, izmantojot sinhrono RPC prasību uz serveri. Pieprasījums tiek izpildīts, izmantojot metodi Exchange.Declare, kas izsaukta ar parametriem:
- apmaiņas nosaukums
- apmaiņas veids
- citi parametri
Piemērs izveidošanai apmaiņa izmantojot :
//...
channel.ExchangeDeclare(
exchange: "my_exchange",
type: "direct",
durable: "false",
autoDelete: "false",
arguments: null
);
//...apmaiņa— apmaiņas nosaukums, ko mēs vēlamies izveidot. Nosaukumam jābūt unikālamtype— apmaiņas veidsdurable— ja iestatītstrue, tadapmaiņabūs pastāvīgs. Tas tiks saglabāts diskā un varēs izdzīvot servera/brokeru restartu. Ja vērtībafalse, tadapmaiņair pagaidu un tiks dzēsta, kad serveris/brokers tiks restartētsautoDelete— automātiskā dzēšana.Apmaiņatiks dzēsts, kad visās ar to saistītajās rindās tiek dzēstas.arguments— opcijas argumenti. Visbiežāk, caur argumentiem norādaalternative exchange(alternatīvo apmaiņu). Ja ziņojums nevar iziet pa sākotnējo maršrutu, to var nosūtīt uz alternatīvo apmaiņu, lai maršrutētu pa citu ceļu.

Ja izveide apmaiņa ir iespējama, tad serveris nosūtīs klientam sinhronu RPC atbildi Exchange.DeclareOk. Ja izveide nav iespējama (notika atteikums pieprasījumam Exchange.Declare), tad kanāls tiks aizvērts servera ar asinkrono komandu Channel.Close un klients saņems izņēmumu , kas saturīs kļūdas kodu un tās aprakstu.
Apmaiņas jāizveido pirms ziņojumu publicēšanas. Ja publicēsiet ziņojumu neesošā apmaiņā — RabbitMQ tā kā tas tiks klusi dzēsts.
Apmaiņas izveide caur grafisko interfeisu
Ieejam administrācijas panelī RabbitMQ zem lietotāja guest (lietotājvārds: guest un parole: guest). Ņemiet vērā, ka lietotājs guest var pieslēgties tikai no lokālā hosta. Tagad pāriesim uz cilni Exchanges un noklikšķināsim uz Add a new exchange. Aizpildām īpašības:

Lielākā daļa īpašību tika aprakstītas iepriekš. Šeit pieminēsim, ka, ja norādīsiet Iekšējais, tad apmaiņu varēs izmantot tikai E2E. Ražotājs nenokļūs šādā apmaiņā.
Secinājums
Izstrādājot sistēmu, ir ērti aprakstīt topoloģiju, izmantojot grafu. Bet pirms sākt veidot grafu, ir vērts izdalīt ceļus ar lielu datu plūsmu, jo tie tieši prasa augstāku caurlaidspēju (veiktspēju). Pēc tam var klasificēt datu plūsmu. Un tikai tad uzsākt būvēšanu.
Ja izveidotajā grafikā pastāv galīgs kopa maršrutēšanas atslēgu, tad vērts aplūkot dažus fanout apmaiņa, kas ir 1:1 saistīti ar maršrutēšanas atslēgu. Atceramies, ka fanout apmaiņa tas ir ātrākais.
Ja maršrutu skaits tuvojas bezgalībai, tad vērts pievērsties tematiskās apmaiņas vai, ja modelis nav vajadzīgs, var izvēlēties tiešo apmaiņu, jo tas ir ātrāk tematiskās apmaiņas.
Dažādu apmaiņa kombinācija palīdzēs atrast pareizo skalojamo konfigurāciju, kas apmierina gan pašreizējās, gan augošās sistēmas prasības.
Skaits apmaiņa un rindām jābūt minimālai salīdzinājumā ar maršrutu skaitu.
Nākamajā rakstā sāksim sīkāk izpētīt Queues un Bindings.
Saites
Avots: habr.com
