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Ă« 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
- RabbitMQ. Pjesa 4. Po shqyrtojmë çfarë janë mesazhet dhe kornizat
- RabbitMQ. Pjesa 5. Performanca e publikimit dhe konsumit të mesazheve
- RabbitMQ. Pjesa 6. Përmbledhje e modulit Federation dhe Shovel
- RabbitMQ. Pjesa 7. Detajet mbi Connection dhe Channel
- RabbitMQ. Pjesa 8. RabbitMQ në .NET
- RabbitMQ. Pjesa 9. Monitorimi
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ë.

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 :
// ...
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Ă«sdurableâ nĂ«se true, atĂ«herĂ« tretĂ«s do tĂ« ruajĂ« shtetin e tij dhe rikthehet pas ri-ngarkimit tĂ« serverit/brokeritekskluzivâ nĂ«se true, atĂ«herĂ« tretĂ«s do tĂ« lejojĂ« tĂ« lidhet vetĂ«m njĂ« konsumatorautoDeleteâ nĂ«se true, atĂ«herĂ« tretĂ«si fiton aftĂ«sinĂ« pĂ«r tĂ« fshirĂ« automatikisht vetenargumenteâ 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Ă« argumentitx-message-ttl, atĂ«herĂ« kjo tretĂ« do tĂ« fshijĂ« automatikisht mesazhet, tĂ« cilat kanĂ« kaluar afatin e skadimit. Vendosja e vlerĂ«s sĂ« argumentitx-message-ttlvendos 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 argumentitx-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Ă«rrasinBasic.Cancelose 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

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) dhereject-publish. NĂ«se zgjidhetdrop-head, mesazhet mĂ« tĂ« vjetra do tĂ« fshihen. NĂ«se zgjidhetreject-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 vleraall, mesazhi do tĂ« ruhet nĂ« tĂ« gjitha nyjet. NĂ«se caktohet vleranodes, 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

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 , 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 , e cila do të përmbajë kodin e gabimit 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:

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.

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ë :
//...
channel.QueueBind(
queue: queueName,
exchange: "my_exchange",
routingKey: "my_key",
arguments: null
);
//...renditâ emri i radhĂ«sexchangeâ emri i shkĂ«mbimitroutingKeyâ çelĂ«si i rrugĂ«sargumenteâ argumente tĂ« opsionit

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:

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:

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
