RabbitMQ. Pjesa 3. Duke u marrë me Queues dhe Bindings

TretĂ« (tretĂ«) — struktura e tĂ« dhĂ«nave nĂ« disk ose nĂ« memorje, e cila ruan lidhjet nĂ« mesazhe dhe i jep kopjet e tyre konsumatorĂ«t (tĂ« konsumatorĂ«ve). TretĂ« Ă«shtĂ« njĂ« Procesi Erlang me gjendje (ku mund tĂ« ruhen edhe vetĂ« mesazhet). 1 mijĂ« treda mund tĂ« zĂ«nĂ« rreth 80Mb.

PĂ«rgjatja (pĂ«rgjatje) — rregulli qĂ« i thotĂ« shkĂ«mbyesit nĂ« cilin nga tredat duhet tĂ« shkojnĂ« mesazhet.

Përmbajtja

Tredat e përkohshme

Nëse krijimi i tredës ndodh me parametrin e vendosur autoDelete, atëherë kjo tretë fiton aftësinë për të fshirë automatikisht veten. Këto treda zakonisht krijohen në momentin e lidhjes së konsumatorit të parë dhe fshihen në momentin kur të gjithë konsumatorët janë shkëputur.

Nëse krijimi i tredës ndodh me parametrin e vendosur ekskluziv, atëherë kjo tretë lejon të lidhet vetëm një konsumator dhe fshihet nëse mbyllet kanali. Derisa kanali të mos mbyllet, klienti mund të shkëputet/lidhet, por vetëm brenda lidhjes së njëjtë. Nëse parametrin ekskluziv i është caktuar, atëherë parametri autoDelete nuk ka asnjë efekt.

Karakteristikat:

  • me njĂ« ndĂ«rprerje tĂ« pĂ«rkohshme tĂ« lidhjes do tĂ« humbasim mesazhet qĂ« ende nuk kanĂ« arritur te konsumatori
  • mund tĂ« kapet fenomeni binding churn. Fenomeni ndodh kur numri i operacioneve tĂ« krijimit/fshirjes sĂ« tredave dhe pĂ«rgatitjeve arrin vlera shumĂ« tĂ« larta. NĂ« modalitetin e grumbujve, ky rrjedh operacionesh do tĂ« shpĂ«rndahet nĂ« tĂ« gjithĂ« nyjet dhe do tĂ« krijojĂ« njĂ« ngarkesĂ« tĂ« madhe. Ky proces mund tĂ« optimizohet pĂ«rmes kontrollit tĂ« numrit tĂ« abonimeve

Tredat e qëndrueshme

Nëse krijimi i tredës ndodh me parametrin e vendosur durable, atëherë kjo tretë ruajnë shtetin e tyre dhe rikthehen pas ri-ngarkimit të serverit/brokerit. Kjo tretë do të ekzistojë derisa të thirret komanda Queue.Delete.

Tredat e Disponueshme në Niveli të Lartë

Tredat HA kërkojnë një mjedis të grumbujve RabbitMQ. Në modalitetin e grumbujve, të gjitha informacionet mbi shkëmbyesit, tredat, përgatitjet dhe konsumatorët do të kopjohen në të gjithë nyjet.

Kur një mesazh publikohet në ndonjë tretë HA, ai ruhet në çdo nyje që i përket tredir HA. Pasi mesazhi konsumohet në ndonjë nga nyjet, të gjitha kopjet e këtij mesazhi do të fshihen në nyjet e tjera.

Tredat HA mund të shpërndahen në të gjitha nyjet në një grumbull të caktuar ose vetëm në individë.

RabbitMQ. Pjesa 3. Duke u marrë me Queues dhe Bindings

Karakteristikat:

  • pĂ«rdorimi i tredis HA çon nĂ« ndĂ«shkime nĂ« performancĂ«. Kur vendos njĂ« mesazh nĂ« ndonjĂ« tretĂ« HA ose kur konsumon njĂ« mesazh nga njĂ« tretĂ« HA, RabbitMQ duhet tĂ« kryejĂ« koordinimin nĂ« tĂ« gjitha nyjet (2-3 nyje zakonisht janĂ« tĂ« mjaftueshme)

Krijimi i tretës

Krijimi i tretës është i mundur përmes sintaksës RPC në server. Kërkesa realizohet përmes metodës Queue.Declare, e cila thirret me parametrat:

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

Shembuj i krijimit të tretës përmes RabbitMQ.Client:

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

  • rendit — emri i tretĂ«s qĂ« duam tĂ« krijojmĂ«. Emri duhet tĂ« jetĂ« unik dhe nuk mund tĂ« pĂ«rputhet me emrin sistematik tĂ« tretĂ«s
  • durable — nĂ«se true, atĂ«herĂ« tretĂ«s do tĂ« ruajĂ« shtetin e tij dhe rikthehet pas ri-ngarkimit tĂ« serverit/brokerit
  • ekskluziv — nĂ«se true, atĂ«herĂ« tretĂ«s do tĂ« lejojĂ« tĂ« lidhet vetĂ«m njĂ« konsumator
  • autoDelete — nĂ«se true, atĂ«herĂ« tretĂ«si fiton aftĂ«sinĂ« pĂ«r tĂ« fshirĂ« automatikisht veten
  • argumente — argumente opsionale. MĂ« poshtĂ« do tĂ« diskutojmĂ« mĂ« shumĂ«.

argumente

  • x-message-ttl(x-message-time-to-live) — lejon tĂ« vendoset koha e skadimit tĂ« mesazhit nĂ« milisekonda. NĂ«se krijimi i tretĂ«s ndodh me njĂ« vlerĂ« tĂ« caktuar tĂ« argumentit x-message-ttl, atĂ«herĂ« kjo tretĂ« do tĂ« fshijĂ« automatikisht mesazhet, tĂ« cilat kanĂ« kaluar afatin e skadimit. Vendosja e vlerĂ«s sĂ« argumentit x-message-ttl vendos maksimumin e moshĂ«s pĂ«r tĂ« gjitha mesazhet nĂ« kĂ«tĂ« tretĂ«. Krijimi i kĂ«tij lloji tĂ« tretĂ«s lejon parandalimin e marrjes sĂ« informacionit tĂ« pĂ«rparuar. Kjo mund tĂ« pĂ«rdoret nĂ« sistemet e kohĂ«s reale. NĂ«se tretĂ«sit pĂ«r tĂ« cilin Ă«shtĂ« caktuar shkĂ«mbyes pĂ«r mesazhet e refuzuara vendosim vlerĂ«n e argumentit x-message-ttl, atĂ«herĂ« mesazhet e refuzuara nĂ« kĂ«tĂ« tretĂ« do tĂ« kenĂ« njĂ« kohĂ« tĂ« jetĂ«s.
  • x-expires — vendos vlerĂ«n nĂ« milisekonda, pas sĂ« cilĂ«s ndodh fshirja e tretĂ«s. TretĂ«si mund tĂ« harxhojĂ« afatin e tij vetĂ«m nĂ«se nuk ka asnjĂ« abonues. NĂ«se ka abonues, ai do tĂ« jetĂ« nĂ« gjendje tĂ« fshihet automatikisht vetĂ«m kur tĂ« gjithĂ« abonuesit thĂ«rrasin Basic.Cancel ose shkĂ«puten. Afati i jetĂ«s sĂ« tretĂ«s mund tĂ« pĂ«rfundojĂ« vetĂ«m nĂ«se nuk ka pasur kĂ«rkesa pĂ«r tĂ« Basic.Get. PĂ«rndryshe, vlera aktuale e vendosjes sĂ« kohĂ«s sĂ« jetĂ«s zhbĂ«het, dhe tretĂ«si nuk do tĂ« fshihet automatikisht mĂ«. Po ashtu nuk ka garanci se sa shpejt ndodh fshirja e tretĂ«s pas skadimit tĂ« tij.
  • x-max-length — vendos numrin maksimal tĂ« mesazheve nĂ« tretĂ«s. NĂ«se numri i mesazheve nĂ« tretĂ«s fillon tĂ« kalojĂ« numrin maksimal, atĂ«herĂ« do tĂ« fshihen tĂ« parat mĂ« tĂ« vjetra

RabbitMQ. Pjesa 3. Duke u marrë me Queues dhe Bindings

  • x-max-lenght-bytes — pĂ«rcakton madhĂ«sinĂ« maksimale tĂ« lejuar pĂ«r ngarkesat e mesazheve nĂ« radhĂ«. Kur kapet vlera e caktuar (ndodhi mbushja e radhĂ«s gjatĂ« publikimit tĂ« mesazhit), mesazhet mĂ« tĂ« vjetra do tĂ« fillojnĂ« tĂ« fshihen.
  • x-overflow — ky argument pĂ«rdoret pĂ«r tĂ« konfiguruar sjelljen si rezultat i mbushjes sĂ« radhĂ«s. Dy vlera janĂ« tĂ« disponueshme: drop-head (vlera e paracaktuar) dhe reject-publish. NĂ«se zgjidhet drop-head, mesazhet mĂ« tĂ« vjetra do tĂ« fshihen. NĂ«se zgjidhet reject-publish, pranimi i mesazheve do tĂ« pezullohet.
  • x-dead-letter-exchange — pĂ«rcakton exchange-in nĂ« tĂ« cilin dĂ«rgohen mesazhet e refuzuara qĂ« nuk janĂ« rihyrĂ« nĂ« radhĂ«.
  • x-dead-letter-routing-key — pĂ«rcakton njĂ« çelĂ«s rrugĂ«zimi tĂ« qenĂ«sishĂ«m pĂ«r mesazhet e refuzuara.
  • x-max-priority — lejon renditjen sipas prioriteteve nĂ« radhĂ« me vlerĂ«n maksimale tĂ« prioriteteve 255 (RabbitMQ versionet 3.5.0 e mĂ« lart). Numri tregon prioritete maksimale qĂ« do tĂ« mbĂ«shtetet nga radha. NĂ«se argumenti nuk Ă«shtĂ« caktuar, radhĂ« nuk do tĂ« mbĂ«shtesĂ« prioritetet e mesazheve.
  • x-queue-mode — lejon kalimin e radhĂ«s nĂ« modin e mbajtur. NĂ« kĂ«tĂ« mod, sa mĂ« shumĂ« mesazhe tĂ« jetĂ« e mundur do tĂ« ruhet nĂ« disk. PĂ«rdorimi i kujtesĂ«s do tĂ« jetĂ« minimal. NĂ«se nuk caktohet, radhĂ« do tĂ« ruajĂ« mesazhet nĂ« kujtesĂ« pĂ«r tĂ« dĂ«rguar mesazhet sa mĂ« shpejt tĂ« jetĂ« e mundur.
  • x-queue-master-locator — nĂ«se kemi njĂ« kluster, mund tĂ« caktohet master queue.
  • x-ha-policy — pĂ«rdoret gjatĂ« krijimit tĂ« radhĂ«ve HA dhe pĂ«rcakton si do tĂ« shpĂ«rndahet mesazhi pĂ«rmes nyjeve. NĂ«se caktohet vlera all, mesazhi do tĂ« ruhet nĂ« tĂ« gjitha nyjet. NĂ«se caktohet vlera nodes, mesazhi do tĂ« ruhet nĂ« nyje tĂ« caktuara tĂ« klustrit.
  • x-ha-nodes — pĂ«rcakton nyjet nĂ« tĂ« cilat do tĂ« referohet njĂ« radhĂ«. HA

RabbitMQ. Pjesa 3. Duke u marrë me Queues dhe Bindings

Nëse krijimi i radhës është e mundur, atëherë serveri do të dërgojë një përgjigje sinkrone te klienti RPC përgjigje Queue.DeclareOk. Nëse krijimi i radhës e pamundur (ndodhi një refuzim në kërkesë Queue.Declare), atëherë kanali do të mbyllet nga serveri me anë të komandës Channel.Close dhe klienti do të marrë një përjashtim OperationInterruptedException, i cili do të përmbajë kodin e gabimit dhe përshkrimin e tij.

Thirrja e sërishme Queue.Declare me parametra të ngjashëm do të kthejë informacion të dobishëm mbi këtë radhë. Për shembull, numri i përgjithshëm i mesazheve që presin në këtë radhë dhe numri i përgjithshëm i konsumatorëve të regjistruar për të.

Thirrja Queue.Declare nën kredencialet e përdoruesit që nuk janë caktuar të drejtat e nevojshme do të mbyllë kanal me anë të komandës Channel.Close dhe klienti do të marrë një përjashtim OperationInterruptedException, e cila do të përmbajë kodin e gabimit 403 dhe përshkrimin e tij.

Pasi radhë të qendrojë të paktën për 10 sekonda, ajo do të kalojë në gjendjen e fjetjes, duke thirrur GC në radhë, që do të çojë në një reduktim të konsiderueshëm të memories së nevojshme për këtë radhë.

Krijimi i Queue përmes ndërfaqësës grafike

Hyr në panelet e administratorit RabbitMQ si përdoruesi guest (emri i përdoruesit: guest dhe fjalëkalimi: guest). Vini re se përdoruesi guest mund të lidhet vetëm nga hosti lokal. Tani kalojmë tek tab-i Queues dhe klikojmë në Shto një radhë të re. Plotësoni pronat:

RabbitMQ. Pjesa 3. Duke u marrë me Queues dhe Bindings

Pasi të shkruajmë të gjitha të dhënat e nevojshme dhe të klikojmë në Shto radhë, radhë do të shfaqet në listën e përgjithshme.

RabbitMQ. Pjesa 3. Duke u marrë me Queues dhe Bindings

Klikimi mbi emrin e radhës do të tregojë informacionin e saj të detajuar. Këtu mund të konfigurojmë lidhjen midis shkëmbimit dhe radhës, të shohim listën konsumatorët, publikojmë/marrim mesazhe, fshijmë radhën dhe shohim statistikat.

Krijimi i Binding

Krijimi i lidhjes ndodh përmes RPC në server. Kërkesa realizohet përmes metodës Queue.Bind, e cila thirret me parametrat:

  • emri i tretĂ«s
  • emri i shkĂ«mbimit
  • parametra tĂ« tjerĂ«

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

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

  • rendit — emri i radhĂ«s
  • exchange — emri i shkĂ«mbimit
  • routingKey — çelĂ«si i rrugĂ«s
  • argumente — argumente tĂ« opsionit

RabbitMQ. Pjesa 3. Duke u marrë me Queues dhe Bindings

Nëse krijimi i lidhjes është e mundur, atëherë serveri do të dërgojë një përgjigje sinkrone te klienti RPC përgjigje Queue.BindOk.

Krijimi i Binding përmes ndërfaqësës grafike

Hyr në panelet e administratorit RabbitMQ si përdoruesi guest (emri i përdoruesit: guest dhe fjalëkalimi: guest). Vini re se përdoruesi guest mund të lidhet vetëm nga hosti lokal. Tani kalojmë tek tab-i Queues dhe klikoni mbi radhën my_queue. Plotësojmë fushat e seksionit bindings:

RabbitMQ. Pjesa 3. Duke u marrë me Queues dhe Bindings

Pasi të shkruajmë të gjitha të dhënat e nevojshme dhe të klikojmë në Bind, lidhja do të shfaqet në listën e përgjithshme:

RabbitMQ. Pjesa 3. Duke u marrë me Queues dhe Bindings

Kodi

Në këtë seksion do ta përshkruajmë radhën dhe lidhjen me kod në C#, sikurse po do të na duhej të zhvillonim një bibliotekë. Kjo ndoshta do të jetë e dobishme për perceptimin.

public interface IQueue
    {        
        string Name { get; }

        // 
        //     Nëse caktuat true, atëherë radha do të jetë e përhershme. 
        //     Ajo do të ruhet në disk dhe do të mund 
        //     të përballojë rinisjen e serverit/brokerit. 
        //     Nëse vlera është false, atëherë radha është e përkohshme dhe do të fshihet, 
        //     kur serveri/brokeri të riniset
        // 
        bool IsDurable { get; }

        // 
        //     Nëse vlera është e vërtetë, atëherë 
        //     kjo radhë do të lejojë lidhjen 
        //     vetëm me një konsumator
        // 
        bool IsExclusive { get; }

        // 
        //     Fshirja automatike. 
        //     Radhë do të fshihet, kur të gjithë klientët të shkëputen.
        // 
        bool IsAutoDelete { get; }

        // 
        //     Argumente të opsionalit
        // 
        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} must not be 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 i lenzimit. Modalitet i lenzimit detyron ruajtjen 
        //     sa më shumë mesazhe në disk, për të zvogëluar 
        //     përdorimin e memorieve
        // 
        public const string Lazy = "lazy";
    }

public interface IBinding
    {
        // 
        //     Bursi që do të lidhet me lidhjen
        // 
        IExchange Exchange { get; }

        // 
        //     ÇelĂ«si i rrugĂ«s
        // 
        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

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