RabbitMQ. Del 3. Vi gÄr igenom Queues och Bindings

Kö (kö) — en datstruktur pĂ„ disken eller i RAM som lagrar referenser till meddelanden och returnerar deras kopior consumers (till konsumenterna). Kö representerar Erlang-process 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

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.

RabbitMQ. Del 3. Vi gÄr igenom Queues och Bindings

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

// ...
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Ă€lv
  • argument — 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 argumentet x-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 argumentet x-message-ttl anger 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 argumentet x-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 anropar Basic.Cancel eller 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.

RabbitMQ. Del 3. Vi gÄr igenom Queues och Bindings

  • 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) och reject-publish. Om du vĂ€ljer drop-head, kommer de Ă€ldsta meddelandena att rensas bort. Om du vĂ€ljer reject-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 anges all, kommer meddelandet att sparas pĂ„ alla noder. Om vĂ€rdet anges nodes, kommer meddelandet att sparas pĂ„ specifika noder i klustret.
  • x-ha-nodes — anger noder som en viss kö kommer att tillhöra. HA

RabbitMQ. Del 3. Vi gÄr igenom Queues och Bindings

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 OperationInterruptedException, 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 OperationInterruptedException, som kommer att innehÄlla felkoden 403 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:

RabbitMQ. Del 3. Vi gÄr igenom Queues och Bindings

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.

RabbitMQ. Del 3. Vi gÄr igenom Queues och Bindings

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

//...
channel.QueueBind(
    queue: queueName,
    exchange: "my_exchange",
    routingKey: "my_key",
    arguments: null
);
//...

  • queue — namnet pĂ„ kön
  • exchange — namnet pĂ„ utbytet
  • routingKey — rutt nyckel
  • argument — valfria argument

RabbitMQ. Del 3. Vi gÄr igenom Queues och Bindings

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:

RabbitMQ. Del 3. Vi gÄr igenom Queues och Bindings

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

RabbitMQ. Del 3. Vi gÄr igenom Queues och Bindings

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

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster