RabbitMQ. 2. daļa. Apskatām Exchanges

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 Erlang procesā. 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ē mnesia. 1 tūkstotis apmaiņas punktu patērēs tikai 1 MB atmiņas.

Saturs

  • RabbitMQ. 1. daļa. Ievads. Erlang, AMQP un RPC
  • RabbitMQ. 2. daļa. Apskatām Exchanges
  • 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:

RabbitMQ. 2. daļa. Apskatām Exchanges

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īzi 1 vārds
  • # — var tikt aizvietoti ar 0 vai vairākiem vārdiem

Grafisks ziņu plūsmas attēlojums:

RabbitMQ. 2. daļa. Apskatām Exchanges

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 trie implementation, 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ā:

RabbitMQ. 2. daļa. Apskatām Exchanges

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ņa vai fanout apmaiņa
  • veidnes, kuras izmanto * daudz ātrāk, nekā veidnes, kuras izmanto #.
  • tematiskās apmaiņas lēnāk tiešā 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:

  • RabbitMQ neeikpat ar maršrutēšanas atslēgām un veidnēm kas pozitīvi ietekmē veiktspēju. Tas ir ātrākais apmaiņa;
  • visi patērētājiem jāspēj apstrādāt visus ziņojumus;

Grafisks ziņu plūsmas attēlojums:

RabbitMQ. 2. daļa. Apskatām Exchanges

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:

RabbitMQ. 2. daļa. Apskatām Exchanges

Īpašības:

  • papildu elastīgums
  • papildu aprēķinu izdevumi. Visām (atslēga, vērtība) atribūtu pāriem headers jā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 piegāde 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:

RabbitMQ. 2. daļa. Apskatām Exchanges

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:

RabbitMQ. 2. daļa. Apskatām Exchanges

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 RabbitMQ.Client:

//...
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ālam
  • type — apmaiņas veids
  • durable — ja iestatīts true, tad apmaiņa būs pastāvīgs. Tas tiks saglabāts diskā un varēs izdzīvot servera/brokeru restartu. Ja vērtība false, tad apmaiņa ir pagaidu un tiks dzēsta, kad serveris/brokers tiks restartēts
  • autoDelete — automātiskā dzēšana. Apmaiņa tiks dzēsts, kad visās ar to saistītajās rindās tiek dzēstas.
  • arguments — opcijas argumenti. Visbiežāk, caur argumentiem norāda alternative 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.

RabbitMQ. 2. daļa. Apskatām Exchanges

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 OperationInterruptedException, 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:

RabbitMQ. 2. daļa. Apskatām Exchanges

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 maršrutēšanas 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

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster