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 . Af skalerbarhedsmæssige årsager exchange — det er en streg (henvisning til modulet med koden, hvor routinglogikken er gemt) i den indbyggede database . 1 tusinde udvekslere vil kun bruge 1 MB hukommelse.
Indholdsfortegnelse
- RabbitMQ. Del 3. Vi ser på Queues og Bindings
- RabbitMQ. Del 4. Vi ser på hvad beskeder og frames er
- RabbitMQ. Del 5. Ydeevne for publicering og forbrug af beskeder
- RabbitMQ. Del 6. Oversigt over modulerne Federation og Shovel
- RabbitMQ. Del 7. Detaljer om Connection og Channel
- RabbitMQ. Del 8. RabbitMQ i .NET
- RabbitMQ. Del 9. Overvågning
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:

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æcist1‘replica’ (for eksempel blev funktionen snd_ctl_add_slave() ændret til snd_ctl_add_replica()), hvilket førte til#— kan erstattes af0eller flere ord
Grafisk repræsentation af beskedstrømmen:

Fra version RabbitMQ 2.4.0 blev routingalgoritmen til emneudveksling hurtigere op til 145 mange gange. De opnåede dette ved at implementere tilgangen , 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:

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 udvekslingellerfanout exchange - mønstre, der bruger
*meget hurtigere, end mønstre, der bruger#. emneudvekslinglangsommeredirekte udveksling
Fanout Exchange
Fanout exchange – leverer alle beskeder til alle køer selv hvis en routing-nøgle er angivet i beskeden.
Egenskaber:
RabbitMQfungerer ikke med routingnøgler og skabeloner der positivt påvirker ydeevnen. Dette er den hurtigsteexchange;- alle forbrugere skal være i stand til at behandle alle meddelelser;
Grafisk repræsentation af beskedstrømmen:

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:

Egenskaber:
- ydelser
- yderligere beregningsomkostninger. Alle par (nøgle, værdi) af attributten
headersskal 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 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:

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:

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 :
//...
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 unikttype— type af udvekslingholdbar— hvis du angivertrue, såexchangevil være vedvarende. Den vil blive gemt på disken og kan overleve genstart af serveren/broker. Hvis værdienfalse, såexchangeer midlertidig og vil blive slettet, når serveren/broker genstartesautoDelete— automatisk sletning.Exchangevil blive slettet, når alle relaterede køer slettesarguments— valgfrie argumenter. Oftest angivesalternative exchange(alternativ udveksling). Hvis meddelelsen ikke kan passere den oprindelige rute, kan den sendes til en alternativ udveksling for omdirigering ad en anden rute.

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

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 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
