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 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
- RabbitMQ. Pjesa 4. Të kuptojmë çfarë janë mesazhet dhe frames
- RabbitMQ. Pjesa 5. Performanca e publikimit dhe konsumimit të mesazheve
- RabbitMQ. Pjesa 6. Pasqyrë e moduleve Federation dhe Shovel
- RabbitMQ. Pjesa 7. Në detaje për Connection dhe Chanel
- RabbitMQ. Pjesa 8. RabbitMQ në .NET
- RabbitMQ. Pjesa 9. Monitorimi
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.

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 :
// ...
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Ă«sdurableâ nĂ«se Ă«shtĂ« true, atĂ«herĂ« radha do ta ruajĂ« gjendjen e saj dhe do tĂ« rikthehet pas rinisjes sĂ« serverit/brokeritexclusiveâ nĂ«se Ă«shtĂ« true, atĂ«herĂ« radha do tĂ« lejojĂ« lidhjen vetĂ«m tĂ« njĂ« konsumatoriautoDeleteâ nĂ«se Ă«shtĂ« true, atĂ«herĂ« radha fiton aftĂ«sinĂ« tĂ« fshijĂ« veten automatikishtargumentsâ 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 argumentitx-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Ă« argumentitx-message-ttlpĂ«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 argumentitx-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Ă«rrasinBasic.Cancelose 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

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Ă« fshihenx-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) dhereject-publish. NĂ«se zgjidhetdrop-head, atĂ«herĂ« mesazhet mĂ« tĂ« vjetra do tĂ« fshihen. NĂ«se zgjidhetreject-publish, atĂ«herĂ« pranimi i mesazheve do tĂ« pezullohetx-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 refuzuarax-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 mesazhevex-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 mundurx-queue-master-locatorâ nĂ«se kemi njĂ« klaster, mund tĂ« caktohet radha masterx-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 vleratĂ« gjitha, atĂ«herĂ« mesazhi do tĂ« ruhet nĂ« tĂ« gjitha nyjet. NĂ«se caktohet vleranodes, atĂ«herĂ« mesazhi do tĂ« ruhet nĂ« nyje tĂ« caktuara tĂ« klasteritx-ha-nodesâ pĂ«rcakton nyjet me tĂ« cilat do tĂ« lidhet njĂ« radhĂ« e caktuarHA

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

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.

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ë :
//...
channel.QueueBind(
queue: queueName,
exchange: "my_exchange",
routingKey: "my_key",
arguments: null
);
//...queueâ emri i radhĂ«sexchangeâ emri i exchangeroutingKeyâ çelĂ«si i rutimitargumentsâ argumente opsionale

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:

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:

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
