{"id":69621,"date":"2020-02-21T02:56:53","date_gmt":"2020-02-20T23:56:53","guid":{"rendered":"https:\/\/prohoster.info\/blog\/rabbitmq-chast-2-razbiraemsya-s-exchanges"},"modified":"2020-03-03T16:14:48","modified_gmt":"2020-03-03T13:14:48","slug":"rabbitmq-chast-2-razbiraemsya-s-exchanges","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","title":{"rendered":"RabbitMQ. Partie 2. Comprenons les Exchanges","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>\u00c9change<\/code> \u2014 un \u00e9change ou un point d'\u00e9change. Il re\u00e7oit des messages. <code>\u00c9change<\/code> <strong>distribue le message<\/strong> dans une ou plusieurs files d'attente. Il <strong>achemine les messages vers la file d'attente<\/strong> sur la base des liaisons cr\u00e9\u00e9es (<code>bindings<\/code>) entre lui et la file d'attente. <\/p>\n<p><\/p>\n<p><code>\u00c9change<\/code> n'est pas <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">un processus Erlang<\/a><\/noindex>. Pour des raisons de scalabilit\u00e9, <code>l'\u00e9change<\/code> est une cha\u00eene (lien vers le module contenant la logique de routage) dans la base de donn\u00e9es int\u00e9gr\u00e9e <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Mnesia\">mnesia<\/a><\/noindex>. 1 000 \u00e9changes n'utiliseront que 1 Mo de m\u00e9moire. <\/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>RabbitMQ. Partie 3. Comprendre les Queues et les Bindings<\/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=\"direct-exchange\"><em>\u00c9change direct<\/em><\/h4>\n<p><\/p>\n<p><code>\u00c9change direct<\/code> \u2014 utilis\u00e9 lorsque vous souhaitez <strong>livrer un message \u00e0 des files d'attente sp\u00e9cifiques.<\/strong>Le message est publi\u00e9 dans l'\u00e9change avec une cl\u00e9 de routage d\u00e9finie <strong>et atteint toutes les files d'attente qui sont li\u00e9es \u00e0 cet \u00e9change par une cl\u00e9 de routage similaire.<\/strong> La cl\u00e9 de routage est une cha\u00eene. <strong>La recherche de correspondance se fait par la<\/strong>v\u00e9rification d'\u00e9galit\u00e9 des cha\u00eenes. <strong>Repr\u00e9sentation graphique du flux de messages :<\/strong>.<\/p>\n<p><\/p>\n<p>rabbitmq<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 2. Comprenons les Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/8ce3ab37542f2a7f8e7ac02a737c5f88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dans <code>il existe le concept d'<\/code> \u00e9change par d\u00e9faut <strong>\u00e9change direct<\/strong>. C'est <code>sans nom. Si un \u00e9change par d\u00e9faut est utilis\u00e9, le message sera rout\u00e9 vers la file d'attente nomm\u00e9e d'apr\u00e8s<\/code> la cl\u00e9 de routage du message. <strong>\u00c9change par sujet<\/strong>. <\/p>\n<p><\/p>\n<h4 id=\"topic-exchange\"><em>\u00c9change par sujet<\/em><\/h4>\n<p><\/p>\n<p><code>\u2013 de mani\u00e8re similaire,<\/code> il permet un routage s\u00e9lectif en comparant la cl\u00e9 de routage. Cependant, dans ce cas, la cl\u00e9 est d\u00e9finie <code>sans nom. Si un \u00e9change par d\u00e9faut est utilis\u00e9, le message sera rout\u00e9 vers la file d'attente nomm\u00e9e d'apr\u00e8s<\/code> par un mod\u00e8le. <strong>Lors de la cr\u00e9ation du mod\u00e8le, sont utilis\u00e9s<\/strong>un ou plusieurs mots (lettres <code>0<\/code> AZ <code>et chiffres<\/code> et <code>az<\/code> ), s\u00e9par\u00e9s par des points, ainsi que des symboles <code>0-9<\/code>\u2014 peuvent \u00eatre remplac\u00e9s par exactement <code>*<\/code> et <code>#<\/code>. <\/p>\n<p><\/p>\n<ul>\n<li><code>*<\/code> un mot <code>1<\/code> \u2014 peut \u00eatre remplac\u00e9 par <\/li>\n<li><code>#<\/code> un ou plusieurs mots. <code>0<\/code> RabbitMQ 2.4.0 <\/li>\n<\/ul>\n<p><\/p>\n<p>rabbitmq<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 2. Comprenons les Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/a0ce48b291a3003eabbe61b3dfa5a4e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c0 partir de la version <code>l'algorithme de routage pour<\/code> l'\u00e9change par sujet <code>a commenc\u00e9 \u00e0 fonctionner jusqu'\u00e0<\/code> deux fois plus vite. Ils ont atteint cela en mettant en \u0153uvre l'approche <code>145<\/code> trie implementation <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/blog\/2011\/03\/28\/very-fast-and-scalable-topic-routing-part-2\/\">, qui implique la repr\u00e9sentation des mod\u00e8les sous forme de structure arborescente. Par exemple, les mod\u00e8les<\/a><\/noindex>a.b.c <code>a.*.b.c<\/code>, <code>a.#.c<\/code>, <code>b.b.c<\/code> et <code>seront repr\u00e9sent\u00e9s par la structure suivante :<\/code> La recherche de correspondance avec le mod\u00e8le commence \u00e0 la racine et descend.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 2. Comprenons les Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/56ef5809fec9eb6c1b50a362b89dd05a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'utilisation de cet \u00e9change peut \u00eatre<\/p>\n<p><\/p>\n<p>Caract\u00e9ristiques :<\/p>\n<p><\/p>\n<ul>\n<li>un bon choix pour un d\u00e9veloppement futur potentiel de l'application. <strong>un bon choix pour le d\u00e9veloppement futur potentiel de l'application<\/strong>, car les mod\u00e8les peuvent toujours \u00eatre configur\u00e9s pour que le message soit publi\u00e9 de la m\u00eame mani\u00e8re <code>sans nom. Si un \u00e9change par d\u00e9faut est utilis\u00e9, le message sera rout\u00e9 vers la file d'attente nomm\u00e9e d'apr\u00e8s<\/code> ou <code>\u00e9change fanout<\/code><\/li>\n<li>mod\u00e8les qui utilisent <code>*<\/code> <strong>beaucoup plus rapidement<\/strong>, que les mod\u00e8les qui utilisent <code>#<\/code>. <\/li>\n<li><code>a commenc\u00e9 \u00e0 fonctionner jusqu'\u00e0<\/code> plus lentement <code>sans nom. Si un \u00e9change par d\u00e9faut est utilis\u00e9, le message sera rout\u00e9 vers la file d'attente nomm\u00e9e d'apr\u00e8s<\/code><\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"fanout-exchange\"><em>\u00c9change fanout<\/em><\/h4>\n<p><\/p>\n<p><code>\u00e9change fanout<\/code> \u2013 <strong>tous les messages sont livr\u00e9s \u00e0 toutes les files d'attente<\/strong> m\u00eame si une cl\u00e9 de routage est sp\u00e9cifi\u00e9e dans le message.<\/p>\n<p><\/p>\n<p>Caract\u00e9ristiques :<\/p>\n<p><\/p>\n<ul>\n<li><code>RabbitMQ<\/code> <strong>ne fonctionne pas avec des cl\u00e9s de routage et des mod\u00e8les<\/strong> ce qui a un impact positif sur les performances. C'est le plus rapide <code>l'\u00e9change<\/code>;<\/li>\n<li>tous les consommateurs doivent \u00eatre capables de traiter tous les messages;<\/li>\n<\/ul>\n<p><\/p>\n<p>rabbitmq<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 2. Comprenons les Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/575d86093f151016aef8058fc7d92907.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h4 id=\"headers-exchange\"><em>\u00c9change Headers<\/em><\/h4>\n<p><\/p>\n<p><code>\u00e9change Headers<\/code> dirige les messages vers les files d'attente li\u00e9es sur la base de la comparaison des paires (cl\u00e9, valeur) des propri\u00e9t\u00e9s <code>en-t\u00eates<\/code> et de la propri\u00e9t\u00e9 similaire du message. <code>en-t\u00eates<\/code> est un <code>Dictionary<\/code>. <\/p>\n<p><\/p>\n<p>Si vous ajoutez une cl\u00e9 sp\u00e9ciale au dictionnaire <code>x-match<\/code> avec la valeur <code>any<\/code>, alors le message est rout\u00e9 par correspondance partielle des paires (cl\u00e9, valeur). Ce comportement est similaire \u00e0 l'op\u00e9rateur <code>or<\/code>. <\/p>\n<p><\/p>\n<pre><code class=\"cs\">var bindingArguments = new Dictinary();\nbindingArguments.add(\"x-match\", \"any\");<\/code><\/pre>\n<p><\/p>\n<p>Par d\u00e9faut, la cl\u00e9 <code>x-match<\/code> contient la valeur <code>tout<\/code>. Cela signifie que le message est rout\u00e9 par correspondance compl\u00e8te des paires (cl\u00e9, valeur). Ce comportement est similaire \u00e0 l'op\u00e9rateur <code>and<\/code>.<\/p>\n<p><\/p>\n<p>rabbitmq<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 2. Comprenons les Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/e9a02a0df88cb2c0538b97cec9002bf4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Caract\u00e9ristiques :<\/p>\n<p><\/p>\n<ul>\n<li>flexibilit\u00e9 suppl\u00e9mentaire<\/li>\n<li>calcul de frais suppl\u00e9mentaires. Toutes les paires (cl\u00e9, valeur) de l'attribut <code>en-t\u00eates<\/code> doivent \u00eatre tri\u00e9es par nom de cl\u00e9 avant le calcul des valeurs de routage du message. <strong>Plus lent que d'autres types d'\u00e9change<\/strong>.<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"consistent-hashing-exchange\"><em>\u00c9change de hachage consistent<\/em><\/h4>\n<p><\/p>\n<p>Cet \u00e9change est <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rabbitmq\/rabbitmq-consistent-hash-exchange\">un plugin<\/a><\/noindex> et <strong>non int\u00e9gr\u00e9<\/strong> dans <code>RabbitMQ<\/code>.<\/p>\n<p><\/p>\n<p><code>\u00e9change de hachage consistent<\/code> (\u00e9change de hachage constant) \u2013 utilis\u00e9 lorsqu'il y a plusieurs files d'attente qui sont des r\u00e9cepteurs potentiels du message, et lorsque vous devez \u00e9quilibrer la charge entre elles. La liaison d'un message \u00e0 une file d'attente se fait par poids (une valeur de cha\u00eene conditionnelle de <code>0 - n<\/code>). <\/p>\n<p><\/p>\n<p>Le poids \u00e9quivalent des files d'attente indique qu'un nombre \u00e0 peu pr\u00e8s \u00e9gal de <strong>messages arrivera (chaque message sera plac\u00e9 dans une seule file d'attente).<\/strong> Il n'y a aucune garantie d'une distribution uniforme des messages <strong>Hash<\/strong>. <\/p>\n<p><\/p>\n<p>rabbitmq<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 2. Comprenons les Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/dd22749cad463fe86619a98276554e10.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><code>est calcul\u00e9 en fonction de la cl\u00e9 de routage ou de la propri\u00e9t\u00e9<\/code> du message. Si tous les messages publi\u00e9s avaient des cl\u00e9s de routage diff\u00e9rentes ou <code>en-t\u00eates<\/code> , alors la distribution se fera par poids. Sinon, la cl\u00e9 de routage sera utilis\u00e9e ou <code>en-t\u00eates<\/code>, la r\u00e9partition se fera par poids. Sinon, une cl\u00e9 de routage sera utilis\u00e9e ou <code>en-t\u00eates<\/code>.<\/p>\n<p><\/p>\n<p><strong>Doit aider lorsque la capacit\u00e9 du consommateur doit cro\u00eetre plus que la solution avec plusieurs consommateurs utilisant une seule file d'attente.<\/strong><\/p>\n<p><\/p>\n<h4 id=\"kombinirovanie-obmennikov-e2e\"><em>Combinaison d'\u00e9change (E2E)<\/em><\/h4>\n<p><\/p>\n<p>Le comportement de tous les \u00e9changeurs peut \u00eatre combin\u00e9 gr\u00e2ce \u00e0 une liaison <strong>Exchange-to-Exchange<\/strong> (la combinaison des \u00e9changeurs n'est pas incluse dans la sp\u00e9cification <code>AMQP<\/code>. Cette extension du protocole du c\u00f4t\u00e9 <code>RabbitMQ<\/code>).<\/p>\n<p><\/p>\n<p>rabbitmq<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 2. Comprenons les Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/41ea01a0f43f2dd195fa4f34f7fc176c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gr\u00e2ce \u00e0 <code>E2E<\/code> , nous pouvons trouver la configuration \u00e9volutive appropri\u00e9e qui r\u00e9pond aux exigences actuelles et croissantes.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-exchange\"><em>Cr\u00e9ation d\u2019un Exchange<\/em><\/h4>\n<p><\/p>\n<p>La cr\u00e9ation d'un \u00e9change se fait par une demande de <code>RPC<\/code> synchronisation au serveur. La demande est r\u00e9alis\u00e9e par la m\u00e9thode <code>Exchange.Declare<\/code>, appel\u00e9e avec les param\u00e8tres :<\/p>\n<p><\/p>\n<ul>\n<li>nom de l'\u00e9change<\/li>\n<li>type d'\u00e9change<\/li>\n<li>autres param\u00e8tres<\/li>\n<\/ul>\n<p><\/p>\n<p>Exemple de cr\u00e9ation <code>l'\u00e9change<\/code> avec 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.ExchangeDeclare(\n    exchange: &quot;my_exchange&quot;,\n    type: &quot;direct&quot;,\n    durable: &quot;false&quot;,\n    autoDelete: &quot;false&quot;,\n    arguments: null\n);\n\/\/...<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><code>l'\u00e9change<\/code> \u2014 le nom de l'\u00e9change que nous voulons cr\u00e9er. Le nom doit \u00eatre unique<\/li>\n<li><code>type<\/code> \u2014 type d'\u00e9change<\/li>\n<li><code>durable<\/code> \u2014 si d\u00e9fini <code>true<\/code>, alors <code>l'\u00e9change<\/code> il sera permanent. Il sera stock\u00e9 sur le disque et pourra survivre au red\u00e9marrage du serveur\/broker. Si la valeur <code>faux<\/code>, alors <code>l'\u00e9change<\/code> est temporaire et sera supprim\u00e9e lorsque le serveur\/broker sera red\u00e9marr\u00e9<\/li>\n<li><code>autoDelete<\/code> \u2014 suppression automatique. <code>\u00c9change<\/code> sera supprim\u00e9 lorsque toutes les files d'attente associ\u00e9es seront supprim\u00e9es<\/li>\n<li><code>arguments<\/code> \u2014 arguments facultatifs. Le plus souvent, \u00e0 travers les arguments, on d\u00e9finit <code>alternative exchange<\/code> (<strong>un \u00e9change alternatif<\/strong>). Si le message ne peut pas passer par le chemin initial, il peut \u00eatre envoy\u00e9 \u00e0 un \u00e9change alternatif pour \u00eatre rout\u00e9 par un autre chemin.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 2. Comprenons les Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/6a352e92f94dadf58ba24de453806133.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si la cr\u00e9ation <code>l'\u00e9change<\/code> <strong>peut-\u00eatre<\/strong>, alors le serveur enverra au client un <code>RPC<\/code> r\u00e9ponse <code>Exchange.DeclareOk<\/code>. Si la cr\u00e9ation <strong>est impossible<\/strong> (une erreur de demande est survenue <code>Exchange.Declare<\/code>), alors <strong>le canal sera ferm\u00e9<\/strong> par le serveur \u00e0 l'aide d'une commande asynchrone <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>L'\u00e9change doit \u00eatre cr\u00e9\u00e9 avant de publier des messages. Si vous publiez un message dans un \u00e9change non existant \u2014 <code>RabbitMQ<\/code> il sera silencieusement supprim\u00e9.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-exchange-cherez-graficheskiy-interfeys\"><em>Cr\u00e9ation d\u2019un Exchange 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>Exchanges<\/code> et cliquez sur <code>Ajouter un nouvel \u00e9change<\/code>. Remplissez les propri\u00e9t\u00e9s :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partie 2. Comprenons les Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/c4fd31b8cdb8182690ec8c01ccd2a460.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La plupart des propri\u00e9t\u00e9s ont \u00e9t\u00e9 d\u00e9crites ci-dessus. Ici, nous noterons que si nous d\u00e9finissons <code>Interne<\/code>, il sera possible d'utiliser l'\u00e9change uniquement pour <code>E2E<\/code>. <code>Producteur<\/code> ne pourra pas envoyer de messages \u00e0 un tel \u00e9change.<\/p>\n<p><\/p>\n<h3 id=\"zaklyuchenie\">Conclusion<\/h3>\n<p><\/p>\n<p>Lors de la conception du syst\u00e8me, il est pratique de d\u00e9crire la topologie <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%80%D1%88%D1%80%D1%83%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F\">de routage<\/a><\/noindex> \u00e0 l'aide d'un graphique. Mais avant de commencer \u00e0 construire le graphique, il est n\u00e9cessaire d'identifier les chemins \u00e0 fort trafic, car ce sont eux qui n\u00e9cessitent <strong>une capacit\u00e9 de bande passante plus \u00e9lev\u00e9e<\/strong> (performance). Ensuite, on peut classifier le trafic. Et ensuite, on peut commencer la construction.<\/p>\n<p><\/p>\n<p>S'il existe dans le graphique construit <strong>un ensemble fini<\/strong> de cl\u00e9s de routage, alors, il faut se tourner vers plusieurs <code>\u00e9change fanout<\/code>, qui sont li\u00e9s 1:1 \u00e0 la cl\u00e9 de routage. N'oublions pas que <code>\u00e9change fanout<\/code> le plus rapide.<\/p>\n<p><\/p>\n<p>Si le nombre de routes <strong>tend vers l'infini<\/strong>, il convient de pr\u00eater attention \u00e0 <code>a commenc\u00e9 \u00e0 fonctionner jusqu'\u00e0<\/code> ou, si le mod\u00e8le n'est pas n\u00e9cessaire, on peut choisir <code>un \u00e9change direct<\/code>, car il est plus rapide. <code>a commenc\u00e9 \u00e0 fonctionner jusqu'\u00e0<\/code>.<\/p>\n<p><\/p>\n<p>Des combinaisons vari\u00e9es <code>l'\u00e9change<\/code> devraient aider \u00e0 trouver la bonne <strong>configuration \u00e9volutive<\/strong>, qui r\u00e9pond \u00e0 la fois aux exigences actuelles et croissantes du syst\u00e8me.<\/p>\n<p><\/p>\n<p>Le nombre <code>l'\u00e9change<\/code> et des files d'attente doit \u00eatre minimal par rapport au nombre de routes.<\/p>\n<p><\/p>\n<p>Dans le prochain article, nous commencerons \u00e0 examiner plus en d\u00e9tail les Queues et Bindings.<\/p>\n<p><\/p>\n<h3 id=\"ssylki\">Liens<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/\">Site du projet RabbitMQ<\/a><\/noindex><\/li>\n<\/ul>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Exchange \u2014 \u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0412 \u043d\u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. Exchange \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439. \u041e\u043d \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0432\u044f\u0437\u0435\u0439 (bindings) \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e. Exchange \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Erlang-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c. \u0418\u0437 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 exchange \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 (\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u043a\u043e\u0434\u043e\u043c, \u0433\u0434\u0435 \u043b\u0435\u0436\u0438\u0442 \u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438) \u0432\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":69622,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-69621","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=\"Exchange \u2014 \u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0412 \u043d\u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. Exchange \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439.\" \/>\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-2-razbiraemsya-s-exchanges\" \/>\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 2. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 Exchanges | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"Exchange \u2014 \u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0412 \u043d\u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. Exchange \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges\" \/>\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-02-20T23:56:53+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:48+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 2. Comprendre les Exchanges | ProHoster","description":"Exchange \u2014 un \u00e9change ou point d'\u00e9change. Les messages y sont envoy\u00e9s. L'Exchange distribue les messages dans une ou plusieurs files d'attente.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","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 2. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 Exchanges | ProHoster","og:description":"Exchange \u2014 \u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0412 \u043d\u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. Exchange \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","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-02-20T23:56:53+00:00","article:modified_time":"2020-03-03T13:14:48+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"69621","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 17:31:26","updated":"2022-09-28 03:24:29","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\/69621","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=69621"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/69621\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/69622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=69621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=69621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=69621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}