RabbitMQ. Part 3. Capisce i Queues è Bindings

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 prucessu Erlang 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

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.

RabbitMQ. Part 3. Capisce i Queues è Bindings

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 RabbitMQ.Client:

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

  • queue hè 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 fila
  • durable - se vera, allora a fila serà salvà u vostru statu è hè restauratu dopu à u riavviu di u servitore / broker
  • exclusive - s'ellu hè veru, allora a fila permetterà solu un cunsumadore per cunnette
  • autoDelete - s'ellu hè veru, allora a fila acquista a capacità sguassate automaticamente
  • arguments sò 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'argumentu x-message-ttl, allura una tale fila serà esclude automaticamente i missaghji chì sò scaduti. Stabbilimentu di u valore di un argumentu x-message-ttl stabilisce 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'argumentu x-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 chjamanu Basic.Cancel o disconnect. Una fila pò scade solu s'ellu ùn hè micca statu dumandatu Basic.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.

RabbitMQ. Part 3. Capisce i Queues è Bindings

  • 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 sguassati
  • x-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 sceglite drop-head, tandu i missaghji più antichi seranu sguassati. Se sceglite reject-publish, tandu riceve missaghji serà sospesa
  • x-dead-letter-exchange - specifica u scambiu à quale i missaghji scartati chì ùn sò micca requeued sò mandati
  • x-dead-letter-routing-key - stabilisce una chjave di routing opzionale per i missaghji rifiutati
  • x-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 maestra
  • x-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 cluster
  • x-ha-nodes - stabilisce i nodi à quale appartene una certa fila HA

RabbitMQ. Part 3. Capisce i Queues è Bindings

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 OperationInterruptedException, 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 OperationInterruptedException, chì cuntene u codice d'errore 403 è 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à:

RabbitMQ. Part 3. Capisce i Queues è Bindings

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

RabbitMQ. Part 3. Capisce i Queues è Bindings

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 RabbitMQ.Client:

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

  • queue - nome di fila
  • exchange - nome di u scambiu
  • routingKey - chjave di routing
  • arguments - argumenti facultativi

RabbitMQ. Part 3. Capisce i Queues è Bindings

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:

RabbitMQ. Part 3. Capisce i Queues è Bindings

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

RabbitMQ. Part 3. Capisce i Queues è Bindings

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

Cumprate un hosting affidabile per i siti cù prutezzione DDoS, servitori VPS VDS 🔥 Cumprate un hosting di siti web affidabile cù prutezzione DDoS, servitori VPS VDS | ProHoster