Kö (kö) â en datstruktur pĂ„ disken eller i RAM som lagrar referenser till meddelanden och returnerar deras kopior consumers (till konsumenterna). Kö representerar med tillstĂ„nd (dĂ€r meddelandena sjĂ€lva kan cachelagras). 1 tusen köer kan ta upp omkring 80 Mb.
Binding (bindning) â en regel som informerar meddelandebrokern om vilken kö meddelanden ska gĂ„ till.
InnehÄllsförteckning
- 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
TillfÀlliga köer
Om köcreationen sker med en instÀlld parameter autoDelete, sÄ fÄr den köen möjlighet att automatiskt ta bort sig sjÀlv. Dessa köer skapas vanligtvis vid anslutningen av den första klienten och tas bort nÀr alla klienter har kopplats bort.
Om köcreationen sker med en instÀlld parameter exklusiv, sÄ tillÄter den kö att endast en konsument kan ansluta och tas bort om kanalen stÀngs. Tills kanalen stÀngs kan klienten koppla bort/ansluta, men bara inom samma anslutning. Om parametern exklusiv Àr instÀlld, sÄ har parametern autoDelete ingen effekt.
Egenskaper:
- vid kortvarigt avbrott i kommunikationen kommer vi att förlora meddelanden som Ànnu inte har nÄtt konsumenten
- kan fÄnga fenomenet
bindingskrusning. Fenomenet uppstÄr nÀr antalet operationer för att skapa/ta bort köer och bindningar nÄr mycket höga nivÄer. I klusterlÀge kommer denna ström av operationer att spridas över alla noder och skapa en stor belastning. Denna process kan optimeras genom att kontrollera antalet prenumerationer
Permanenta köer
Om köcreationen sker med en instÀlld parameter hÄllbar, sÄ tillÄter den kö bevarar sitt tillstÄnd och ÄterstÀlls efter omstart av servern/brokern. Denna kö kommer att existera tills kommandot Queue.Delete.
Högt tillgÀngliga köer
HA-köer krÀver en klustermiljö för RabbitMQ. I klusterlÀge kommer all information om vÀxlare, köer, bindningar och konsumenter att kopieras till alla noder.
NÀr ett meddelande publiceras i en HA-kö, lagras det pÄ varje nod som tillhör HA-kön. NÀr meddelandet konsumeras pÄ nÄgon av noderna kommer alla kopior av meddelandet att tas bort frÄn andra noder.
HA-köer kan spridas över alla noder i ett kluster eller bara pÄ individuella.

Egenskaper:
- AnvÀndning av HA-köer leder till straff i prestanda. NÀr ett meddelande placeras i en HA-kö eller nÀr ett meddelande konsumeras frÄn en HA-kö, mÄste RabbitMQ samordna mellan alla noder (2-3 noder Àr vanligtvis tillrÀckliga).
Skapa kö
Köning skapande sker med hjÀlp av synkron. RPC begÀran till servern. BegÀran görs genom metoden Queue.Declare, som anropas med följande parametrar:
- Kö namn
- andra parametrar
Exempel pÄ kö skapande med hjÀlp av :
// ...
channel.QueueDeclare(
queue: "my_queue",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null
);
// ...queueâ namnet pĂ„ kö som vi vill skapa. Namnet mĂ„ste vara unikt och fĂ„r inte koincidera med systemnamnet för kö.hĂ„llbarâ om true, kommer kön att spara sitt tillstĂ„nd och Ă„terstĂ€llas efter en omstart av servern/mĂ€klaren.exklusivâ om true, kommer kön att tillĂ„ta endast en konsument att ansluta.autoDeleteâ om true, ger kön möjlighet att automatiskt ta bort sig sjĂ€lvargumentâ valfria argument. Nedan gĂ„r vi in mer detaljerat.
argument
x-message-ttl(x-message-time-to-live) â gör det möjligt att stĂ€lla in meddelandets livslĂ€ngd i millisekunder. Om kö skapas med ett angivet vĂ€rde för argumentetx-message-ttl, sĂ„ kommer en sĂ„dan kö att automatiskt exkludera meddelanden vars livslĂ€ngd har gĂ„tt ut.Att stĂ€lla in vĂ€rdet för argumentetx-message-ttlanger maxĂ„ldern för alla meddelanden i denna kö. Att skapa en sĂ„dan kö kan förhindra att förĂ„ldrad information tas emot.Detta kan anvĂ€ndas i realtidssystem. Om en kö har ett utbyte för avvisade meddelanden och fĂ„r vĂ€rdet för argumentetx-message-ttl, kommer avvisade meddelanden i denna kö att börja ha en livslĂ€ngd..x-expiresâ anger ett vĂ€rde i millisekunder efter vilket kön tas bort. En kö kan utlöpa sitt liv endast om den inte har nĂ„gra prenumeranter. Om det finns prenumeranter ansluten till kön, kan den automatiskt tas bort endast nĂ€r alla prenumeranter anroparBasic.Canceleller kopplar bort sig. En kö livslĂ€ngd kan endast avslutas om den inte har begĂ€rts.Basic.Get. Annars nollstĂ€lls nuvarande livslĂ€ngdsinstĂ€llning, och kön kommer inte lĂ€ngre att tas bort automatiskt. Ăven finns det inga garantier för hur snabbt kön tas bort efter att dess livslĂ€ngd har löpt ut..x-max-lengthâ anger maxantal meddelanden i kön. Om antalet meddelanden i kön börjar överskrida det maximala antalet, kommer de Ă€ldsta börja rensas bort.

x-max-lĂ€ngd-bytesâ anger den maximalt tillĂ„tna sammanlagda storleken av nyttolasten i meddelandena i kön. Om det angivna vĂ€rdet överskrids (en överbelastning i kön intrĂ€ffar vid en ny publicering av ett meddelande) kommer de Ă€ldsta meddelandena att börja rensas bort.x-overflowâ detta argument anvĂ€nds för att stĂ€lla in beteendet vid överflöd i kön. TvĂ„ vĂ€rden Ă€r tillgĂ€ngliga:drop-head(standardvĂ€rdet) ochreject-publish. Om du vĂ€ljerdrop-head, kommer de Ă€ldsta meddelandena att rensas bort. Om du vĂ€ljerreject-publish, kommer mottagandet av meddelanden att stoppas.x-dead-letter-exchangeâ anger en exchange dit avvisade meddelanden skickas, som inte har stĂ€llts tillbaka i kön.x-dead-letter-routing-keyâ anger en valfri routningsnyckel för avvisade meddelanden.x-max-priorityâ möjliggör sortering efter prioritet i kön med en maximal prioritet pĂ„ 255 (RabbitMQ versioner 3.5.0 och senare). Siffran anger den maximala prioriteten som kön kommer att stödja. Om argumentet inte anges kommer kön inte att stödja meddelandets prioritet.x-queue-modeâ tillĂ„ter att köen överförs till lĂ„gprioritetslĂ€get. I detta lĂ€ge kommer sĂ„ mĂ„nga meddelanden som möjligt att sparas pĂ„ disken. AnvĂ€ndningen av RAM-minne kommer att vara minimal. Om det inte anges kommer kön att spara meddelanden i minnet för att leverera meddelanden sĂ„ snabbt som möjligt.x-queue-master-locatorâ om vi har en kluster kan vi ange masterkön.x-ha-policyâ anvĂ€nds vid skapandet av HA-köer och definierar hur meddelanden kommer att spridas över noder. Om vĂ€rdet angesall, kommer meddelandet att sparas pĂ„ alla noder. Om vĂ€rdet angesnodes, kommer meddelandet att sparas pĂ„ specifika noder i klustret.x-ha-nodesâ anger noder som en viss kö kommer att tillhöra.HA

Om skapandet av kön Àr möjligt, sÄ kommer servern att skicka ett synkront RPC svar Queue.DeclareOk. Om skapandet av kön Àr omöjligt (det har skett ett avslag pÄ begÀran Queue.Declare), sÄ kanalen stÀngs av servern med kommandot Channel.Close och klienten fÄr ett undantag , som kommer att innehÄlla felkoden och dess beskrivning.
Ett Äteranrop Queue.Declare med samma parametrar kommer att returnera anvÀndbar information om denna kö. Till exempel det totala antalet meddelanden som vÀntar i denna kö och det totala antalet prenumeranter pÄ den.
Anrop Queue.Declare med anvÀndaruppgifter som inte har de nödvÀndiga rÀttigheterna tilldelade stÀnger kanalen med kommandot Channel.Close och klienten fÄr ett undantag , som kommer att innehÄlla felkoden och dess beskrivning.
NÀr kön har varit inaktiv i mer Àn 10 sekunder, gÄr den in i vilolÀge, vilket anropar GC i kön och dÀrmed avsevÀrt minskar minnesbehovet för denna kö.
Skapa en kö via anvÀndargrÀnssnittet
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 Köer och klicka pÄ LÀgg till en ny kö. Fyll i egenskaperna:

SÄ snart vi har angett alla nödvÀndiga uppgifter och klickar pÄ LÀgg till köer, kommer kön att visas i den övergripande listan.

Klicka pÄ köens namn för att visa detaljerad information. HÀr kan du konfigurera bindningen mellan utbytet och kön, se listan consumers, publicera/mottaga meddelanden, ta bort kön och visa statistik.
Skapa Bindning
Att skapa en bindning görs genom en synkron RPC begÀran till servern. BegÀran görs genom metoden Queue.Bind, som anropas med följande parametrar:
- Kö namn
- namnet pÄ utbytet
- andra parametrar
Exempel pÄ skapande av bindning via :
//...
channel.QueueBind(
queue: queueName,
exchange: "my_exchange",
routingKey: "my_key",
arguments: null
);
//...queueâ namnet pĂ„ könexchangeâ namnet pĂ„ utbytetroutingKeyâ rutt nyckelargumentâ valfria argument

Om skapandet av bindning Àr möjligt, sÄ kommer servern att skicka ett synkront RPC svar Queue.BindOk.
Skapa Bindning via anvÀndargrÀnssnittet
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 Köer och klicka pÄ kön my_queue. Fyll i fÀlten i avsnittet bindings:

SÄ snart vi har angett alla nödvÀndiga uppgifter och klickar pÄ Bind, kommer bindningen att visas i den övergripande listan:

Code
I detta avsnitt beskriver vi kön och bindningen med kod i C#, som om vi skulle utveckla ett bibliotek. Det kan vara anvÀndbart för förstÄelsen.
public interface IQueue
{
string Name { get; }
//
// Om det sÀtts till true, kommer kön att vara permanent.
// Den kommer att lagras pÄ disken och kan
// överleva omstart av servern/brokern.
// Om vÀrdet Àr false, Àr kön temporÀr och kommer att tas bort,
// nÀr servern/brokern startas om
//
bool IsDurable { get; }
//
// Om vÀrdet Àr true, kommer
// denna kö bara att tillÄta anslutning
// av en konsument
//
bool IsExclusive { get; }
//
// Automatisk borttagning.
// Kön kommer att tas bort nÀr alla klienter kopplar ifrÄn.
//
bool IsAutoDelete { get; }
//
// Valfria argument
//
IDictionary Arguments { get; }
}public class Queue : IQueue
{
public Queue(
string name,
bool isDurable = true,
bool isExclusive = false,
bool isAutoDelete = false,
IDictionary arguments = null)
{
Name = name ??
throw new ArgumentNullException(name, $"{name} fÄr inte vara null");
IsDurable = isDurable;
IsExclusive = isExclusive;
IsAutoDelete = isAutoDelete;
Arguments = arguments ?? new Dictionary();
}
public string Name { get; }
public bool IsDurable { get; }
public bool IsExclusive { get; }
public bool IsAutoDelete { get; }
public IDictionary Arguments { get; }
}public static class QueueMode
{
public const string Default = "default";
//
// LÄgprioriterat lÀge. LÄgprioriterat lÀge tvingar att spara
// sÄ mÄnga meddelanden som möjligt pÄ disk för att minska
// anvÀndningen av minnet
//
public const string Lazy = "lazy";
}public interface IBinding
{
//
// Koppling som kommer att binda en förbindelse
//
IExchange Exchange { get; }
//
// Routingnyckel
//
string RoutingKey { get; }
//
// Valfria argument
//
IDictionary Arguments { get; }
}public class Binding : IBinding
{
public Binding(
IExchange exchange,
string routingKey,
IDictionary arguments)
{
Exchange = exchange;
RoutingKey = routingKey;
Arguments = arguments;
}
public IExchange Exchange { get; }
public string RoutingKey { get; }
public IDictionary Arguments { get; }
}KĂ€lla: habr.com
