{"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\/fr\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","title":{"rendered":"RabbitMQ. Partie 3. Comprendre les Queues et les Bindings","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>Queue<\/code> (file d'attente) \u2014 une structure de donn\u00e9es sur disque ou en m\u00e9moire qui stocke des r\u00e9f\u00e9rences aux messages et en restitue des copies. <code>consumers<\/code> (pour les consommateurs). <code>Queue<\/code> est un <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">Processus Erlang<\/a><\/noindex> avec un \u00e9tat (o\u00f9 les messages eux-m\u00eames peuvent \u00eatre mis en cache). 1 000 files d'attente peuvent occuper environ 80 Mo.<\/p>\n<p><\/p>\n<p><code>Binding<\/code> (liaison) \u2014 une r\u00e8gle qui indique au courtier dans quelle file d'attente les messages doivent \u00eatre envoy\u00e9s.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"oglavlenie\">Table des mati\u00e8res<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/488654\/\">RabbitMQ. Partie 1. Introduction. Erlang, AMQP et RPC<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">RabbitMQ. Partie 2. Comprenons les Exchanges<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490960\/\">RabbitMQ. Partie 3. Comprendre les Queues et les Bindings<\/a><\/noindex><\/li>\n<li>RabbitMQ. Partie 4. Comprendre ce que sont les messages et les trames<\/li>\n<li>RabbitMQ. Partie 5. Performance de publication et de consommation des messages<\/li>\n<li>RabbitMQ. Partie 6. Aper\u00e7u des modules Federation et Shovel<\/li>\n<li>RabbitMQ. Partie 7. D\u00e9tails sur la connexion et le canal<\/li>\n<li>RabbitMQ. Partie 8. RabbitMQ sous .NET<\/li>\n<li>RabbitMQ. Partie 9. Surveillance<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"vremennye-ocheredi\"><em>Files d'attente temporaires<\/em><\/h4>\n<p><\/p>\n<p>Si la cr\u00e9ation de la file d'attente se fait avec le param\u00e8tre <code>autoDelete<\/code>, alors cette file d'attente acquiert la capacit\u00e9 <strong>de se supprimer automatiquement<\/strong>. Ces files d'attente sont g\u00e9n\u00e9ralement cr\u00e9\u00e9es lors de la connexion du premier client et supprim\u00e9es lorsque tous les clients se d\u00e9connectent. <\/p>\n<p><\/p>\n<p>Si la cr\u00e9ation de la file d'attente se fait avec le param\u00e8tre <code>exclusive<\/code>, alors cette file d'attente <strong>n'autorise qu'un seul consommateur \u00e0 se connecter<\/strong> et est supprim\u00e9e si le canal se ferme. Tant que le canal n'est pas ferm\u00e9, le client peut se d\u00e9connecter\/se reconnecter, mais uniquement dans le cadre de la m\u00eame connexion. Si le param\u00e8tre <code>exclusive<\/code> est fix\u00e9, alors le param\u00e8tre <code>autoDelete<\/code> n'a aucun effet.<\/p>\n<p><\/p>\n<p>Caract\u00e9ristiques :<\/p>\n<p><\/p>\n<ul>\n<li>en cas de coupure temporaire de la connexion, nous perdrons des messages qui n'ont pas encore atteint le consommateur.<\/li>\n<li>on peut observer le ph\u00e9nom\u00e8ne <code>binding churn<\/code>. Ce ph\u00e9nom\u00e8ne se produit lorsque le nombre d'op\u00e9rations de cr\u00e9ation\/suppression de files d'attente et de liaisons atteint des valeurs tr\u00e8s \u00e9lev\u00e9es. En mode cluster, ce flux d'op\u00e9rations se r\u00e9partira sur tous les n\u0153uds et cr\u00e9era une charge importante. Ce processus peut \u00eatre optimis\u00e9 en contr\u00f4lant le nombre d'abonnements.<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"postoyannye-ocheredi\"><em>Files d'attente permanentes<\/em><\/h4>\n<p><\/p>\n<p>Si la cr\u00e9ation de la file d'attente se fait avec le param\u00e8tre <code>durable<\/code>, alors cette file d'attente <strong>conservent leur \u00e9tat<\/strong> et se restaurent apr\u00e8s le red\u00e9marrage du serveur\/broker. Cette file d'attente existera tant qu'une commande <code>Queue.Delete<\/code>. <\/p>\n<p><\/p>\n<h4 id=\"highly-available-ocheredi\"><em>Les files d'attente hautement disponibles<\/em><\/h4>\n<p><\/p>\n<p>Les files d'attente HA n\u00e9cessitent un environnement cluster RabbitMQ. En mode cluster, toutes les informations concernant les courtiers, les files d'attente, les liaisons et les consommateurs seront copi\u00e9es sur tous les n\u0153uds.<\/p>\n<p><\/p>\n<p>Lorsque un message est publi\u00e9 dans une file d'attente HA, il est stock\u00e9 sur chaque n\u0153ud associ\u00e9 \u00e0 la file d'attente HA. Une fois que le message a \u00e9t\u00e9 consomm\u00e9 sur l'un des n\u0153uds, toutes les copies de ce message seront supprim\u00e9es sur les autres n\u0153uds. <\/p>\n<p><\/p>\n<p>Les files d'attente HA peuvent s'\u00e9tendre sur tous les n\u0153uds d'un certain cluster ou seulement sur des n\u0153uds individuels. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 3. Comprendre les Queues et les Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/46d560ab33e686ddf9adb0b18b4bb0b0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Caract\u00e9ristiques :<\/p>\n<p><\/p>\n<ul>\n<li>L'utilisation des files d'attente HA entra\u00eene des p\u00e9nalit\u00e9s en termes de performances. Lorsque vous placez un message dans une file d'attente HA ou lorsque vous consommez un message d'une file d'attente HA, RabbitMQ doit effectuer une coordination entre tous les n\u0153uds (2-3 n\u0153uds sont g\u00e9n\u00e9ralement suffisants).<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"sozdanie-ocheredi\"><em>Cr\u00e9ation d'une file d'attente<\/em><\/h4>\n<p><\/p>\n<p>La cr\u00e9ation d'une file d'attente se fait par le biais d'une synchronisation. <code>RPC<\/code> synchronisation au serveur. La demande est r\u00e9alis\u00e9e par la m\u00e9thode <code>Queue.Declare<\/code>, appel\u00e9e avec les param\u00e8tres :<\/p>\n<p><\/p>\n<ul>\n<li>nom de la file d'attente<\/li>\n<li>autres param\u00e8tres<\/li>\n<\/ul>\n<p><\/p>\n<p>Exemple de cr\u00e9ation d'une file d'attente par le biais de <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 le nom de la file d'attente que nous souhaitons cr\u00e9er. Le nom doit \u00eatre unique et ne peut pas co\u00efncider avec le nom syst\u00e8me de la file d'attente.<\/li>\n<li><code>durable<\/code> \u2014 si true, la file d'attente sera <strong>conserve son \u00e9tat<\/strong> et se restaure apr\u00e8s le red\u00e9marrage du serveur\/broker.<\/li>\n<li><code>exclusive<\/code> \u2014 si true, la file d'attente n'autorisera qu'un seul consommateur \u00e0 se connecter.<\/li>\n<li><code>autoDelete<\/code> \u2014 si true, la file d'attente acquiert la capacit\u00e9 <strong>de se supprimer automatiquement<\/strong><\/li>\n<li><code>arguments<\/code> \u2014 arguments optionnels. Nous allons les examiner en d\u00e9tail ci-dessous.<\/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 permet de d\u00e9finir la dur\u00e9e de vie d'un message en millisecondes. Si la cr\u00e9ation de la file d'attente se fait avec une valeur d'argument d\u00e9finie, <code>x-message-ttl<\/code>cette file d'attente va <strong>exclure automatiquement les messages qui ont expir\u00e9.<\/strong>En d\u00e9finissant la valeur de l'argument, <code>x-message-ttl<\/code> vous sp\u00e9cifiez l'\u00e2ge maximum pour tous les messages de cette file d'attente. Cr\u00e9ation de cette file d'attente <strong>permet d'\u00e9viter de recevoir des informations obsol\u00e8tes.<\/strong>Cela peut \u00eatre utilis\u00e9 dans des syst\u00e8mes en temps r\u00e9el. Si une file d'attente pour laquelle un \u00e9change a \u00e9t\u00e9 sp\u00e9cifi\u00e9 pour les messages rejet\u00e9s re\u00e7oit une valeur d'argument, <code>x-message-ttl<\/code>les messages rejet\u00e9s dans cette file d'attente <strong>commenceront \u00e0 avoir une dur\u00e9e de vie.<\/strong>.<\/li>\n<li><code>x-expires<\/code> \u2014 d\u00e9finit une valeur en millisecondes apr\u00e8s laquelle la file d'attente est supprim\u00e9e. La file d'attente peut expirer uniquement si elle n'a aucun abonn\u00e9. Si la file d'attente a des abonn\u00e9s connect\u00e9s, elle ne pourra \u00eatre automatiquement supprim\u00e9e que lorsque tous les abonn\u00e9s auront invoqu\u00e9 <code>Basic.Cancel<\/code> ou se d\u00e9connecteront. La dur\u00e9e de vie de la file d'attente peut prendre fin uniquement si aucune demande n'a \u00e9t\u00e9 faite \u00e0 celle-ci, <code>Basic.Get.<\/code>Sinon, la valeur actuelle de la dur\u00e9e de vie est r\u00e9initialis\u00e9e et la file d'attente ne sera plus automatiquement supprim\u00e9e. De plus, <strong>il n'y a aucune garantie sur la rapidit\u00e9 avec laquelle la file d'attente est supprim\u00e9e apr\u00e8s l'expiration de sa dur\u00e9e de vie.<\/strong>.<\/li>\n<li><code>x-max-length<\/code> \u2014 d\u00e9finit le nombre maximum de messages dans la file d'attente. Si le nombre de messages dans la file d'attente commence \u00e0 d\u00e9passer le nombre maximum, les plus anciens messages commencent \u00e0 \u00eatre supprim\u00e9s.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 3. Comprendre les Queues et les 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 d\u00e9finit la taille totale maximale autoris\u00e9e des charges utiles des messages dans la file d'attente. En cas de d\u00e9passement de la valeur fix\u00e9e (une saturation de la file d'attente se produit lors de la publication d'un message), les plus anciens messages commenceront \u00e0 \u00eatre supprim\u00e9s.<\/li>\n<li><code>x-overflow<\/code> \u2014 cet argument est utilis\u00e9 pour configurer le comportement en cas de saturation de la file d'attente. Deux valeurs sont disponibles : <code>drop-head<\/code> (valeur par d\u00e9faut) et <code>reject-publish<\/code>. Si vous choisissez <code>drop-head<\/code>, alors les plus anciens messages seront supprim\u00e9s. Si vous choisissez <code>reject-publish<\/code>, la r\u00e9ception des messages sera suspendue.<\/li>\n<li><code>x-dead-letter-exchange<\/code> \u2014 d\u00e9finit l'\u00e9change vers lequel sont envoy\u00e9s les messages rejet\u00e9s, qui ne sont pas retent\u00e9s dans la file d'attente.<\/li>\n<li><code>x-dead-letter-routing-key<\/code> \u2014 d\u00e9finit une cl\u00e9 de routage optionnelle pour les messages rejet\u00e9s.<\/li>\n<li><code>x-max-priority<\/code> \u2014 permet le tri par priorit\u00e9s dans la file d'attente avec une valeur maximale de priorit\u00e9 de 255 (RabbitMQ version 3.5.0 et sup\u00e9rieure). Le nombre indique la priorit\u00e9 maximale que la file d'attente supportera. Si l'argument n'est pas d\u00e9fini, la file d'attente ne supportera pas les priorit\u00e9s des messages.<\/li>\n<li><code>x-queue-mode<\/code> \u2014 permet de transf\u00e9rer la file d'attente en mode <strong>paresseux<\/strong>. En ce mode, un maximum de messages sera stock\u00e9 sur le disque. L'utilisation de la m\u00e9moire vive sera minimale. Si ce mode n'est pas d\u00e9fini, la file d'attente stockera les messages en m\u00e9moire pour livrer les messages le plus rapidement possible.<\/li>\n<li><code>x-queue-master-locator<\/code> \u2014 si nous avons un cluster, nous pouvons d\u00e9signer la file d'attente ma\u00eetre.<\/li>\n<li><code>x-ha-policy<\/code> \u2014 utilis\u00e9 lors de la cr\u00e9ation de files d'attente HA et d\u00e9finit comment le message sera distribu\u00e9 sur les n\u0153uds. Si la valeur est d\u00e9finie sur <code>tout<\/code>, alors le message sera conserv\u00e9 sur tous les n\u0153uds. Si la valeur est d\u00e9finie sur <code>nodes<\/code>, alors le message sera conserv\u00e9 sur certains n\u0153uds du cluster.<\/li>\n<li><code>x-ha-nodes<\/code> \u2014 d\u00e9finit les n\u0153uds auxquels une certaine file d'attente sera associ\u00e9e. <code>HA<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 3. Comprendre les Queues et les Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/a8f660b6c0a43626e4025cf7769a4425.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si la cr\u00e9ation de la file d'attente <strong>peut-\u00eatre<\/strong>, alors le serveur enverra au client un <code>RPC<\/code> r\u00e9ponse <code>Queue.DeclareOk<\/code>. Si la cr\u00e9ation de la file d'attente <strong>est impossible<\/strong> (une erreur de demande est survenue <code>Queue.Declare<\/code>), alors <strong>le canal sera ferm\u00e9<\/strong> par le serveur avec la commande <code>Channel.Close<\/code> et le client recevra une exception <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>, qui contiendra un code d'erreur et sa description. <\/p>\n<p><\/p>\n<p><strong>Un nouvel appel<\/strong> <code>Queue.Declare<\/code> <strong>avec des param\u00e8tres similaires<\/strong> renverra des informations utiles sur cette file d'attente. Par exemple, le nombre total de messages en attente dans cette file d'attente et le nombre total de consommateurs abonn\u00e9s. <\/p>\n<p><\/p>\n<p>de system-nspawn <code>Queue.Declare<\/code> avec les identifiants d'un utilisateur qui n'a pas les privil\u00e8ges n\u00e9cessaires <strong>fermera le canal<\/strong> en utilisant la commande <code>Channel.Close<\/code> et le client recevra une exception <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>, qui contiendra le code d'erreur <noindex><a rel=\"nofollow\" href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/HTTP\/Status\/403\">403<\/a><\/noindex> et sa description.<\/p>\n<p><\/p>\n<p>Apr\u00e8s qu'une file d'attente ait \u00e9t\u00e9 inactive pendant &gt;= 10 secondes, elle <strong>entre en mode veille<\/strong>, d\u00e9clenchant le GC dans la file, ce qui entra\u00eene une r\u00e9duction significative de la m\u00e9moire n\u00e9cessaire pour cette file.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-queue-cherez-graficheskiy-interfeys\"><em>Cr\u00e9ation d'une file d'attente via l'interface graphique<\/em><\/h4>\n<p><\/p>\n<p>Acc\u00e9dez au panneau d'administration <code>RabbitMQ<\/code> sous l'utilisateur <code>guest<\/code> (nom d'utilisateur : <code>guest<\/code> et mot de passe : <code>guest<\/code>). Notez que l'utilisateur <code>guest<\/code> ne peut se connecter qu'\u00e0 partir de l'h\u00f4te local. Passons maintenant \u00e0 l'onglet <code>Files d'attente<\/code> et cliquez sur <code>Ajouter une nouvelle file d'attente<\/code>. Remplissez les propri\u00e9t\u00e9s :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 3. Comprendre les Queues et les Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/ea77a406ad16f0871c7197e96a66818f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Une fois que nous aurons saisi toutes les donn\u00e9es n\u00e9cessaires et cliqu\u00e9 sur <code>Ajouter des files d'attente<\/code>, la file appara\u00eetra dans la liste g\u00e9n\u00e9rale.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 3. Comprendre les Queues et les Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/8342e044a0d6c0a035a2c9f646035cad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cliquez sur le nom de la file d'attente pour afficher ses informations d\u00e9taill\u00e9es. Ici, vous pouvez configurer l'association entre l'\u00e9change et la file, voir la liste <code>consumers<\/code>, publier\/r\u00e9cup\u00e9rer des messages, supprimer la file et consulter les statistiques.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding\"><em>Cr\u00e9ation d'un Binding<\/em><\/h4>\n<p><\/p>\n<p>La cr\u00e9ation d'un binding se fait \u00e0 l'aide de l'appel synchrone <code>RPC<\/code> synchronisation au serveur. La demande est r\u00e9alis\u00e9e par la m\u00e9thode <code>Queue.Bind<\/code>, appel\u00e9e avec les param\u00e8tres :<\/p>\n<p><\/p>\n<ul>\n<li>nom de la file d'attente<\/li>\n<li>nom de la touche d'\u00e9change<\/li>\n<li>autres param\u00e8tres<\/li>\n<\/ul>\n<p><\/p>\n<p>Exemple de cr\u00e9ation d'un binding \u00e0 l'aide de <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 nom de la file d'attente<\/li>\n<li><code>l'\u00e9change<\/code> \u2014 nom de l'\u00e9change<\/li>\n<li><code>routingKey<\/code> \u2014 cl\u00e9 de routage<\/li>\n<li><code>arguments<\/code> \u2014 arguments optionnels<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 3. Comprendre les Queues et les Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/9123186c94a822309b679f26c2e511ea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si la cr\u00e9ation du binding <strong>peut-\u00eatre<\/strong>, alors le serveur enverra au client un <code>RPC<\/code> r\u00e9ponse <code>Queue.BindOk<\/code>.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding-cherez-graficheskiy-interfeys\"><em>Cr\u00e9ation d'un Binding via l'interface graphique<\/em><\/h4>\n<p><\/p>\n<p>Acc\u00e9dez au panneau d'administration <code>RabbitMQ<\/code> sous l'utilisateur <code>guest<\/code> (nom d'utilisateur : <code>guest<\/code> et mot de passe : <code>guest<\/code>). Notez que l'utilisateur <code>guest<\/code> ne peut se connecter qu'\u00e0 partir de l'h\u00f4te local. Passons maintenant \u00e0 l'onglet <code>Files d'attente<\/code> et nous cliquons sur la file d'attente <code>my_queue<\/code>. Remplissons les champs de la section <code>bindings<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 3. Comprendre les Queues et les Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/7db6b42a4f29a1860aabe54ade0b6833.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Une fois que nous aurons saisi toutes les donn\u00e9es n\u00e9cessaires et cliqu\u00e9 sur <code>Bind<\/code>, le binding appara\u00eetra dans la liste g\u00e9n\u00e9rale :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 3. Comprendre les Queues et les Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/499eda8e8cb061e6feb75c471eb64b92.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"code\">Code<\/h3>\n<p><\/p>\n<p>Dans cette section, nous allons d\u00e9crire la file d'attente et le binding en code C#, comme si nous devions d\u00e9velopper une biblioth\u00e8que. Cela pourrait \u00eatre utile pour la compr\u00e9hension.<\/p>\n<p><\/p>\n<pre><code class=\"cs\">public interface IQueue\n    {        \n        string Name { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Si d\u00e9fini sur true, la file sera persistante. \n        \/\/     Elle sera stock\u00e9e sur le disque et pourra \n        \/\/     survivre au red\u00e9marrage du serveur du courtier. \n        \/\/     Si la valeur est false, la file est temporaire et sera supprim\u00e9e, \n        \/\/     lorsque le serveur du courtier sera red\u00e9marr\u00e9\n        \/\/ &lt;summary&gt;\n        bool IsDurable { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Si la valeur est true, \n        \/\/     cette file ne permettra \u00e0 un seul client de se connecter\n        \/\/ &lt;summary&gt;\n        bool IsExclusive { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Suppression automatique. \n        \/\/     La file sera supprim\u00e9e lorsque tous les clients se d\u00e9connecteront.\n        \/\/ &lt;summary&gt;\n        bool IsAutoDelete { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Arguments optionnels\n        \/\/ &lt;summary&gt;\n        IDictionary&lt;string, object&gt; Arguments { get; }\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} ne doit pas \u00eatre nul\");\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        \/\/     Mode paresseux. Le mode paresseux forcera la\n        \/\/     conservation de autant de messages que possible sur le disque,\n        \/\/     afin de r\u00e9duire l'utilisation de la m\u00e9moire vive\n        \/\/ <\/summary>\n        public const string Lazy = \"lazy\";\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">public interface IBinding\n    {\n        \/\/ &lt;summary&gt;\n        \/\/     \u00c9change qui sera associ\u00e9 par liaison\n        \/\/ &lt;\/summary&gt;\n        IExchange Exchange { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Cl\u00e9 de routage\n        \/\/ &lt;\/summary&gt;\n        string RoutingKey { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Arguments optionnels\n        \/\/ &lt;\/summary&gt;\n        IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">public class Binding : IBinding\n    {\n        public Binding(\n             IExchange exchange, \n             string routingKey, \n             IDictionary arguments)\n        {\n            Exchange = exchange;\n            RoutingKey = routingKey;\n            Arguments = arguments;\n        }\n\n        public IExchange Exchange { get; }\n        public string RoutingKey { get; }\n        public IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p>Source : <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\/fr\/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=\"fr_FR\" \/>\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\/fr\/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. Partie 3. Comprendre les Queues et Bindings | ProHoster","description":"La Queue (file d'attente) est une structure de donn\u00e9es sur disque ou en m\u00e9moire vive qui stocke des r\u00e9f\u00e9rences aux messages et les d\u00e9livre sous forme de copies aux consumers (consommateurs).","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/73065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=73065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/73065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/73066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=73065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=73065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=73065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}