RabbitMQ. Pjesa 3. Të kuptojmë Queues dhe Bindings

Queue (radhĂ«) — njĂ« strukturĂ« tĂ« dhĂ«nash nĂ« disk ose nĂ« memorien operative qĂ« ruan referenca ndaj mesazheve dhe u dorĂ«zon kopjet e tyre consumers (konsumatorĂ«ve). Queue pĂ«rfaqĂ«son njĂ« proces Erlang me gjendje (ku mund tĂ« ruhen nĂ« cache edhe vetĂ« mesazhet). 1 mijĂ« radhĂ« mund tĂ« zĂ«nĂ« rreth 80 Mb.

Binding (lidhje) — njĂ« rregull qĂ« i tregon exchange-it se nĂ« cilĂ«n nga radhĂ«t duhet tĂ« dĂ«rgohen mesazhet.

Përmbajtja

Radhë të përkohshme

Nëse krijimi i radhës bëhet me parametrin autoDelete, atëherë kjo radhë fiton aftësinë të fshijë veten automatikisht. Radhë të tilla zakonisht krijohen në momentin e lidhjes së klientit të parë dhe fshihen kur të gjithë klientët janë shkëputur.

Nëse krijimi i radhës bëhet me parametrin exclusive, atëherë kjo radhë lejon lidhjen vetëm të një konsumatori dhe fshihet nëse kanali mbyllet. Derisa kanali të mbyllet, klienti mund të shkëputet/lidhet sërish, por vetëm brenda të njëjtit connection. Nëse parametri exclusive është i vendosur, atëherë parametri autoDelete nuk ka asnjë efekt.

Karakteristikat:

  • nĂ« rast tĂ« njĂ« ndĂ«rprerjeje afatshkurtĂ«r tĂ« lidhjes, do tĂ« humbasim mesazhet qĂ« ende nuk kanĂ« arritur te konsumatori
  • mund tĂ« haset fenomeni binding churn. Fenomeni shfaqet kur numri i operacioneve pĂ«r krijimin/fshirjen e radhĂ«ve dhe lidhjeve arrin vlera shumĂ« tĂ« larta. NĂ« modalitetin cluster, njĂ« rrjedhĂ« e tillĂ« operacionesh do tĂ« pĂ«rhapet nĂ« tĂ« gjitha nyjat dhe do tĂ« krijojĂ« ngarkesĂ« tĂ« madhe. Ky proces mund tĂ« optimizohet duke kontrolluar numrin e abonimeve

Radhë të përhershme

Nëse krijimi i radhës bëhet me parametrin durable, atëherë kjo radhë ruan gjendjen e saj dhe rikthehet pas rinisjes së serverit/brokerit. Kjo radhë do të ekzistojë derisa të thirret komanda Queue.Delete.

Radhë Highly Available

Radhët HA kërkojnë një mjedis cluster RabbitMQ. Në modalitetin cluster, i gjithë informacioni për exchanges, radhët, lidhjet dhe konsumatorët do të kopjohet në të gjitha nyjat.

Kur një mesazh publikohet në një radhë HA, ai ruhet në çdo nyje që i përket asaj radhe HA. Pasi mesazhi të konsumohet në njërën nga nyjet, të gjitha kopjet e tij do të fshihen nga nyjet e tjera.

Radhët HA mund të shtrihen në të gjitha nyjet e një klasteri ose vetëm në nyje të veçanta.

RabbitMQ. Pjesa 3. Të kuptojmë Queues dhe Bindings

Karakteristikat:

  • PĂ«rdorimi i radhĂ«ve HA sjell penalizime nĂ« performancĂ«. Kur njĂ« mesazh dĂ«rgohet nĂ« njĂ« radhĂ« HA ose konsumohet prej saj, RabbitMQ duhet tĂ« kryejĂ« koordinim mes tĂ« gjitha nyjeve (zakonisht mjaftojnĂ« 2-3 nyje).

Krijimi i radhës

Krijimi i radhës kryhet përmes një RPC kërkese sinkrone ndaj serverit. Kërkesa bëhet me metodën Queue.Declare, e thirrur me parametrat:

  • emri i radhĂ«s
  • parametra tĂ« tjerĂ«

Shembull i krijimit të një radhe me RabbitMQ.Client:

// ...
channel.QueueDeclare(
    queue: "my_queue",
    durable: false,
    exclusive: false,
    autoDelete: false,
    arguments: null
);
// ...

  • queue — emri i radhĂ«s qĂ« duam tĂ« krijojmĂ«. Emri duhet tĂ« jetĂ« unik dhe nuk mund tĂ« pĂ«rputhet me emrin sistemor tĂ« radhĂ«s
  • durable — nĂ«se Ă«shtĂ« true, atĂ«herĂ« radha do ta ruajĂ« gjendjen e saj dhe do tĂ« rikthehet pas rinisjes sĂ« serverit/brokerit
  • exclusive — nĂ«se Ă«shtĂ« true, atĂ«herĂ« radha do tĂ« lejojĂ« lidhjen vetĂ«m tĂ« njĂ« konsumatori
  • autoDelete — nĂ«se Ă«shtĂ« true, atĂ«herĂ« radha fiton aftĂ«sinĂ« tĂ« fshijĂ« veten automatikisht
  • arguments — argumente opsionale. MĂ« poshtĂ« do t’i shqyrtojmĂ« mĂ« nĂ« detaje.

arguments

  • x-message-ttl(x-message-time-to-live) — lejon tĂ« caktohet koha e skadimit tĂ« mesazhit nĂ« milisekonda. NĂ«se radha krijohet me vlerĂ«n e argumentit x-message-ttl, atĂ«herĂ« njĂ« radhĂ« e tillĂ« do tĂ« pĂ«rjashtojĂ« automatikisht mesazhet tĂ« cilave u ka skaduar afati. Vendosja e vlerĂ«s sĂ« argumentit x-message-ttl pĂ«rcakton moshĂ«n maksimale pĂ«r tĂ« gjitha mesazhet nĂ« kĂ«tĂ« radhĂ«. Krijimi i njĂ« radhe tĂ« tillĂ« ndihmon nĂ« parandalimin e marrjes sĂ« informacionit tĂ« vjetĂ«ruar. Kjo mund tĂ« pĂ«rdoret nĂ« sistemet nĂ« kohĂ« reale. NĂ«se pĂ«r njĂ« radhĂ«, pĂ«r tĂ« cilĂ«n Ă«shtĂ« caktuar njĂ« shkĂ«mbyes pĂ«r mesazhet e refuzuara, vendoset vlera e argumentit x-message-ttl, atĂ«herĂ« mesazhet e refuzuara nĂ« kĂ«tĂ« radhĂ« do tĂ« kenĂ« afat jetese.
  • x-expires — pĂ«rcakton vlerĂ«n nĂ« milisekonda, pas skadimit tĂ« sĂ« cilĂ«s radha fshihet. Radha mund tĂ« shpenzojĂ« afatin e saj tĂ« vlefshmĂ«risĂ« vetĂ«m nĂ«se nuk ka asnjĂ« abonent. NĂ«se me radhĂ«n janĂ« tĂ« lidhur abonentĂ«, ajo mund tĂ« fshihet automatikisht vetĂ«m kur tĂ« gjithĂ« abonentĂ«t tĂ« thĂ«rrasin Basic.Cancel ose tĂ« shkĂ«puten. Afati i jetĂ«s sĂ« radhĂ«s mund tĂ« pĂ«rfundojĂ« vetĂ«m nĂ«se ndaj saj nuk ka pasur kĂ«rkesĂ« Basic.Get. PĂ«rndryshe, vlera aktuale e cilĂ«simit tĂ« afatit tĂ« jetĂ«s rivendoset dhe radha nuk do tĂ« fshihet mĂ« automatikisht. Gjithashtu, nuk ka garanci se sa shpejt do tĂ« ndodhĂ« fshirja e radhĂ«s pas skadimit tĂ« afatit tĂ« saj tĂ« jetĂ«s.
  • x-max-length — pĂ«rcakton numrin maksimal tĂ« mesazheve nĂ« radhĂ«. NĂ«se numri i mesazheve nĂ« radhĂ« fillon tĂ« tejkalojĂ« numrin maksimal, do tĂ« fillojnĂ« tĂ« fshihen mĂ« tĂ« vjetrat

RabbitMQ. Pjesa 3. Të kuptojmë Queues dhe Bindings

  • x-max-lenght-bytes — pĂ«rcakton madhĂ«sinĂ« maksimale tĂ« lejuar tĂ« ngarkesĂ«s sĂ« dobishme tĂ« mesazheve nĂ« radhĂ«. NĂ«se tejkalohet vlera e caktuar (ndodh tejmbushja e radhĂ«s gjatĂ« publikimit tĂ« mesazhit tĂ« radhĂ«s), mesazhet mĂ« tĂ« vjetra do tĂ« fillojnĂ« tĂ« fshihen
  • x-overflow — ky argument pĂ«rdoret pĂ«r tĂ« konfiguruar sjelljen nĂ« rast tejmbushjeje tĂ« radhĂ«s. JanĂ« tĂ« disponueshme dy vlera: drop-head (vlera e parazgjedhur) dhe reject-publish. NĂ«se zgjidhet drop-head, atĂ«herĂ« mesazhet mĂ« tĂ« vjetra do tĂ« fshihen. NĂ«se zgjidhet reject-publish, atĂ«herĂ« pranimi i mesazheve do tĂ« pezullohet
  • x-dead-letter-exchange — pĂ«rcakton exchange ku dĂ«rgohen mesazhet e refuzuara qĂ« nuk rivendosen pĂ«rsĂ«ri nĂ« radhĂ«
  • x-dead-letter-routing-key — pĂ«rcakton njĂ« çelĂ«s rutimi opsional pĂ«r mesazhet e refuzuara
  • x-max-priority — mundĂ«son renditjen sipas prioriteteve nĂ« radhĂ« me vlerĂ«n maksimale tĂ« prioritetit 255 (RabbitMQ versionet 3.5.0 e lart). Numri tregon prioritetin maksimal qĂ« do tĂ« mbĂ«shtesĂ« radha. NĂ«se argumenti nuk Ă«shtĂ« vendosur, radha nuk do tĂ« mbĂ«shtesĂ« prioritetin e mesazheve
  • x-queue-mode — lejon kalimin e radhĂ«s nĂ« modalitetin lazy. NĂ« kĂ«tĂ« modalitet, sa mĂ« shumĂ« mesazhe tĂ« jetĂ« e mundur do tĂ« ruhen nĂ« disk. PĂ«rdorimi i RAM do tĂ« jetĂ« minimal. NĂ«se nuk Ă«shtĂ« vendosur, radha do t’i ruajĂ« mesazhet nĂ« memorie pĂ«r t’i dorĂ«zuar ato sa mĂ« shpejt tĂ« jetĂ« e mundur
  • x-queue-master-locator — nĂ«se kemi njĂ« klaster, mund tĂ« caktohet radha master
  • x-ha-policy — pĂ«rdoret gjatĂ« krijimit tĂ« radhĂ«ve HA dhe pĂ«rcakton se si mesazhi do tĂ« shpĂ«rndahet nĂ«pĂ«r nyje. NĂ«se caktohet vlera tĂ« gjitha, atĂ«herĂ« mesazhi do tĂ« ruhet nĂ« tĂ« gjitha nyjet. NĂ«se caktohet vlera nodes, atĂ«herĂ« mesazhi do tĂ« ruhet nĂ« nyje tĂ« caktuara tĂ« klasterit
  • x-ha-nodes — pĂ«rcakton nyjet me tĂ« cilat do tĂ« lidhet njĂ« radhĂ« e caktuar HA

RabbitMQ. Pjesa 3. Të kuptojmë Queues dhe Bindings

Nëse krijimi i radhës është i mundur, atëherë serveri do t'i dërgojë klientit një RPC përgjigje Queue.DeclareOk. Nëse krijimi i radhës nuk është i mundur (kërkesa u refuzua me Queue.Declare), atëherë kanali do të mbyllet nga serveri me komandën Channel.Close dhe klienti do të marrë përjashtimin OperationInterruptedException, i cili do të përmbajë kodin e gabimit dhe përshkrimin e tij.

Thirrja e përsëritur e Queue.Declare me të njëjtët parametra do të kthejë informacion të dobishëm për këtë radhë. Për shembull, numrin total të mesazheve në pritje në këtë radhë dhe numrin total të konsumatorëve të abonuar në të.

Thirrja Queue.Declare me kredencialet e një përdoruesi të cilit nuk i janë caktuar të drejtat e nevojshme do ta mbyllë kanalin me komandën Channel.Close dhe klienti do të marrë përjashtimin OperationInterruptedException, i cili do të përmbajë kodin e gabimit 403 dhe përshkrimin e tij.

Pasi radha të qëndrojë joaktive për >= 10 sekonda, ajo kalon në gjendje fjetjeje, duke shkaktuar GC në radhë, çka çon në një ulje të ndjeshme të memories së nevojshme për këtë radhë.

Krijimi i Queue përmes ndërfaqes grafike

Hyni në panelin e administratorit RabbitMQ me përdoruesin guest (username: guest dhe password: guest). Ju lutemi vini re se përdoruesi guest mund të lidhet vetëm nga localhost. Tani kalojmë te skeda Queues dhe klikojmë Add a new queue. Plotësojmë parametrat:

RabbitMQ. Pjesa 3. Të kuptojmë Queues dhe Bindings

Pasi të kemi futur të gjitha të dhënat e nevojshme dhe të klikoni Add queues, radha do të shfaqet në listën e përgjithshme.

RabbitMQ. Pjesa 3. Të kuptojmë Queues dhe Bindings

Klikimi mbi emrin e radhës do të shfaqë informacionin e saj të detajuar. Këtu mund të konfiguroni lidhjen midis exchange dhe radhës, të shihni listën e consumers, të publikoni/merrni mesazhe, të fshini radhën dhe të shihni statistikat.

Krijimi i Binding

Krijimi i lidhjes kryhet me anë të komandës sinkrone RPC kërkese sinkrone ndaj serverit. Kërkesa bëhet me metodën Queue.Bind, e thirrur me parametrat:

  • emri i radhĂ«s
  • emri i exchange
  • parametra tĂ« tjerĂ«

Shembull i krijimit të lidhjes me anë të RabbitMQ.Client:

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

  • queue — emri i radhĂ«s
  • exchange — emri i exchange
  • routingKey — çelĂ«si i rutimit
  • arguments — argumente opsionale

RabbitMQ. Pjesa 3. Të kuptojmë Queues dhe Bindings

Nëse krijimi i lidhjes është i mundur, atëherë serveri do t'i dërgojë klientit një RPC përgjigje Queue.BindOk.

Krijimi i Binding përmes ndërfaqes grafike

Hyni në panelin e administratorit RabbitMQ me përdoruesin guest (username: guest dhe password: guest). Ju lutemi vini re se përdoruesi guest mund të lidhet vetëm nga localhost. Tani kalojmë te skeda Queues dhe klikojmë mbi radhën my_queue. Plotësojmë fushat e seksionit bindings:

RabbitMQ. Pjesa 3. Të kuptojmë Queues dhe Bindings

Pasi të kemi futur të gjitha të dhënat e nevojshme dhe të klikojmë në Lidhje, lidhja do të shfaqet në listën e përgjithshme:

RabbitMQ. Pjesa 3. Të kuptojmë Queues dhe Bindings

Code

Në këtë seksion do të përshkruajmë radhën dhe lidhjen me kod në C#, sikur të na duhej të zhvillonim një bibliotekë. Ndoshta kjo do të jetë e dobishme për ta kuptuar më lehtë.

public interface IQueue
    {        
        string Name { get; }

        /// 
        ///     Nëse vendoset true, atëherë queue do të jetë e përhershme. 
        ///     Ajo do të ruhet në disk dhe do të mund 
        ///     t’i mbijetojĂ« rinisjes sĂ« serverit/brokerit. 
        ///     Nëse vlera është false, atëherë queue është e përkohshme dhe do të fshihet, 
        ///     kur serveri/brokeri të riniset
        /// 
        bool IsDurable { get; }

        /// 
        ///     Nëse vlera është true, atëherë 
        ///     një radhë e tillë do të lejojë lidhjen 
        ///     vetëm të një consumer-i
        /// 
        bool IsExclusive { get; }

        /// 
        ///     Fshirje automatike. 
        ///     Radha do të fshihet kur të gjithë klientët të shkëputen.
        /// 
        bool IsAutoDelete { get; }

        /// 
        ///     Argumente opsionale
        /// 
        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} nuk duhet të jetë 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";
        /// 
        ///     Modalitet dembel. Modaliteti dembel do të detyrojë ruajtjen 
        ///     e sa më shumë mesazheve në disk, për të ulur 
        ///     përdorimin e memories RAM
        /// 
        public const string Lazy = "lazy";
    }

public interface IBinding
    {
        /// 
        ///     Exchange me të cilin do të lidhet binding
        /// 
        IExchange Exchange { get; }

        /// 
        ///     ÇelĂ«si i rutimit
        /// 
        string RoutingKey { get; }

        /// 
        ///     Argumente opsionale
        /// 
        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; }
    }

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster