Queue (queue) - una struttura di dati nantu à u discu o in RAM chì guarda ligami à i missaghji è dà copie di elli consumers (à i cunsumatori). Queue hè una stateful (induve i missaghji stessi ponu esse in cache). 1 mila fila pò piglià circa 80 Mb.
Binding (binding) - una regula chì dice à u scambiu in quale di e fila i messagi duveranu falà.
Indice di cuntenutu
- RabbitMQ. Part 4. Trattamentu di ciò chì hè missaghji è frames
- RabbitMQ. Part 5: Publishing and Consuming Message Performance
- RabbitMQ. Part 6. Overview of the Federation and Shovel Modules
- RabbitMQ. Part 7. Details about Connection and Chanel
- RabbitMQ. Part 8. RabbitMQ in .NET
- RabbitMQ. Part 9. Monitoring
Queues Temporanee
Se a creazione di a fila si faci cù u paràmetru stabilitu autoDelete, allura una tale fila acquista a capacità sguassate automaticamente. Tali file sò generalmente creati quandu u primu cliente si cunnetta è sò sguassati quandu tutti i clienti sò stati disconnected.
Se a creazione di a fila si faci cù u paràmetru stabilitu exclusive, allora una tale fila permette solu un utilizatore per cunnette è hè sguassatu se u canali chjude. Finu chì u canali hè chjusu, u cliente pò disconnect / cunnette, ma solu in a stessa cunnessione. Se u paràmetru exclusive stabilitu, dopu u paràmetru autoDelete ùn hà micca effettu.
Funzioni:
- in casu di una breve pausa in a cumunicazione, perdemu i missaghji chì ùn anu micca ancu ghjuntu à u cunsumadore
- pudete catturà u fenomenu
binding churn. U fenomenu accade quandu u nùmeru di operazioni per creà / sguassate file è ligami righjunghji valori assai grande. In u modu cluster, un tali flussu di operazioni si sparghjerà in tutti i nodi è creanu una grande carica. Stu prucessu pò esse ottimisatu cuntrullà u numeru di abbonamenti
Fila permanente
Se a creazione di a fila si faci cù u paràmetru stabilitu durable, allora una tale fila salva u so statu è hè restauratu dopu à u riavviu di u servitore / broker. Questa fila esisterà finu à chì u cumandamentu hè chjamatu Queue.Delete.
Queues altamente dispunibili
I file HA necessitanu un ambiente di cluster RabbitMQ. In u modu cluster, tutte l'infurmazioni nantu à i scambiatori, fila, ligami è cunsumatori seranu copiati in tutti i nodi.
Quandu un messagiu hè publicatu in una fila HA, hè almacenatu in ogni node chì appartene à a fila HA. Quandu un messagiu hè cunsumatu in unu di i nodi, tutte e copie di quellu messagiu seranu sguassate nantu à l'altri nodi.
I fili HA ponu copre tutti i nodi in un cluster, o solu i nodi individuali.

Funzioni:
- l'usu di file HA si traduce in penalità di rendiment. Quandu mette un missaghju nantu à una fila HA o quandu cunsuma un missaghju da una fila HA, RabbitMQ deve coordinate in tutti i nodi (2-3 nodi sò generalmente abbastanza)
Crea una fila
A fila hè creata cù sincronia RPC dumanda à u servitore. A dumanda hè fatta cù u metudu Queue.Declarechjamatu cù parametri:
- nome di fila
- altre opzioni
Un esempiu di creazione di una fila cù l'usu :
// ...
channel.QueueDeclare(
queue: "my_queue",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null
);
// ...queuehè u nome di a fila chì vulemu creà. U nome deve esse unicu è ùn pò micca esse uguali à u nome di u sistema di a filadurable- se vera, allora a fila serà salvà u vostru statu è hè restauratu dopu à u riavviu di u servitore / brokerexclusive- s'ellu hè veru, allora a fila permetterà solu un cunsumadore per cunnetteautoDelete- s'ellu hè veru, allora a fila acquista a capacità sguassate automaticamenteargumentssò argumenti opzionali. Quì sottu analizzeremu in più detail.
argumenti
x-message-ttl(x-message-time-to-live) - permette di stabilisce u tempu di scadenza di u messagiu in millisecondi. Se a creazione di a fila si faci cù u valore di l'argumentux-message-ttl, allura una tale fila serà esclude automaticamente i missaghji chì sò scaduti. Stabbilimentu di u valore di un argumentux-message-ttlstabilisce l'età massima per tutti i missaghji in questa fila. Crià una tale fila aiuta à prevene l'infurmazioni obsoleti. Questu pò esse usatu in sistemi in tempu reale. Se a fila per quale u scambiu per i missaghji rifiutati hè stabilitu, stabilisce u valore di l'argumentux-message-ttl, dopu rifiutatu i missaghji in questa fila cumincià à avè una vita.x-expires- stabilisce u valore in millisecondi dopu chì a fila hè sguassata. Una fila pò scade solu s'ellu ùn hà micca abbonati. Se l'abbonati sò cunnessi à a fila, pò esse sguassatu automaticamente solu quandu tutti l'abbonati chjamanuBasic.Cancelo disconnect. Una fila pò scade solu s'ellu ùn hè micca statu dumandatuBasic.Get. Altrimenti, u valore attuale di l'impostazione di u tempu di vita hè resettatu à zero, è a fila ùn serà più sguassata automaticamente. Ancu ùn ci hè micca una garanzia di quantu rapidamente una fila hè sguassata dopu a so vita hè scaduta.x-max-length- stabilisce u numeru massimu di missaghji in a fila. Se u numeru di missaghji in a fila cumencia à superà u numeru massimu, allura i più vechji cumincianu à esse sguassati.

x-max-lenght-bytes- stabilisce a dimensione massima di a carica utile totale permessa di i missaghji in a fila. Se u valore stabilitu hè superatu (a fila sboccata durante a prossima publicazione di missaghju), i missaghji più antichi seranu sguassatix-overflow- Stu argumentu hè utilizatu per persunalizà u cumpurtamentu cum'è u risultatu di u overflow di fila. Dui valori sò dispunibuli:drop-head(default) èreject-publish. Se sceglitedrop-head, tandu i missaghji più antichi seranu sguassati. Se sceglitereject-publish, tandu riceve missaghji serà sospesax-dead-letter-exchange- specifica u scambiu à quale i missaghji scartati chì ùn sò micca requeued sò mandatix-dead-letter-routing-key- stabilisce una chjave di routing opzionale per i missaghji rifiutatix-max-priority- permette l'ordine per priorità in a fila cù un valore di priorità massimu di 255 (versioni RabbitMQ 3.5.0 è superiore). U numeru specifica a priorità massima chì a fila sustene. Se l'argumentu ùn hè micca stabilitu, a fila ùn mantene micca a priorità di u messagiu.x-queue-mode- permette di trasfiriri a fila à modu lazy. In questu modu, quant'è parechji missaghji pussibule seranu guardati in u discu. L'usu di RAM serà minimu. In casu ùn hè micca stabilitu, a fila mantene i missaghji in memoria per trasmette i missaghji u più prestu pussibule.x-queue-master-locator- se avemu un cluster, allora pudemu stabilisce a fila maestrax-ha-policy- utilizatu quandu creanu file HA è determina cumu u messagiu serà distribuitu à i nodi. Se pusatu àall, allura u messagiu serà guardatu in tutti i nodi. Se pusatu ànodes, allura u messagiu serà guardatu in certi nodi di clusterx-ha-nodes- stabilisce i nodi à quale appartene una certa filaHA

Se crea una fila hè possibile, allura u servitore mandarà à u cliente una sincronia RPC risposta Queue.DeclareOk. Se crea una fila hè impussibule (Ci hè statu un rifiutu nantu à a dumanda Queue.Declare), allora u canale si chjuderà servitore cù u cumandimu Channel.Close è u cliente riceverà una eccezzioni , chì cuntene u codice d'errore è a so descrizzione.
Ricurdativi Queue.Declare cù paràmetri simili restituverà infurmazioni utili nantu à quella fila. Per esempiu, u numeru tutale di missaghji chì aspettanu in questa fila è u numeru tutale di cunsumatori abbonati.
Challenge Queue.Declare sottu i credenziali di un utilizatore chì ùn hè micca statu attribuitu i diritti necessarii chjuderà u canali usendu u cumandamentu Channel.Close è u cliente riceverà una eccezzioni , chì cuntene u codice d'errore è a so descrizzione.
Dopu chì a fila hè stata inattiva per>= 10 seconde, hè entra in modu di sonnu, chjamendu u GC nantu à a fila, risultatu in una riduzione significativa di a memoria necessaria per quella fila.
Crea una fila via a GUI
Andà à u panel admin RabbitMQ sottu utilizatore guest (nome d'utilizatore: guest è password: guest). Per piacè nutate chì l'utilizatore guest pò cunnette solu da u locale host. Avà andemu à a tabulazione Queues è cliccate nant'à Add a new queue. Inserite e proprietà:

Appena avemu entre tutti i dati nicissarii è cliccate nant'à Add queues, a fila apparirà in a lista generale.

Cliccà nant'à u nome di una fila mostrarà a so infurmazione dettagliata. Quì pudete cunfigurà u ligame trà u scambiu è a fila, vede a lista consumers, pubblicà / riceve missaghji, sguassate a fila è vede statistiche.
Crià un Binding
U ligame hè creatu cù un sincronu RPC dumanda à u servitore. A dumanda hè fatta cù u metudu Queue.Bindchjamatu cù parametri:
- nome di fila
- nomu puntu di scambiu
- altre opzioni
Un esempiu di creazione di un ligame usendu :
//...
channel.QueueBind(
queue: queueName,
exchange: "my_exchange",
routingKey: "my_key",
arguments: null
);
//...queue- nome di filaexchange- nome di u scambiuroutingKey- chjave di routingarguments- argumenti facultativi

Se crea un ligame hè possibile, allura u servitore mandarà à u cliente una sincronia RPC risposta Queue.BindOk.
Creazione di un Binding attraversu a GUI
Andà à u panel admin RabbitMQ sottu utilizatore guest (nome d'utilizatore: guest è password: guest). Per piacè nutate chì l'utilizatore guest pò cunnette solu da u locale host. Avà andemu à a tabulazione Queues è cliccate nant'à a fila my_queue. Riempite i campi di a rùbbrica bindings:

Una volta avemu entre tutti i dati nicissarii è cliccate nant'à Bind, u ligame serà affissatu in a lista generale:

codice
In questa sezione, descriveremu a fila è u ligame cù u codice C#, cum'è se avemu bisognu di sviluppà una biblioteca. Forsi questu serà utile per a percepzione.
public interface IQueue
{
string Name { get; }
/// <summary>
/// Если установить true, то queue будет являться постоянным.
/// Она будет храниться на диске и сможет
/// пережить перезапуск сервера/брокера.
/// Если значение false, то queue является временной и будет удаляться,
/// когда сервер/брокер будет перезагружен
/// </summary>
bool IsDurable { get; }
/// <summary>
/// Если значение равно true, то
/// такая очередь будет разрешать подключаться
/// только одному consumer-у
/// </summary>
bool IsExclusive { get; }
/// <summary>
/// Автоматическое удаление.
/// Очередь будет удалена, когда все клиенты отсоединятся.
/// </summary>
bool IsAutoDelete { get; }
/// <summary>
/// Необязательные аргументы
/// </summary>
IDictionary<string, object> Arguments { get; }
}public class Queue : IQueue
{
public Queue(
string name,
bool isDurable = true,
bool isExclusive = false,
bool isAutoDelete = false,
IDictionary<string, object> arguments = null)
{
Name = name ??
throw new ArgumentNullException(name, $"{name} must not be null");
IsDurable = isDurable;
IsExclusive = isExclusive;
IsAutoDelete = isAutoDelete;
Arguments = arguments ?? new Dictionary<string, object>();
}
public string Name { get; }
public bool IsDurable { get; }
public bool IsExclusive { get; }
public bool IsAutoDelete { get; }
public IDictionary<string, object> Arguments { get; }
}public static class QueueMode
{
public const string Default = "default";
/// <summary>
/// Ленивый режим. Ленивый режим заставит сохранять
/// как можно больше сообщений на диске, чтобы уменьшить
/// использование оперативной памяти
/// </summary>
public const string Lazy = "lazy";
}public interface IBinding
{
/// <summary>
/// Обменник, который будет связываться привязкой
/// </summary>
IExchange Exchange { get; }
/// <summary>
/// Ключ маршрутизации
/// </summary>
string RoutingKey { get; }
/// <summary>
/// Необязательные аргументы
/// </summary>
IDictionary<string, object> Arguments { get; }
}public class Binding : IBinding
{
public Binding(
IExchange exchange,
string routingKey,
IDictionary<string, object> arguments)
{
Exchange = exchange;
RoutingKey = routingKey;
Arguments = arguments;
}
public IExchange Exchange { get; }
public string RoutingKey { get; }
public IDictionary<string, object> Arguments { get; }
}Source: www.habr.com
