RabbitMQ. Parte 3. Compreendendo filas e ligações

Queue(fila) - uma estrutura de dados no disco ou na RAM que armazena links para mensagens e fornece suas cópias consumers(para consumidores). QueueÉ um processo Erlang com um estado (onde as próprias mensagens podem ser armazenadas em cache). 1.000 filas podem ocupar cerca de 80Mb.


Binding (ligação) - uma regra que informa ao trocador qual das filas deve receber mensagens.


ĂŤndice



Filas temporárias


Se a fila for criada com o conjunto de parâmetros autoDelete, essa fila adquirirá a capacidade de excluir-se automaticamente . Essas filas geralmente são criadas quando o primeiro cliente se conecta e são excluídas quando todos os clientes se desconectam.


exclusive, . , /, . exclusive , autoDelete .


:


  • ,
  • binding churn. , / . .


durable, /. Queue.Delete.


Highly Available


HA RabbitMQ. , , .


- HA , , HA . - , .


HA .


rabbitmq_26


:


  • HA . HA HA RabbitMQ (2-3 )


RPC . Queue.Declare, :



RabbitMQ.Client:


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

  • queue — , .
  • durable — true, /
  • exclusive — true,
  • autoDelete — true,
  • arguments — . .

arguments

  • x-message-ttl(x-message-time-to-live) — . x-message-ttl, , . x-message-ttl . . . x-message-ttl, .
  • x-expires — . . , , Basic.Cancel . , Basic.Get. , . , .
  • x-max-length — . ,

rabbitmq_25


  • x-max-lenght-bytes — . ( )
  • x-overflow — . : drop-head ( ) reject-publish. drop-head, . reject-publish,
  • x-dead-letter-exchange — exchange, ,
  • x-dead-letter-routing-key —
  • x-max-priority — 255 (RabbitMQ 3.5.0 ). , . ,
  • x-queue-mode — . . . , , ,
  • x-queue-master-locator — ,
  • x-ha-policy — HA . all, . nodes,
  • x-ha-nodes — , HA

rabbitmq_10


, RPC Queue.DeclareOk. ( Queue.Declare), Channel.Close OperationInterruptedException, .


Queue.Declare . , , , .


Queue.Declare , Channel.Close OperationInterruptedException, 403 .


, >= 10 , , GC , , .


Queue


RabbitMQ guest (username: guest password: guest). , guest . Queues Add a new queue. :


rabbitmq_21


Add queues, .


rabbitmq_22


. , consumers, / , .


Binding


RPC . Queue.Bind, :



RabbitMQ.Client:


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

  • queue —
  • exchange —
  • routingKey —
  • arguments —

rabbitmq_11


, RPC Queue.BindOk.


Binding


RabbitMQ guest (username: guest password: guest). , guest . Queues my_queue. bindings:


rabbitmq_23


Bind, :


rabbitmq_24


Code


Nesta seção, descrevemos a fila e a ligação usando o código C #, portanto, se precisarmos desenvolver uma biblioteca. Talvez seja útil para a percepção.


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; }
    }

All Articles