Exchange â en vĂ€xelkurs eller utbyte. Meddelanden skickas dit. Exchange fördelar meddelandet till ett eller flera köer. Den ruttnar meddelanden till köer baserat pĂ„ de skapade kopplingarna (bindings) mellan den och kön.
Exchange inte Ă€r . Av skalbarhetsskĂ€l exchange â Ă€r en strĂ€ng (lĂ€nk till modulen med logik för ruttnande) i den inbyggda databasen . 1 tusen vĂ€xlingsstĂ€llen kommer att konsumera endast 1 MB minne.
InnehÄllsförteckning
- RabbitMQ. Del 3. Vi gÄr igenom Queues och Bindings
- RabbitMQ. Del 4. LÄt oss förstÄ vad meddelanden och ramar Àr
- RabbitMQ. Del 5. Prestanda för publicering och konsumtion av meddelanden
- RabbitMQ. Del 6. Ăversikt av modulerna Federation och Shovel
- RabbitMQ. Del 7. Detaljer om Connection och Channel
- RabbitMQ. Del 8. RabbitMQ i .NET
- RabbitMQ. Del 9. Ăvervakning
Direct Exchange
Direct exchange â anvĂ€nds nĂ€r du behöver leverera meddelanden till specifika köer.Meddelandet publiceras i vĂ€xelkursen med en specifik ruttningsnyckel och hamnar i alla köer som Ă€r kopplade till denna vĂ€xelkurs med samma ruttningsnyckel. Ruttningsnyckeln Ă€r en strĂ€ng.Sökningen av överensstĂ€mmelse görs genom att kontrollera strĂ€ngar för likhet..
En grafisk representation av meddelandeflödet:

I rabbitmq finns begreppet standardvÀxel. Det Àr direct exchange utan namn. Om den standardvÀxeln anvÀnds kommer meddelandet att rutnas till en kö med namnet som Àr lika med ruttningsnyckeln för meddelandet..
Topic Exchange
Topic exchange â liknande direct exchange ger möjlighet till selektiv rutning genom att jĂ€mföra ruttningsnyckeln. Men i detta fall stĂ€lls nyckeln in enligt ett mönster.Vid skapandet av mönstret anvĂ€nds 0 eller fler ord (bokstĂ€ver AZ och az och siffror 0-9), Ă„tskilda med punkt, samt tecken * och #.
*â kan ersĂ€ttas med exakt1ordet#â kan ersĂ€ttas med0eller fler ord.
En grafisk representation av meddelandeflödet:

FrÄn och med versionen RabbitMQ 2.4.0 har rutningsalgoritmen för topic exchange blivit upp till 145 mycket snabbare. De uppnÄdde detta genom att implementera tillvÀgagÄngssÀttet , vilket innebÀr att mönstren presenteras som en trÀstruktur. Exempel pÄ mönster a.b.c, a.*.b.c, a.#.c och b.b.c Àr strukturerade pÄ följande sÀtt:

Sökningen av överensstÀmmelse med mönstret sker frÄn roten och följer uppifrÄn och ner.
Egenskaper:
- anvÀndning av denna vÀxel kan bli ett bra val för potentiell framtida utveckling av applikationen., eftersom mallarna alltid kan anpassas för att publicera meddelanden pÄ samma sÀtt
direct exchangeellerfanout-utbyte - mallar som anvÀnds
*mycket snabbare, Àn mallar som anvÀnds#. topic exchangelÄngsammaredirect exchange
Fanout-utbyte
Fanout-utbyte â alla meddelanden levereras till alla köer Ă€ven om meddelandet har en routning nyckel.
Egenskaper:
RabbitMQfungerar inte med routning nycklar och mallar vilket positivt pÄverkar prestandan. Detta Àr det snabbasteexchange;- alla konsumenter mÄste kunna hantera alla meddelanden;
En grafisk representation av meddelandeflödet:

Headers-utbyte
Headers-utbyte â dirigerar meddelanden till relaterade köer baserat pĂ„ jĂ€mförelsen av par (nyckel, vĂ€rde) egenskap headers bindningar och motsvarande egenskap hos meddelandet. headers representerar Dictionary<nyckel, vĂ€rde>.
Om en speciell nyckel lÀggs till i ordboken x-match med vÀrdet any, sÄ dirigeras meddelandet vid delvis matchning av par (nyckel, vÀrde). Detta beteende Àr liknande operatören or.
var bindingArguments = new Dictionary<String, Object>();
bindingArguments.add("x-match", "any");Som standard innehÄller nyckeln x-match vÀrdet all. Det innebÀr att meddelandet dirigeras vid fullstÀndig matchning av par (nyckel, vÀrde). Detta beteende liknar operatören och.
En grafisk representation av meddelandeflödet:

Egenskaper:
- extra flexibilitet
- extra berÀkningsöverhead. Alla par (nyckel, vÀrde) i attributet
headersmÄste sorteras efter nyckelns namn innan vÀrdena för meddelandets dirigering berÀknas. LÄngsammare Àn andra typer av utbyte.
Consistent-Hashing-utbyte
Detta utbyte Àr och Àr inte inbyggd pÄ RabbitMQ.
Consistent-hashing-utbyte (utbyte med konsekvent hashning) â anvĂ€nds nĂ€r det finns flera köer som potentiella mottagare av meddelandet, och nĂ€r det behövs för att balansera belastningen mellan dem. Kopplingen av meddelandet till kön sker baserat pĂ„ vikt (ett villkorligt strĂ€ngvĂ€rde frĂ„n 0 - n).
Den motsvarande vikten av köer antyder att varje kö kommer att fÄ ungefÀr lika mÄnga meddelanden (varje meddelande kommer att placeras endast i en kö). Det finns ingen fullstÀndig garanti för en jÀmn fördelning av meddelanden.
En grafisk representation av meddelandeflödet:

Hash berÀknas baserat pÄ routning nyckeln eller egenskapen headers hos meddelandet. Om alla publicerade meddelanden hade olika routning nycklar eller headers, sÄ kommer fördelningen att ske baserat pÄ vikt. Annars kommer routning nyckeln att anvÀndas eller headers.
Ska hjÀlpa nÀr anvÀndarens bandbredd behöver vÀxa mer Àn en lösning med flera anvÀndare som anvÀnder en kö.
Kombinering av vÀxlare (E2E)
Beteendet hos alla vÀxlare kan kombineras genom kopplingar Exchange-to-Exchange (kombinering av vÀxlare ingÄr inte i specifikationen AMQP. Detta Àr en protokollutvidgning frÄn sidan av RabbitMQ).
En grafisk representation av meddelandeflödet:

Genom E2E kan vi hitta den rÀtta skalbara konfigurationen som uppfyller bÄde nuvarande och vÀxande krav.
Skapande av Exchange
Skapandet av en vÀxlare sker genom en synkron RPC begÀran till servern. BegÀran görs genom metoden Exchange.Declare, som anropas med följande parametrar:
- namn pÄ vÀxlaren
- typ av vÀxlare
- andra parametrar
Exempel pÄ skapande av exchange med hjÀlp av :
//...
channel.ExchangeDeclare(
exchange: "my_exchange",
type: "direct",
durable: "false",
autoDelete: "false",
arguments: null
);
//...exchangeâ namnet pĂ„ vĂ€xlare som vi vill skapa. Namnet mĂ„ste vara unikttypâ typ av vĂ€xlarehĂ„llbarâ om det stĂ€lls intrue, sĂ„exchangekommer det att vara bestĂ€ndigt. Det kommer att lagras pĂ„ disken och kan överleva en omstart av servern/mĂ€klaren. Om vĂ€rdetfalse, sĂ„exchangeĂ€r temporĂ€rt och kommer att tas bort nĂ€r servern/krĂ€ver en omstartautoDeleteâ automatisk borttagning.Exchangekommer att tas bort nĂ€r alla relaterade köer tas bortargumentâ valfria argument. Oftast angesalternativ vĂ€xlare(alternativ vĂ€xlare). Om ett meddelande inte kan gĂ„ genom den ursprungliga vĂ€gen kan det skickas till den alternativa vĂ€xlaren för routing pĂ„ ett annat sĂ€tt.

Om skapandet exchange Àr möjligt, sÄ kommer servern att skicka ett synkront RPC svar Exchange.DeclareOk. Om skapandet Àr omöjligt (det har skett ett avslag pÄ begÀran Exchange.Declare), sÄ kanalen stÀngs av servern med hjÀlp av ett asynkront kommando Channel.Close och klienten fÄr ett undantag , som kommer att innehÄlla felkoden och dess beskrivning.
En vĂ€xlare mĂ„ste skapa innan meddelanden publiceras. Om du publicerar ett meddelande till en icke-existerande vĂ€xlare â RabbitMQ tyst tas bort.
Skapande av Exchange via grafiskt grÀnssnitt
GÄ till administrationspanelen RabbitMQ under anvÀndaren guest (anvÀndarnamn: guest och lösenord: guest). Observera att anvÀndaren guest bara kan ansluta frÄn localhost. LÄt oss nu gÄ till fliken Exchanges och klicka pÄ LÀgg till en ny vÀxlare. Fyll i egenskaperna:

Största delen av egenskaperna har beskrivits ovan. HÀr noterar vi att om man stÀller in Intern, sÄ kan utbytet endast anvÀndas för E2E. Producer kan inte skicka meddelanden till ett sÄdant utbyte.
Slutsats
Vid utvecklingen av systemet Àr det bekvÀmt att beskriva topologin med hjÀlp av en graf. Men innan man börjar bygga grafen bör man identifiera vÀgar med hög trafik, eftersom det Àr dessa som krÀver högre bandbredd (prestanda). DÀrefter kan trafiken klassificeras. Och först dÄ kan man börja bygga.
Om det finns ett Àndligt antal routningsnycklar, bör man titta pÄ flera fanout-utbyte, som Àr 1:1 kopplade till routningsnyckeln. Kom ihÄg att fanout-utbyte den Àr snabbast.
Om antalet rutter strÀvar mot oÀndligheten, bör man uppmÀrksamma topic exchange eller, om mönstret inte behövs, kan man vÀlja direktutbyte, eftersom det Àr snabbare. topic exchange.
Kombinationer av olika exchange bör hjÀlpa till att hitta rÀtt skalerbar konfiguration, som uppfyller bÄde nuvarande och vÀxande krav för systemet.
Antalet exchange och köer mÄste vara minimalt i förhÄllande till antalet rutter.
I nÀsta artikel kommer vi att börja titta nÀrmare pÄ Queues och Bindings.
LĂ€nkar
KĂ€lla: habr.com
