{"id":73065,"date":"2020-03-06T20:42:13","date_gmt":"2020-03-06T17:42:13","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings"},"modified":"2020-03-06T20:42:13","modified_gmt":"2020-03-06T17:42:13","slug":"rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","title":{"rendered":"RabbitMQ. Parte 3. Entendiendo Queues y Bindings","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>Cola<\/code> (cola) \u2014 estructura de datos en disco o en memoria, que almacena enlaces a mensajes y entrega sus copias <code>consumidores<\/code> (consumidores). <code>Cola<\/code> representa un <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">Proceso Erlang<\/a><\/noindex> con estado (donde pueden almacenar los propios mensajes). 1.000 colas pueden ocupar alrededor de 80Mb.<\/p>\n<p><\/p>\n<p><code>Binding<\/code> (vinculaci\u00f3n) \u2014 regla que informa al intercambiador a qu\u00e9 cola deben ir los mensajes.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"oglavlenie\">Tabla de contenido<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/488654\/\">RabbitMQ. Parte 1. Introducci\u00f3n. Erlang, AMQP y RPC<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">RabbitMQ. Parte 2. Entendiendo Exchanges<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490960\/\">RabbitMQ. Parte 3. Entendiendo Queues y Bindings<\/a><\/noindex><\/li>\n<li>RabbitMQ. Parte 4. Entendiendo qu\u00e9 son los mensajes y los tramas<\/li>\n<li>RabbitMQ. Parte 5. Rendimiento de la publicaci\u00f3n y consumo de mensajes<\/li>\n<li>RabbitMQ. Parte 6. Resumen de los m\u00f3dulos Federation y Shovel<\/li>\n<li>RabbitMQ. Parte 7. Detalles sobre Connection y Channel<\/li>\n<li>RabbitMQ. Parte 8. RabbitMQ en .NET<\/li>\n<li>RabbitMQ. Parte 9. Monitoreo<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"vremennye-ocheredi\"><em>Colas temporales<\/em><\/h4>\n<p><\/p>\n<p>Si se crea una cola con el par\u00e1metro establecido <code>autoDelete<\/code>, esta cola adquiere la capacidad <strong>de eliminarse autom\u00e1ticamente<\/strong>. Estas colas generalmente se crean en el momento de la conexi\u00f3n del primer cliente y se eliminan cuando todos los clientes se han desconectado. <\/p>\n<p><\/p>\n<p>Si se crea una cola con el par\u00e1metro establecido <code>exclusive<\/code>, entonces esta cola <strong>permite que solo un consumidor se conecte<\/strong> y se elimina si se cierra el canal. Hasta que el canal no se cierre, el cliente puede desconectarse\/conectarse, pero solo dentro de la misma conexi\u00f3n. Si el par\u00e1metro <code>exclusive<\/code> est\u00e1 establecido, entonces el par\u00e1metro <code>autoDelete<\/code> no tiene ning\u00fan efecto.<\/p>\n<p><\/p>\n<p>Caracter\u00edsticas:<\/p>\n<p><\/p>\n<ul>\n<li>en caso de una desconexi\u00f3n moment\u00e1nea, perderemos mensajes que a\u00fan no han llegado al consumidor<\/li>\n<li>se puede experimentar el fen\u00f3meno <code>binding churn<\/code>. Este fen\u00f3meno ocurre cuando la cantidad de operaciones de creaci\u00f3n\/eliminaci\u00f3n de colas y vinculaciones alcanza valores muy altos. En modo cl\u00faster, este flujo de operaciones se distribuir\u00e1 por todos los nodos y generar\u00e1 una gran carga. Este proceso se puede optimizar controlando el n\u00famero de suscripciones<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"postoyannye-ocheredi\"><em>Colas permanentes<\/em><\/h4>\n<p><\/p>\n<p>Si se crea una cola con el par\u00e1metro establecido <code>durable<\/code>, entonces esta cola <strong>mantiene su estado<\/strong> y se restaura despu\u00e9s del reinicio del servidor\/intermediario. Esta cola existir\u00e1 hasta que se invoque el comando <code>Queue.Delete<\/code>. <\/p>\n<p><\/p>\n<h4 id=\"highly-available-ocheredi\"><em>Colas altamente disponibles<\/em><\/h4>\n<p><\/p>\n<p>Las colas HA requieren un entorno de cl\u00faster RabbitMQ. En modo cl\u00faster, toda la informaci\u00f3n sobre intercambiadores, colas, vinculaciones y consumidores se replicar\u00e1 en todos los nodos.<\/p>\n<p><\/p>\n<p>Cuando un mensaje se publica en alguna cola HA, se almacena en cada nodo relacionado con la cola HA. Despu\u00e9s de que se consume el mensaje en uno de los nodos, todas las copias de este mensaje se eliminar\u00e1n en los otros nodos. <\/p>\n<p><\/p>\n<p>Las colas HA pueden expandirse por todos los nodos en un cl\u00faster o solo en nodos individuales. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Parte 3. Entendiendo Queues y Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/46d560ab33e686ddf9adb0b18b4bb0b0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Caracter\u00edsticas:<\/p>\n<p><\/p>\n<ul>\n<li>El uso de colas HA conlleva penalizaciones en el rendimiento. Al colocar un mensaje en alguna cola HA o al consumir un mensaje de la cola HA, RabbitMQ debe coordinarse entre todos los nodos (2-3 nodos son generalmente suficientes).<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"sozdanie-ocheredi\"><em>Creaci\u00f3n de Cola<\/em><\/h4>\n<p><\/p>\n<p>La creaci\u00f3n de una cola se realiza mediante una solicitud sincr\u00f3nica <code>RPC<\/code> al servidor. La solicitud se lleva a cabo mediante el m\u00e9todo <code>Queue.Declare<\/code>, que se invoca con los par\u00e1metros:<\/p>\n<p><\/p>\n<ul>\n<li>nombre de la cola<\/li>\n<li>otros par\u00e1metros<\/li>\n<\/ul>\n<p><\/p>\n<p>Ejemplo de creaci\u00f3n de una cola mediante <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/dotnet.html\">RabbitMQ.Client<\/a><\/noindex>:<\/p>\n<p><\/p>\n<pre><code class=\"cs\">\/\/ ...\nchannel.QueueDeclare(\n    queue: &quot;my_queue&quot;,\n    durable: false,\n    exclusive: false,\n    autoDelete: false,\n    arguments: null\n);\n\/\/ ...<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><code>queue<\/code> \u2014 el nombre de la cola que deseamos crear. El nombre debe ser \u00fanico y no puede coincidir con el nombre del sistema de la cola.<\/li>\n<li><code>durable<\/code> \u2014 si es true, la cola ser\u00e1 <strong>capaz de conservar su estado<\/strong> y se restaurar\u00e1 despu\u00e9s de reiniciar el servidor\/broker.<\/li>\n<li><code>exclusive<\/code> \u2014 si es true, la cola permitir\u00e1 conectarse solo a un consumidor.<\/li>\n<li><code>autoDelete<\/code> \u2014 si es true, la cola obtiene la capacidad <strong>de eliminarse autom\u00e1ticamente<\/strong><\/li>\n<li><code>arguments<\/code> \u2014 argumentos opcionales. A continuaci\u00f3n, analizaremos en detalle.<\/li>\n<\/ul>\n<p><\/p>\n<h5 id=\"arguments\"><em>arguments<\/em><\/h5>\n<p><\/p>\n<ul>\n<li><code>x-message-ttl<\/code>(<code>x-message-time-to-live<\/code>) \u2014 permite establecer el tiempo de vida del mensaje en milisegundos. Si la creaci\u00f3n de la cola se realiza con un valor establecido para el argumento <code>x-message-ttl<\/code>, esa cola <strong>excluir\u00e1 autom\u00e1ticamente los mensajes cuya fecha de caducidad haya pasado.<\/strong>. Establecer el valor del argumento <code>x-message-ttl<\/code> define la edad m\u00e1xima para todos los mensajes en esta cola. Crear dicha cola <strong>ayuda a prevenir la recepci\u00f3n de informaci\u00f3n desactualizada.<\/strong>. Esto se puede usar en sistemas en tiempo real. Si la cola para la que se ha establecido un intercambio para mensajes rechazados tiene un valor establecido para el argumento <code>x-message-ttl<\/code>, los mensajes rechazados en esta cola <strong>comenzar\u00e1n a tener un tiempo de vida.<\/strong>.<\/li>\n<li><code>x-expires<\/code> \u2014 establece un valor en milisegundos despu\u00e9s del cual la cola se elimina. La cola puede agotar su tiempo de vida solo si no tiene suscriptores. Si hay suscriptores conectados a la cola, solo podr\u00e1 eliminarse autom\u00e1ticamente cuando todos los suscriptores invoquen <code>Basic.Cancel<\/code> o se desconecten. La vida \u00fatil de la cola solo puede finalizar si no ha habido solicitudes a ella <code>Basic.Get<\/code>. De lo contrario, el valor actual del tiempo de vida se restablece, y la cola ya no se eliminar\u00e1 autom\u00e1ticamente. Tambi\u00e9n <strong>no hay garant\u00edas sobre la rapidez con la que se elimina la cola despu\u00e9s de que haya caducado<\/strong>.<\/li>\n<li><code>x-max-length<\/code> \u2014 define el n\u00famero m\u00e1ximo de mensajes en la cola. Si la cantidad de mensajes en la cola comienza a superar la cantidad m\u00e1xima, se eliminar\u00e1n los m\u00e1s antiguos<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Parte 3. Entendiendo Queues y Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/738f23dcfdd173a66be619032b46c5cc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li><code>x-max-length-bytes<\/code> \u2014 establece el tama\u00f1o total m\u00e1ximo permitido de la carga \u00fatil de los mensajes en la cola. Cuando se supera el valor establecido (se produce un desbordamiento de la cola al publicar un nuevo mensaje), se comenzar\u00e1n a eliminar los mensajes m\u00e1s antiguos<\/li>\n<li><code>x-overflow<\/code> \u2014 este argumento se utiliza para configurar el comportamiento como resultado del desbordamiento de la cola. Hay dos valores disponibles: <code>drop-head<\/code> (valor predeterminado) y <code>reject-publish<\/code>. Si se selecciona <code>drop-head<\/code>, los mensajes m\u00e1s antiguos se eliminar\u00e1n. Si se elige <code>reject-publish<\/code>, la aceptaci\u00f3n de mensajes se suspender\u00e1<\/li>\n<li><code>x-dead-letter-exchange<\/code> \u2014 define el exchange al que se env\u00edan los mensajes rechazados que no se vuelven a poner en cola<\/li>\n<li><code>x-dead-letter-routing-key<\/code> \u2014 define una clave de enrutamiento opcional para los mensajes rechazados<\/li>\n<li><code>x-max-priority<\/code> \u2014 permite la clasificaci\u00f3n por prioridades en la cola con un valor de prioridad m\u00e1xima de 255 (RabbitMQ versiones 3.5.0 y superiores). El n\u00famero indica la prioridad m\u00e1xima que admitir\u00e1 la cola. Si el argumento no est\u00e1 establecido, la cola no admitir\u00e1 la prioridad de los mensajes<\/li>\n<li><code>x-queue-mode<\/code> \u2014 permite poner la cola en <strong>modo perezoso<\/strong>. En este modo, se almacenar\u00e1n en disco la mayor cantidad posible de mensajes. El uso de la memoria RAM ser\u00e1 m\u00ednimo. Si no se establece, la cola almacenar\u00e1 los mensajes en memoria para entregar los mensajes lo m\u00e1s r\u00e1pido posible<\/li>\n<li><code>x-queue-master-locator<\/code> \u2014 si tenemos un cl\u00faster, se puede definir la cola maestra<\/li>\n<li><code>x-ha-policy<\/code> \u2014 se utiliza al crear colas HA y define c\u00f3mo se distribuir\u00e1 el mensaje entre los nodos. Si se establece el valor <code>todo<\/code>, el mensaje se guardar\u00e1 en todos los nodos. Si se establece el valor <code>nodes<\/code>, el mensaje se guardar\u00e1 en nodos espec\u00edficos del cl\u00faster<\/li>\n<li><code>x-ha-nodes<\/code> \u2014 define los nodos que estar\u00e1n relacionados con una determinada cola <code>HA<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Parte 3. Entendiendo Queues y Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/a8f660b6c0a43626e4025cf7769a4425.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si se crea una cola <strong>posiblemente<\/strong>, el servidor enviar\u00e1 al cliente un <code>RPC<\/code> una respuesta <code>Queue.DeclareOk<\/code>. Si la creaci\u00f3n de la cola <strong>no es posible<\/strong> (se produjo un error en la solicitud <code>Queue.Declare<\/code>), entonces <strong>el canal se cerrar\u00e1<\/strong> por el servidor mediante el comando <code>Channel.Close<\/code> y el cliente recibir\u00e1 una excepci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/releases\/rabbitmq-dotnet-client\/v3.6.10\/rabbitmq-dotnet-client-3.6.10-client-htmldoc\/html\/type-RabbitMQ.Client.Exceptions.OperationInterruptedException.html\">OperationInterruptedException<\/a><\/noindex>, que contendr\u00e1 un c\u00f3digo de error y su descripci\u00f3n. <\/p>\n<p><\/p>\n<p><strong>Llamada repetida<\/strong> <code>Queue.Declare<\/code> <strong>con par\u00e1metros similares<\/strong> devolver\u00e1 informaci\u00f3n \u00fatil sobre esta cola. Por ejemplo, el n\u00famero total de mensajes en espera en esta cola y el n\u00famero total de consumidores suscritos a ella. <\/p>\n<p><\/p>\n<p>mountsnoop.py <code>Queue.Declare<\/code> con las credenciales de un usuario que no tiene los derechos necesarios <strong>cerrar\u00e1 el canal<\/strong> mediante el comando <code>Channel.Close<\/code> y el cliente recibir\u00e1 una excepci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/releases\/rabbitmq-dotnet-client\/v3.6.10\/rabbitmq-dotnet-client-3.6.10-client-htmldoc\/html\/type-RabbitMQ.Client.Exceptions.OperationInterruptedException.html\">OperationInterruptedException<\/a><\/noindex>, que contendr\u00e1 un c\u00f3digo de error <noindex><a rel=\"nofollow\" href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/HTTP\/Status\/403\">403<\/a><\/noindex> y su descripci\u00f3n.<\/p>\n<p><\/p>\n<p>Despu\u00e9s de que la cola haya estado inactiva durante &gt;= 10 segundos, ella <strong>entra en modo de suspensi\u00f3n<\/strong>, llamando a GC en la cola, lo que resulta en una reducci\u00f3n significativa de la memoria necesaria para esta cola.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-queue-cherez-graficheskiy-interfeys\"><em>Creaci\u00f3n de Queue a trav\u00e9s de la interfaz gr\u00e1fica<\/em><\/h4>\n<p><\/p>\n<p>Accedemos al panel de administraci\u00f3n <code>RabbitMQ<\/code> con el usuario <code>invitado<\/code> (nombre de usuario: <code>invitado<\/code> y contrase\u00f1a: <code>invitado<\/code>). Tenga en cuenta que el usuario <code>invitado<\/code> solo puede conectarse desde el host local. Ahora vamos a la pesta\u00f1a <code>Colas<\/code> y hacemos clic en <code>Agregar una nueva cola<\/code>. Llenamos las propiedades:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Parte 3. Entendiendo Queues y Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/ea77a406ad16f0871c7197e96a66818f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Una vez que introduzcamos todos los datos necesarios y hagamos clic en <code>Agregar colas<\/code>, la cola aparecer\u00e1 en la lista general.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Parte 3. Entendiendo Queues y Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/8342e044a0d6c0a035a2c9f646035cad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hacer clic en el nombre de la cola mostrar\u00e1 su informaci\u00f3n detallada. Aqu\u00ed se puede configurar la vinculaci\u00f3n entre el intercambio y la cola, ver la lista <code>consumidores<\/code>, publicar\/recibir mensajes, eliminar la cola y ver las estad\u00edsticas.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding\"><em>Creaci\u00f3n de Binding<\/em><\/h4>\n<p><\/p>\n<p>La creaci\u00f3n de la vinculaci\u00f3n se realiza mediante la llamada sincr\u00f3nica <code>RPC<\/code> al servidor. La solicitud se lleva a cabo mediante el m\u00e9todo <code>Queue.Bind<\/code>, que se invoca con los par\u00e1metros:<\/p>\n<p><\/p>\n<ul>\n<li>nombre de la cola<\/li>\n<li>nombre del punto de intercambio<\/li>\n<li>otros par\u00e1metros<\/li>\n<\/ul>\n<p><\/p>\n<p>Ejemplo de creaci\u00f3n de una vinculaci\u00f3n mediante <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/dotnet.html\">RabbitMQ.Client<\/a><\/noindex>:<\/p>\n<p><\/p>\n<pre><code class=\"cs\">\/\/...\nchannel.QueueBind(\n    queue: queueName,\n    exchange: &quot;my_exchange&quot;,\n    routingKey: &quot;my_key&quot;,\n    arguments: null\n);\n\/\/...<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><code>queue<\/code> \u2014 nombre de la cola<\/li>\n<li><code>exchange<\/code> \u2014 nombre del intercambiador<\/li>\n<li><code>routingKey<\/code> \u2014 clave de enrutamiento<\/li>\n<li><code>arguments<\/code> \u2014 argumentos opcionales<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Parte 3. Entendiendo Queues y Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/9123186c94a822309b679f26c2e511ea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si la creaci\u00f3n de la vinculaci\u00f3n <strong>posiblemente<\/strong>, el servidor enviar\u00e1 al cliente un <code>RPC<\/code> una respuesta <code>Queue.BindOk<\/code>.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding-cherez-graficheskiy-interfeys\"><em>Creaci\u00f3n de Binding a trav\u00e9s de la interfaz gr\u00e1fica<\/em><\/h4>\n<p><\/p>\n<p>Accedemos al panel de administraci\u00f3n <code>RabbitMQ<\/code> con el usuario <code>invitado<\/code> (nombre de usuario: <code>invitado<\/code> y contrase\u00f1a: <code>invitado<\/code>). Tenga en cuenta que el usuario <code>invitado<\/code> solo puede conectarse desde el host local. Ahora vamos a la pesta\u00f1a <code>Colas<\/code> y hacemos clic en la cola <code>my_queue<\/code>. Llenamos los campos de la secci\u00f3n <code>enlaces<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Parte 3. Entendiendo Queues y Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/7db6b42a4f29a1860aabe54ade0b6833.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Una vez que introduzcamos todos los datos necesarios y hagamos clic en <code>Vincular<\/code>, la vinculaci\u00f3n se mostrar\u00e1 en la lista general:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Parte 3. Entendiendo Queues y Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/499eda8e8cb061e6feb75c471eb64b92.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"code\">C\u00f3digo<\/h3>\n<p><\/p>\n<p>En esta secci\u00f3n describiremos la cola y la vinculaci\u00f3n con c\u00f3digo en C#, como si tuvi\u00e9ramos que desarrollar una biblioteca. Esto podr\u00eda ser \u00fatil para la comprensi\u00f3n.<\/p>\n<p><\/p>\n<pre><code class=\"cs\">interfaz p\u00fablica IQueue\n    {        \n        cadena Nombre { obtener; }\n\n        \/\/ \n        \/\/     Si se establece en verdadero, la cola ser\u00e1 persistente. \n        \/\/     Se almacenar\u00e1 en el disco y podr\u00e1 \n        \/\/     sobrevivir a un reinicio del servidor\/broker. \n        \/\/     Si el valor es falso, la cola ser\u00e1 temporal y se eliminar\u00e1, \n        \/\/     cuando el servidor\/broker se reinicie\n        \/\/ \n        bool EsDuradera { obtener; }\n\n        \/\/ \n        \/\/     Si el valor es verdadero, \n        \/\/     tal cola permitir\u00e1 la conexi\u00f3n \n        \/\/     solo a un consumidor\n        \/\/ \n        bool EsExclusiva { obtener; }\n\n        \/\/ \n        \/\/     Eliminaci\u00f3n autom\u00e1tica. \n        \/\/     La cola se eliminar\u00e1 cuando todos los clientes se desconecten.\n        \/\/ \n        bool EsAutoEliminar { obtener; }\n\n        \/\/ \n        \/\/     Argumentos opcionales\n        \/\/ \n        IDictionary Argumentos { obtener; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">public class Queue : IQueue\n    {\n        public Queue(\n             string name, \n             bool isDurable = true, \n             bool isExclusive = false, \n             bool isAutoDelete = false, \n             IDictionary arguments = null)\n        {\n            Name = name ??\n                throw new ArgumentNullException(name, $\"{name} no debe ser nulo\");\n\n            IsDurable = isDurable;\n            IsExclusive = isExclusive;\n            IsAutoDelete = isAutoDelete;\n            Arguments = arguments ?? new Dictionary();\n        }\n\n        public string Name { get; }\n        public bool IsDurable { get; }\n        public bool IsExclusive { get; }\n        public bool IsAutoDelete { get; }\n        public IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">public static class QueueMode\n    {       \n        public const string Default = \"default\";\n        \/\/\/\/\/\/ <summary>\n        \/\/\/\/\/\/     Modo perezoso. El modo perezoso obliga a guardar \n        \/\/\/\/\/\/     la mayor cantidad de mensajes posible en el disco para reducir \n        \/\/\/\/\/\/     el uso de memoria RAM\n        \/\/\/\/\/\/ <\/summary>\n        public const string Lazy = \"lazy\";\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">interfaz p\u00fablica IBinding\n    {\n        \/\/ \n        \/\/     Intercambiador que se conectar\u00e1 con el enlace\n        \/\/ \n        IExchange Intercambio { obtener; }\n\n        \/\/ \n        \/\/     Clave de enrutamiento\n        \/\/ \n        cadena ClaveDeEnrutamiento { obtener; }\n\n        \/\/ \n        \/\/     Argumentos opcionales\n        \/\/ \n        IDictionary Argumentos { obtener; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">clase p\u00fablica Binding : IBinding\n    {\n        public Binding(\n             IExchange intercambio, \n             cadena claveDeEnrutamiento, \n             IDictionary argumentos)\n        {\n            Intercambio = intercambio;\n            ClaveDeEnrutamiento = claveDeEnrutamiento;\n            Argumentos = argumentos;\n        }\n\n        public IExchange Intercambio { obtener; }\n        public cadena ClaveDeEnrutamiento { obtener; }\n        public IDictionary Argumentos { obtener; }\n    }<\/code><\/pre>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490960\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c). Queue \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 Erlang-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c (\u0433\u0434\u0435 \u043c\u043e\u0433\u0443\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u0430\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f). 1 \u0442\u044b\u0441\u044f\u0447\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u0430 80Mb. Binding (\u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430) \u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a\u0443 \u0432 \u043a\u0430\u043a\u0443\u044e \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":73066,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-73065","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c).\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47RabbitMQ. \u0427\u0430\u0441\u0442\u044c 3. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 Queues \u0438 Bindings | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c).\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-06T17:42:13+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-06T17:42:13+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47RabbitMQ. Parte 3. Entendiendo las colas y los enlaces | ProHoster","description":"Queue (cola) \u2014 una estructura de datos en el disco o en la memoria RAM que almacena referencias a mensajes y les entrega copias a los consumidores.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47RabbitMQ. \u0427\u0430\u0441\u0442\u044c 3. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 Queues \u0438 Bindings | ProHoster","og:description":"Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c).","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-06T17:42:13+00:00","article:modified_time":"2020-03-06T17:42:13+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"73065","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:41:06","updated":"2022-09-30 05:07:23","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/73065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=73065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/73065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/73066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=73065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=73065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=73065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}