{"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\/en\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","title":{"rendered":"RabbitMQ. Part 2. Understanding Exchanges","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>Exchange<\/code> \u2014 the exchange or exchange point. Messages are sent to it. <code>Exchange<\/code> <strong>distributes messages<\/strong> into one or several queues. It <strong>routes messages to a queue<\/strong> based on created bindings (<code>bindings<\/code>) between it and the queue. <\/p>\n<p><\/p>\n<p><code>Exchange<\/code> is not <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">Erlang process<\/a><\/noindex>. For scalability reasons, <code>exchange<\/code> \u2014 this is a string (link to the module with code where the routing logic is stored) in the built-in database. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Mnesia\">mnesia<\/a><\/noindex>. 1,000 exchanges will consume only 1MB of memory. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"oglavlenie\">Table of Contents<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/488654\/\">RabbitMQ. Part 1. Introduction. Erlang, AMQP and RPC<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">RabbitMQ. Part 2. Understanding Exchanges<\/a><\/noindex><\/li>\n<li>RabbitMQ. Part 3. Understanding Queues and Bindings<\/li>\n<li>RabbitMQ. Part 4. Understanding what messages and frames are<\/li>\n<li>RabbitMQ. Part 5. Performance of Message Publishing and Consumption<\/li>\n<li>RabbitMQ. Part 6. Overview of Federation and Shovel Modules<\/li>\n<li>RabbitMQ. Part 7. Detailed about Connection and Channel<\/li>\n<li>RabbitMQ. Part 8. RabbitMQ in .NET<\/li>\n<li>RabbitMQ. Part 9. Monitoring<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"direct-exchange\"><em>Direct Exchange<\/em><\/h4>\n<p><\/p>\n<p><code>Direct exchange<\/code> \u2014 is used when you need to <strong>deliver a message to specific queues.<\/strong>. The message is published to the exchange with a specific <strong>routing key<\/strong> and goes to all queues that are bound to this exchange with the same routing key. <strong>The routing key is a string.<\/strong>. Matching is done by <strong>checking strings for equality.<\/strong>.<\/p>\n<p><\/p>\n<p>Graphical representation of the message flow:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Part 2. Understanding Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/8ce3ab37542f2a7f8e7ac02a737c5f88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In <code>rabbitmq<\/code> there is a concept of <strong>default exchange<\/strong>. This is <code>direct exchange<\/code> without a name. If the default exchange is used, the message will be routed to the queue named the same as <strong>the routing key of the message.<\/strong>. <\/p>\n<p><\/p>\n<h4 id=\"topic-exchange\"><em>Topic Exchange<\/em><\/h4>\n<p><\/p>\n<p><code>Topic exchange<\/code> \u2013 similarly, <code>direct exchange<\/code> allows selective routing by comparing the routing key. However, in this case, the key is defined <strong>by a pattern.<\/strong>. When creating a pattern, you use <code>0<\/code> one or more words (letters <code>AZ<\/code> and <code>az<\/code> and digits <code>0-9<\/code>), separated by dots, as well as characters <code>*<\/code> and <code>#<\/code>. <\/p>\n<p><\/p>\n<ul>\n<li><code>*<\/code> \u2014 can be replaced with exactly <code>1<\/code> word <\/li>\n<li><code>#<\/code> \u2014 can be replaced with <code>0<\/code> one or more words. <\/li>\n<\/ul>\n<p><\/p>\n<p>Graphical representation of the message flow:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Part 2. Understanding Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/a0ce48b291a3003eabbe61b3dfa5a4e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Starting from version <code>RabbitMQ 2.4.0<\/code> the routing algorithm for <code>topic exchange<\/code> started working up to <code>145<\/code> twice as fast. They achieved this by implementing the <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/blog\/2011\/03\/28\/very-fast-and-scalable-topic-routing-part-2\/\">trie implementation<\/a><\/noindex>, which implies representing patterns as a tree structure. For example, the patterns <code>a.b.c<\/code>, <code>a.*.b.c<\/code>, <code>a.#.c<\/code> and <code>b.b.c<\/code> will be represented by the following structure:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Part 2. Understanding Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/56ef5809fec9eb6c1b50a362b89dd05a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Matching the pattern starts from the root and proceeds from top to bottom.<\/p>\n<p><\/p>\n<p>Features:<\/p>\n<p><\/p>\n<ul>\n<li>using this exchange can be <strong>a good choice for possible future development of the application,<\/strong>, as patterns can always be adjusted so that the message is published similarly to <code>direct exchange<\/code> or <code>fanout exchange<\/code><\/li>\n<li>patterns that use <code>*<\/code> <strong>much faster<\/strong>, than patterns that use <code>#<\/code>. <\/li>\n<li><code>topic exchange<\/code> slower. <code>direct exchange<\/code><\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"fanout-exchange\"><em>Fanout Exchange<\/em><\/h4>\n<p><\/p>\n<p><code>Fanout exchange<\/code> \u2013 <strong>all messages are delivered to all queues<\/strong> even if a routing key is specified in the message.<\/p>\n<p><\/p>\n<p>Features:<\/p>\n<p><\/p>\n<ul>\n<li><code>RabbitMQ<\/code> <strong>does not work with routing keys and patterns,<\/strong> which positively affects performance. This is the fastest. <code>exchange<\/code>;<\/li>\n<li>All users should be able to process all messages;<\/li>\n<\/ul>\n<p><\/p>\n<p>Graphical representation of the message flow:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Part 2. Understanding 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>Headers Exchange<\/em><\/h4>\n<p><\/p>\n<p><code>Headers exchange<\/code> \u2014 directs messages to related queues based on the comparison of (key, value) pairs of the property <code>headers<\/code> bindings and corresponding message properties. <code>headers<\/code> is a <code>Dictionary<\/code>. <\/p>\n<p><\/p>\n<p>If a special key is added to the dictionary <code>x-match<\/code> with the value <code>any<\/code>, the message is routed on partial matches of (key, value) pairs. This behavior is similar to the operator <code>or<\/code>. <\/p>\n<p><\/p>\n<pre><code class=\"cs\">var bindingArguments = new Dictionary();\nbindingArguments.add(\"x-match\", \"any\");<\/code><\/pre>\n<p><\/p>\n<p>By default, the key <code>x-match<\/code> contains the value <code>all<\/code>. This means that the message is routed on full matches of (key, value) pairs. This behavior is analogous to the operator <code>and<\/code>.<\/p>\n<p><\/p>\n<p>Graphical representation of the message flow:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Part 2. Understanding Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/e9a02a0df88cb2c0538b97cec9002bf4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Features:<\/p>\n<p><\/p>\n<ul>\n<li>additional flexibility<\/li>\n<li>additional computation overhead. All (key, value) pairs of the attribute <code>headers<\/code> must be sorted by key name before calculating message routing values. <strong>Slower than other types of exchange<\/strong>.<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"consistent-hashing-exchange\"><em>Consistent-Hashing Exchange<\/em><\/h4>\n<p><\/p>\n<p>This exchange is a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rabbitmq\/rabbitmq-consistent-hash-exchange\">plugin<\/a><\/noindex> and <strong>not built-in<\/strong> downward API support (simultaneously with this in <code>RabbitMQ<\/code>.<\/p>\n<p><\/p>\n<p><code>Consistent-hashing exchange<\/code> (exchange with consistent hashing) \u2013 is used when there are multiple queues that are potential recipients of the message, and when load balancing between them is needed. Message correlation with the queue occurs based on weight (a conditional string value from <code>0 - n<\/code>). <\/p>\n<p><\/p>\n<p>Equivalent weight of queues \u2013 indicates that each queue will receive <strong>approximately the same number of<\/strong> messages (each message will be placed in only one queue). <strong>There is no full guarantee of even message distribution<\/strong>. <\/p>\n<p><\/p>\n<p>Graphical representation of the message flow:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Part 2. Understanding Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/dd22749cad463fe86619a98276554e10.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><code>Hash<\/code> is calculated based on the routing key or property <code>headers<\/code> of the message. If all published messages had different routing keys or <code>headers<\/code>, the distribution will occur based on weights. Otherwise, the routing key or <code>headers<\/code>.<\/p>\n<p><\/p>\n<p><strong>Must assist when consumer throughput needs to grow higher than a solution with multiple consumers using one queue.<\/strong><\/p>\n<p><\/p>\n<h4 id=\"kombinirovanie-obmennikov-e2e\"><em>Combining exchanges (E2E)<\/em><\/h4>\n<p><\/p>\n<p>The behavior of all exchanges can be combined through linking <strong>Exchange-to-Exchange<\/strong> (exchange combining is not included in the specification <code>AMQP<\/code>. This protocol extension comes from <code>RabbitMQ<\/code>).<\/p>\n<p><\/p>\n<p>Graphical representation of the message flow:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Part 2. Understanding Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/41ea01a0f43f2dd195fa4f34f7fc176c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Thanks to <code>E2E<\/code> we can find the right scalable configuration that meets both current and growing demands.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-exchange\"><em>Creating Exchange<\/em><\/h4>\n<p><\/p>\n<p>The creation of an exchange occurs via synchronous <code>RPC<\/code> request to the server. The request is made using the method <code>Exchange.Declare<\/code>, called with the parameters:<\/p>\n<p><\/p>\n<ul>\n<li>exchange name<\/li>\n<li>exchange type<\/li>\n<li>other parameters<\/li>\n<\/ul>\n<p><\/p>\n<p>Example of creation <code>exchange<\/code> with the help of <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>exchange<\/code> \u2014 the name of the exchange we want to create. The name must be unique<\/li>\n<li><code>type<\/code> \u2014 the type of exchange<\/li>\n<li><code>durable<\/code> \u2014 if set <code>true<\/code>, then <code>exchange<\/code> will be permanent. It will be stored on disk and can survive a server\/broker restart. If the value <code>false<\/code>, then <code>exchange<\/code> is temporary and will be deleted when the server\/broker is restarted<\/li>\n<li><code>autoDelete<\/code> \u2014 automatic deletion. <code>Exchange<\/code> will be removed when all associated queues are deleted<\/li>\n<li><code>arguments<\/code> \u2014 optional arguments. Most often, arguments are used to specify <code>alternative exchange<\/code> (<strong>alternative exchange<\/strong>). If the message cannot go through the original route, it can be sent to an alternative exchange for routing another way.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Part 2. Understanding Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/6a352e92f94dadf58ba24de453806133.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>If creation <code>exchange<\/code> <strong>is possible<\/strong>, the server will send an synchronous <code>RPC<\/code> response <code>Exchange.DeclareOk<\/code>. If creation <strong>is not possible<\/strong> (the request was refused <code>Exchange.Declare<\/code>), then <strong>the channel will be closed<\/strong> by the server using an asynchronous command <code>Channel.Close<\/code> and the client will receive an 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>, which will contain an error code and its description. <\/p>\n<p><\/p>\n<p>The exchange must be created before publishing messages. If you publish a message to a non-existing exchange \u2014 <code>RabbitMQ<\/code> it will be quietly deleted.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-exchange-cherez-graficheskiy-interfeys\"><em>Creating Exchange via the graphical interface<\/em><\/h4>\n<p><\/p>\n<p>Log into the admin panel <code>RabbitMQ<\/code> under the user <code>guest<\/code> (username: <code>guest<\/code> and password: <code>guest<\/code>). Note that the user <code>guest<\/code> can connect only from the local host. Now let's go to the <code>Exchanges<\/code> tab and click on <code>Add a new exchange<\/code>. Fill in the properties:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Part 2. Understanding Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/c4fd31b8cdb8182690ec8c01ccd2a460.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Most of the properties have been described above. Here we will note that if you set <code>Internal<\/code>, then the exchange can only be used for <code>E2E<\/code>. <code>Producer<\/code> will not be able to send messages to such an exchange.<\/p>\n<p><\/p>\n<h3 id=\"zaklyuchenie\">Conclusion<\/h3>\n<p><\/p>\n<p>When developing a system, it is convenient to describe the routing topology <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\">with the help of a graph. But before starting to build the graph, it is advisable to identify the paths with high traffic, as they require<\/a><\/noindex> higher throughput <strong>(performance). Next, traffic can be classified. And only then should you proceed with the construction.<\/strong> If there exists<\/p>\n<p><\/p>\n<p>a finite set <strong>of routing keys, it is worth looking into several<\/strong> , which are 1:1 linked to the routing key. Remember that <code>fanout exchange<\/code>is the fastest. <code>fanout exchange<\/code> If the number of routes<\/p>\n<p><\/p>\n<p>approaches infinity <strong>, then it's worth paying attention to<\/strong>or, if no template is needed, you can choose <code>topic exchange<\/code> direct exchange <code>, as it is faster<\/code>Combinations of different <code>topic exchange<\/code>.<\/p>\n<p><\/p>\n<p>should help find the right <code>exchange<\/code> scalable configuration <strong>, which meets both current and growing system requirements.<\/strong>and the number of queues should be minimized compared to the number of routes.<\/p>\n<p><\/p>\n<p>Quantity <code>exchange<\/code> In the next article, we will start to delve deeper into Queues and Bindings.<\/p>\n<p><\/p>\n<p>In the next article, we will begin to delve deeper into Queues and Bindings.<\/p>\n<p><\/p>\n<h3 id=\"ssylki\">Links<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/\">RabbitMQ Project Site<\/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\/en\/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=\"en_US\" \/>\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\/en\/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. Part 2. Understanding Exchanges | ProHoster","description":"Exchange \u2014 a message broker or exchange point. It receives messages and distributes them to one or more queues.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","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\/en\/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\/en\/wp-json\/wp\/v2\/posts\/69621","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=69621"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/69621\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/69622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=69621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=69621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=69621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}