RabbitMQ. Del 2. Vi ser på Exchanges

Exchange — en udveksler eller udvekslingspunkt. Her sendes beskeder. Exchange fordeler besked til en eller flere køer. Den ruter beskeder til køen baseret på de oprettede forbindelser (bindings) mellem den og køen.

Exchange er ikke en Erlang-proces. Af skalerbarhedsmæssige årsager exchange — det er en streg (henvisning til modulet med koden, hvor routinglogikken er gemt) i den indbyggede database mnesia. 1 tusinde udvekslere vil kun bruge 1 MB hukommelse.

Indholdsfortegnelse

Direkte udveksling

Direkte udveksling — bruges, når man har brug for at levere beskeder til bestemte køer. Beskeden offentliggøres i en udveksler med en bestemt routing-nøgle og kommer ind i alle køer, der er forbundet til denne udveksler med den samme routing-nøgle. Routing-nøgle er en streng. Matchningen sker ved hjælp af stranglighedstjek.

Grafisk repræsentation af beskedstrømmen:

RabbitMQ. Del 2. Vi ser på Exchanges

I rabbitmq der findes et koncept standard udveksler. Dette er direkte udveksling uden navn. Hvis den standard udveksler anvendes, vil beskeden blive ruteret til en kø med navnet lig med routing-nøglen for beskeden.

Emneudveksling

Emneudveksling – på samme måde direkte udveksling giver mulighed for selektiv routing ved at sammenligne routing-nøglen. Men i dette tilfælde angives nøglen ved hjælp af et mønster. Når man opretter et mønster bruges 0 to eller flere ord (bogstaver AZ og az og cifre 0-9), adskilt med prikker, samt tegn * og #.

  • * — kan erstattes af præcist 1 ‘replica’ (for eksempel blev funktionen snd_ctl_add_slave() ændret til snd_ctl_add_replica()), hvilket førte til
  • # — kan erstattes af 0 eller flere ord

Grafisk repræsentation af beskedstrømmen:

RabbitMQ. Del 2. Vi ser på Exchanges

Fra version RabbitMQ 2.4.0 blev routingalgoritmen til emneudveksling hurtigere op til 145 mange gange. De opnåede dette ved at implementere tilgangen trie implementation, som indebærer at repræsentere mønstre som en træstruktur. For eksempel mønstre a.b.c, a.*.b.c, a.#.c og b.b.c vil blive repræsenteret med følgende struktur:

RabbitMQ. Del 2. Vi ser på Exchanges

Matchning mod mønstret sker fra roden og bevæger sig oppefra og nedad.

Egenskaber:

  • Anvendelse af denne udveksler kan være et godt valg for mulig fremtidig udvikling af applikationen, da mønstre altid kan tilpasses, så beskeden offentliggøres på samme måde som direkte udveksling eller fanout exchange
  • mønstre, der bruger * meget hurtigere, end mønstre, der bruger #.
  • emneudveksling langsommere direkte udveksling

Fanout Exchange

Fanout exchange – leverer alle beskeder til alle køer selv hvis en routing-nøgle er angivet i beskeden.

Egenskaber:

  • RabbitMQ fungerer ikke med routingnøgler og skabeloner der positivt påvirker ydeevnen. Dette er den hurtigste exchange;
  • alle forbrugere skal være i stand til at behandle alle meddelelser;

Grafisk repræsentation af beskedstrømmen:

RabbitMQ. Del 2. Vi ser på Exchanges

Headers Exchange

Headers exchange — dirigerer meddelelser til relaterede køer baseret på sammenligning af par (nøgle, værdi) egenskab headers bindinger og tilsvarende egenskab for meddelelsen. headers repræsenterer Dictionary.

Hvis der tilføjes en særlig nøgle til ordbogen x-match med værdien any, så dirigeres meddelelsen ved delvis overensstemmelse af par (nøgle, værdi). Denne opførsel svarer til operatoren eller.

var bindingArguments = new Dictionary();
bindingArguments.add("x-match", "any");

Som standard indeholder nøglen x-match værdien alle. Det betyder, at meddelelsen dirigeres ved fuld overensstemmelse af par (nøgle, værdi). Denne opførsel svarer til operatoren og.

Grafisk repræsentation af beskedstrømmen:

RabbitMQ. Del 2. Vi ser på Exchanges

Egenskaber:

  • ydelser
  • yderligere beregningsomkostninger. Alle par (nøgle, værdi) af attributten headers skal sorteres efter nøgle navn før beregning af routingværdierne for meddelelsen. Langsommere end andre typer af exchange.

Consistent-Hashing Exchange

Denne exchange er en plugin og ikke indbygget i RabbitMQ.

Consistent-hashing exchange (exchange med konsistent hashing) – bruges, når der er flere køer, der er potentielle modtagere af meddelelsen, og når det er nødvendigt at balancere belastningen mellem dem. Forbindelsen mellem meddelelsen og køen sker ud fra vægten (en betinget strengværdi fra 0 - n).

Ækvivalent vægt af køerne – angiver, at der i hver kø vil komme omtrent det samme antal meddelelser (hver meddelelse vil kun blive placeret i én kø). Der er ingen fuld garanti for jævn fordeling af meddelelser.

Grafisk repræsentation af beskedstrømmen:

RabbitMQ. Del 2. Vi ser på Exchanges

Hash beregnes baseret på routingnøglen eller egenskaben headers af meddelelsen. Hvis alle publicerede meddelelser havde forskellige routingnøgler eller headers, så vil fordelingen finde sted efter vægt. Ellers vil routingnøglen eller headers.

Skal hjælpe, når forbrugerens båndbredde kræver en vækst, der er højere end løsningen med flere forbrugere, der bruger én kø.

Kombinering af exchanges (E2E)

Adfærd af alle exchanges kan kombineres ved hjælp af forbindelsen Exchange-to-Exchange (kombinering af exchanges er ikke en del af specifikationen AMQP. Dette er en udvidelse af protokollen fra RabbitMQ).

Grafisk repræsentation af beskedstrømmen:

RabbitMQ. Del 2. Vi ser på Exchanges

Takket være E2E Vi kan finde den rette skalerbare konfiguration, som imødekommer både nuværende og voksende krav.

Oprettelse af Exchange

Oprettelsen af en udveksling sker ved hjælp af synkron RPC anmodning til serveren. Anmodningen udføres ved hjælp af metoden Exchange.Declare, der kaldes med parametre:

  • navn på udvekslingen
  • type af udveksling
  • andre parametre

Eksempel på oprettelse exchange ved hjælp af RabbitMQ.Client:

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

  • exchange — navnet på udvekslingen, vi ønsker at oprette. Navnet skal være unikt
  • type — type af udveksling
  • holdbar — hvis du angiver true, så exchange vil være vedvarende. Den vil blive gemt på disken og kan overleve genstart af serveren/broker. Hvis værdien false, så exchange er midlertidig og vil blive slettet, når serveren/broker genstartes
  • autoDelete — automatisk sletning. Exchange vil blive slettet, når alle relaterede køer slettes
  • arguments — valgfrie argumenter. Oftest angives alternative exchange (alternativ udveksling). Hvis meddelelsen ikke kan passere den oprindelige rute, kan den sendes til en alternativ udveksling for omdirigering ad en anden rute.

RabbitMQ. Del 2. Vi ser på Exchanges

Hvis oprettelsen exchange er muligt, vil serveren sende en synkron RPC @cassowary714 Exchange.DeclareOk. Hvis oprettelsen ikke er muligt (anmodningen blev nægtet Exchange.Declare), så vil kanalen blive lukket af serveren ved hjælp af en asynkron kommando Channel.Close og klienten vil modtage en undtagelse OperationInterruptedException, som vil indeholde en fejlkode og en beskrivelse af fejlen.

Udvekslingen skal være oprettet, før der publiceres meddelelser. Hvis du publicerer en meddelelse i en ikke-eksisterende udveksling — RabbitMQ vil den blive stilfærdigt slettet.

Oprettelse af Exchange via grafikgrænsefladen

Gå til administrationspanelet RabbitMQ som bruger guest (brugernavn: guest og adgangskode: guest). Bemærk, at brugeren guest kun kan oprette forbindelse fra localhost. Nu går vi til fanen Exchanges og klikker på Tilføj en ny udveksling. Udfyld indstillingerne:

RabbitMQ. Del 2. Vi ser på Exchanges

De fleste af egenskaberne er beskrevet ovenfor. Her skal vi bemærke, at hvis du angiver Intern, kan udvekslingen kun bruges til E2E. Producer vil ikke kunne sende meddelelser til en sådan udveksling.

Konklusion

Når du udvikler systemet, er det praktisk at beskrive topologien af omdirigering ved hjælp af et graf. Men før du begynder at bygge grafen, er det vigtigt at fremhæve ruter med høj trafik, da de kræver en højere båndbredde (ydelse). Derefter kan trafik klassificeres. Og først derefter kan du begynde at bygge.

Hvis der i den byggede graf eksisterer et endeligt antal routenøgler, så bør du se mod flere fanout exchange, som er 1:1 forbundet med rutenøglen. Husk, at fanout exchange den hurtigste.

Hvis antallet af ruter tendens imod uendeligheden, bør du tage hensyn til emneudveksling eller, hvis mønsteret ikke er nødvendigt, kan du vælge direct exchange, da den er hurtigere emneudveksling.

Kombinationer af forskellige exchange bør hjælpe med at finde den rigtige skalerbare konfiguration, som opfylder både nuværende og voksende systemkrav.

Antal exchange og ventetider bør være minimale i forhold til antallet af ruter.

I den næste artikel vil vi begynde at se nærmere på Queues og Bindings.

Links

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster