{"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\/et\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","title":{"rendered":"RabbitMQ. Osa 2. Uurime v\u00e4lja Exchanges","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>Exchange<\/code> \u2014 vahetuspunkt v\u00f5i vahetusplatvorm. Siia saadetakse s\u00f5numid. <code>Exchange<\/code> <strong>jagab s\u00f5numi<\/strong> \u00fche v\u00f5i mitme j\u00e4rjekorra. See <strong>marsruutitab s\u00f5numid j\u00e4rjekorda<\/strong> s\u00f5ltuvalt loodud sidemetest (<code>sidemed<\/code>) tema ja j\u00e4rjekorra vahel. <\/p>\n<p><\/p>\n<p><code>Exchange<\/code> ei ole <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">Erlang-protsess<\/a><\/noindex>. Skaalabiltuse kaalutlustel <code>vahetus<\/code> \u2014 see on rida (link moodulile, kus asub marsruutimise loogika) sisseehitatud andmebaasis <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Mnesia\">mnesia<\/a><\/noindex>. 1 tuhande vahetuspunkti tarbimine on vaid 1MB m\u00e4lu. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"oglavlenie\">Sisukord<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/488654\/\">RabbitMQ. Osa 1. Sissejuhatus. Erlang, AMQP ja RPC<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">RabbitMQ. Osa 2. Uurime v\u00e4lja Exchanges<\/a><\/noindex><\/li>\n<li>RabbitMQ. Osa 3. Uurime Queue-sid ja Bindings-e<\/li>\n<li>RabbitMQ. Osa 4. Uurime, mis on s\u00f5numid ja raami<\/li>\n<li>RabbitMQ. Osa 5. S\u00f5numite publikatsiooni ja tarbimise t\u00f5husus<\/li>\n<li>RabbitMQ. Osa 6. \u00dclevaade modulaarsete Federation ja Shovel<\/li>\n<li>RabbitMQ. Osa 7. \u00dcksikasjalik teave Connection ja Chaneli kohta<\/li>\n<li>RabbitMQ. Osa 8. RabbitMQ .NET-is<\/li>\n<li>RabbitMQ. Osa 9. J\u00e4lgimine<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"direct-exchange\"><em>Otsene vahetus<\/em><\/h4>\n<p><\/p>\n<p><code>Direct exchange<\/code> \u2014 kasutatakse, kui on vaja <strong>saata s\u00f5num kindlatesse j\u00e4rjekordadesse<\/strong>. S\u00f5num avaldatakse vahetuspunktis teatud <strong>marsruudiv\u00f5tmena<\/strong> ja j\u00f5uab k\u00f5igisse j\u00e4rjekordadesse, mis on \u00fchendatud sellega sarnase marsruudiv\u00f5tmega. <strong>Marsruudiv\u00f5ti on rida<\/strong>. Vastavuse otsimine toimub <strong>stringide v\u00f5rdlemise abil<\/strong>.<\/p>\n<p><\/p>\n<p>S\u00f5numite voolu graafiline esitus:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 2. Uurime v\u00e4lja Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/8ce3ab37542f2a7f8e7ac02a737c5f88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uues <code>rabbitmq<\/code> eksisteerib m\u00f5isted <strong>vahetuspunkt vaikimisi<\/strong>. See on <code>otsene vahetus<\/code> ilma nime. Kui kasutatakse vaikimisi vahetuspunkti, siis s\u00f5num marsruutitakse j\u00e4rjekorda, mille nimi vastab <strong>s\u00f5numi marsruudiv\u00f5tmele<\/strong>. <\/p>\n<p><\/p>\n<h4 id=\"topic-exchange\"><em>Teemavahetus<\/em><\/h4>\n<p><\/p>\n<p><code>Teemavahetus<\/code> \u2013 sarnaselt <code>otsene vahetus<\/code> pakub valikulist marsruutimist marsruudiv\u00f5tme v\u00f5rdlemise kaudu. Kuid sel juhul m\u00e4\u00e4ratakse v\u00f5tme <strong>hiti kaudu<\/strong>. Malli loomisel kasutatakse <code>0<\/code> \u00fcht v\u00f5i mitut s\u00f5na (t\u00e4hte <code>AZ<\/code> ja <code>az<\/code> ja numbreid <code>0-9<\/code>), mis on eraldatud punktidega, samuti s\u00fcmboleid <code>*<\/code> ja <code>#<\/code>. <\/p>\n<p><\/p>\n<ul>\n<li><code>*<\/code> \u2014 saab asendada t\u00e4pselt <code>1<\/code> \u00abreplica\u00bb (n\u00e4iteks funktsioon snd_ctl_add_slave() vahetati v\u00e4lja snd_ctl_add_replica() vastu), mis p\u00f5hjustas <\/li>\n<li><code>#<\/code> \u2014 saab asendada <code>0<\/code> \u00fche v\u00f5i mitme s\u00f5naga <\/li>\n<\/ul>\n<p><\/p>\n<p>S\u00f5numite voolu graafiline esitus:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 2. Uurime v\u00e4lja Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/a0ce48b291a3003eabbe61b3dfa5a4e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alates versioonist <code>RabbitMQ 2.4.0<\/code> marsruutimisalgoritm <code>teemavahetuse<\/code> t\u00f6\u00f6tas kuni <code>145<\/code> kord kiiremini. Seda saavutati sokkides <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/blog\/2011\/03\/28\/very-fast-and-scalable-topic-routing-part-2\/\">trie rakendamine<\/a><\/noindex>, mis t\u00e4hendab mallide esitamist puustruktuurina. N\u00e4iteks mallid <code>a.b.c<\/code>, <code>a.*.b.c<\/code>, <code>a.#.c<\/code> ja <code>b.b.c<\/code> esitatakse j\u00e4rgmise struktuurina:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 2. Uurime v\u00e4lja Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/56ef5809fec9eb6c1b50a362b89dd05a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Malli vastavuse otsimine toimub, alustades juurest ja j\u00e4rk-j\u00e4rgult alla liikudes.<\/p>\n<p><\/p>\n<p>suurendatud ressursside piirangud;<\/p>\n<p><\/p>\n<ul>\n<li>selle vahetuspunkti rakendamine v\u00f5ib olla <strong>hea valik v\u00f5imaliku tulevase rakenduse arendamiseks<\/strong>, kuna malli saab alati konfigureerida nii, et s\u00f5num avaldatakse sarnaselt <code>otsene vahetus<\/code> v\u00f5i <code>fanout vahetus<\/code><\/li>\n<li>mallide, mis kasutavad <code>*<\/code> <strong>much faster:<\/strong>, kui mallid, mis kasutavad <code>#<\/code>. <\/li>\n<li><code>teemavahetuse<\/code> aeglase <code>otsene vahetus<\/code><\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"fanout-exchange\"><em>Fanout Exchange<\/em><\/h4>\n<p><\/p>\n<p><code>Fanout vahetus<\/code> \u2013 <strong>k\u00f5ik s\u00f5numid toimetatakse k\u00f5ikidesse j\u00e4rjekordadesse<\/strong> isegi kui s\u00f5numis on m\u00e4\u00e4ratud marsruudiv\u00f5ti.<\/p>\n<p><\/p>\n<p>suurendatud ressursside piirangud;<\/p>\n<p><\/p>\n<ul>\n<li><code>RabbitMQ<\/code> <strong>ei toimi marsruudiv\u00f5tmete ja mallide puhul<\/strong> mis positiivselt m\u00f5jutab j\u00f5udlust. See on kiireim. <code>vahetus<\/code>;<\/li>\n<li>k\u00f5ik kasutajad peavad olema v\u00f5imelised t\u00f6\u00f6tlema k\u00f5iki s\u00f5numeid;<\/li>\n<\/ul>\n<p><\/p>\n<p>S\u00f5numite voolu graafiline esitus:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 2. Uurime v\u00e4lja 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>Pealkirjade vahetus<\/em><\/h4>\n<p><\/p>\n<p><code>Pealkirjade vahetus<\/code> \u2014 suunab s\u00f5numid seotud j\u00e4rjekordadesse, v\u00f5rreldes paaride (v\u00f5ti, v\u00e4\u00e4rtus) omadusi <code>pealkirjad<\/code> seondumis- ja vastava s\u00f5numi omadusega. <code>pealkirjad<\/code> on <code>Dictionary&lt;v\u00f5ti, v\u00e4\u00e4rtus&gt;<\/code>. <\/p>\n<p><\/p>\n<p>Kui spetsiaalne v\u00f5ti lisada s\u00f5nastikku <code>x-match<\/code> v\u00e4\u00e4rtusega <code>iga<\/code>, siis s\u00f5num suunatakse osalise vaste korral paarides (v\u00f5ti, v\u00e4\u00e4rtus). See k\u00e4itumine vastab operaatorile <code>v\u00f5i<\/code>. <\/p>\n<p><\/p>\n<pre><code class=\"cs\">var bindingArguments = new Dictinary&lt;String, Object&gt;();\nbindingArguments.add(&quot;x-match&quot;, &quot;any&quot;);<\/code><\/pre>\n<p><\/p>\n<p>Kuva v\u00e4\u00e4rtus <code>x-match<\/code> sisaldab v\u00e4\u00e4rtust <code>all<\/code>. See t\u00e4hendab, et s\u00f5num suunatakse t\u00e4pse vaste korral paarides (v\u00f5ti, v\u00e4\u00e4rtus). See k\u00e4itumine vastab operaatorile <code>ja<\/code>.<\/p>\n<p><\/p>\n<p>S\u00f5numite voolu graafiline esitus:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 2. Uurime v\u00e4lja Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/e9a02a0df88cb2c0538b97cec9002bf4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>suurendatud ressursside piirangud;<\/p>\n<p><\/p>\n<ul>\n<li>t\u00e4iendav paindlikkus<\/li>\n<li>t\u00e4iendavad arvutuslikud kulud. K\u00f5ik (v\u00f5ti, v\u00e4\u00e4rtus) paaride atribuudid <code>pealkirjad<\/code> peavad olema sorteeritud v\u00f5tmep\u00e4ringu alusel enne s\u00f5numi suunamisv\u00e4\u00e4rtuste arvutamist. <strong>Aeglasem kui teised vahetuse t\u00fc\u00fcbid<\/strong>.<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"consistent-hashing-exchange\"><em>Consistent-Hashing Exchange<\/em><\/h4>\n<p><\/p>\n<p>See vahetus on <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rabbitmq\/rabbitmq-consistent-hash-exchange\">plugin<\/a><\/noindex> ja <strong>pole sisse ehitatud<\/strong> ja <code>RabbitMQ<\/code>.<\/p>\n<p><\/p>\n<p><code>Consistent-hashing exchange<\/code> (vahetus kindla hash\u2019iga) \u2013 kasutatakse, kui on mitu j\u00e4rjekorda, mis on potentsiaalsed s\u00f5numi saajad ja kui on vajalik tasakaalustada koormust nende vahel. S\u00f5numi seondumine j\u00e4rjekorra juurde toimub kaalu alusel (tingimuslik stringiv\u00e4\u00e4rtus vahemikus <code>0 - n<\/code>). <\/p>\n<p><\/p>\n<p>Vastav kaalu j\u00e4rjekordade vahel \u2013 t\u00e4hendab, et igasse j\u00e4rjekorda j\u00f5uab <strong>umbes sama arv<\/strong> s\u00f5numeid (iga s\u00f5num paigutatakse ainult \u00fchte j\u00e4rjekorda). <strong>T\u00e4ielikku garantiid mitte\u00fchtlasest s\u00f5numite jaotamisest ei ole<\/strong>. <\/p>\n<p><\/p>\n<p>S\u00f5numite voolu graafiline esitus:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 2. Uurime v\u00e4lja Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/dd22749cad463fe86619a98276554e10.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><code>Hash<\/code> arvutatakse marsruudiv\u00f5ti v\u00f5i <code>pealkirjad<\/code> s\u00f5numi omadus. Kui k\u00f5ik avaldatud s\u00f5numid on erinevate marsruudiv\u00f5tmetega v\u00f5i <code>pealkirjad<\/code>, siis jaotamine toimub kaalu j\u00e4rgi. Vastupidisel juhul kasutatakse marsruudiv\u00f5tit v\u00f5i <code>pealkirjad<\/code>.<\/p>\n<p><\/p>\n<p><strong>Peab aitama, kui tarbija l\u00e4bilaskev\u00f5ime peab t\u00f5usma \u00fclespoole, kui lahendus, kus mitu tarbijat kasutavad \u00fchte j\u00e4rjekorda.<\/strong><\/p>\n<p><\/p>\n<h4 id=\"kombinirovanie-obmennikov-e2e\"><em>Vahetuste kombineerimine (E2E)<\/em><\/h4>\n<p><\/p>\n<p>K\u00f5ikide vahetuste k\u00e4itumist saab kombineerida seondumisega <strong>Vahetus-\u00fcle-vahetus<\/strong> (vahetuste kombineerimine ei ole spetsifikatsioonis <code>AMQP<\/code>. See on \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043bi laiendamine poolest <code>RabbitMQ<\/code>).<\/p>\n<p><\/p>\n<p>S\u00f5numite voolu graafiline esitus:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 2. Uurime v\u00e4lja Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/41ea01a0f43f2dd195fa4f34f7fc176c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>T\u00e4nu <code>E2E<\/code> saame leida \u00f5ige skaleeritava konfiguratsiooni, mis vastab nii praegustele kui ka kasvavatele n\u00f5udmistele.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-exchange\"><em>Exchange'i loomine<\/em><\/h4>\n<p><\/p>\n<p>Exchange'i loomine toimub s\u00fcnkroonsete <code>RPC<\/code> serveri p\u00e4ringu kaudu. P\u00e4ring tehakse meetodi <code>Exchange.Declare<\/code>, mis kutsutakse esile koos parameetritega:<\/p>\n<p><\/p>\n<ul>\n<li>vahetuse nimi<\/li>\n<li>vahetuse t\u00fc\u00fcp<\/li>\n<li>muu parameeter<\/li>\n<\/ul>\n<p><\/p>\n<p>N\u00e4ide loomise kohta <code>vahetus<\/code> kohtudes <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>vahetus<\/code> \u2014 vahetuse nimi, mille soovime luua. Nimi peab olema ainulaadne<\/li>\n<li><code>type<\/code> \u2014 vahetuse t\u00fc\u00fcp<\/li>\n<li><code>kestvad<\/code> \u2014 kui seate <code>true<\/code>, siis <code>vahetus<\/code> rikkaks j\u00e4\u00e4b. See salvestatakse kettale ja suudab \u00fcle elada serveri\/brokkeri taask\u00e4ivitamise. Kui v\u00e4\u00e4rtus <code>false<\/code>, siis <code>vahetus<\/code> on ajutine ja kustutatakse, kui server\/brokker taask\u00e4ivitub<\/li>\n<li><code>autoDelete<\/code> \u2014 automaatne kustutamine. <code>Exchange<\/code> kustutatakse, kui k\u00f5ik seotud j\u00e4rjekorrad on eemaldatud<\/li>\n<li><code>\u2014 valikulised argumendid. Allpool vaatame l\u00e4hemalt.<\/code> \u2014 valikulised argumendid. Enamasti m\u00e4\u00e4ratakse argumentide kaudu <code>alternatiivne vahetus<\/code> (<strong>alternatiivne vahetus<\/strong>). Kui s\u00f5num ei saa algset marsruuti j\u00e4rgida, saab selle saata alternatiivsele vahetusele, et suunata see teise teedpidi.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 2. Uurime v\u00e4lja Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/6a352e92f94dadf58ba24de453806133.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kui loomine <code>vahetus<\/code> <strong>v\u00f5ib-olla<\/strong>, siis server saadab kliendile s\u00fcnkroonse <code>RPC<\/code> vastuse <code>Exchange.DeclareOk<\/code>. Kui loomine <strong>teostada<\/strong> (tekib t\u00f5rge p\u00e4ringus <code>Exchange.Declare<\/code>), siis <strong>kanal suletakse<\/strong> serveri kaudu as\u00fcnkroonse k\u00e4su abil <code>Channel.Close<\/code> ja klient saab erandi <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>, mis sisaldab veakoodi ja selle kirjelduse. <\/p>\n<p><\/p>\n<p>Vahetus peab olema loodud enne s\u00f5numite avaldamist. Kui avaldate s\u00f5numi m\u00f5nesse mitteeksisteerivasse vahetusse \u2014 <code>RabbitMQ<\/code> kustutab selle vaikselt.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-exchange-cherez-graficheskiy-interfeys\"><em>Exchange'i loomine graafilise liidesega<\/em><\/h4>\n<p><\/p>\n<p>Siseneme administraatori paneeli <code>RabbitMQ<\/code> kasutaja all <code>guest<\/code> (username: <code>guest<\/code> ja password: <code>guest<\/code>). Pange t\u00e4hele, et kasutaja <code>guest<\/code> saab \u00fchenduda ainult lokaalsest hostist. N\u00fc\u00fcd liigutame vahekaardile <code>Vahetused<\/code> ja vajutame <code>Lisa uus vahetus<\/code>. T\u00e4idame omadused:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 2. Uurime v\u00e4lja Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/c4fd31b8cdb8182690ec8c01ccd2a460.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Enamik omadusi on eespool kirjeldatud. Siin tasub m\u00e4rkida, et kui m\u00e4\u00e4rata <code>Sisemine<\/code>, siis saab vahetust kasutada ainult <code>E2E<\/code>. <code>Producer<\/code> ei saa sellesse vahetusse s\u00f5numeid saata.<\/p>\n<p><\/p>\n<h3 id=\"zaklyuchenie\">Kokkuv\u00f5te<\/h3>\n<p><\/p>\n<p>S\u00fcsteemi arendamisel on mugav kirjeldada <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\">marsruutimise<\/a><\/noindex> grafikuna. Kuid enne graafi loomise alustamist tasub v\u00e4lja joonistada suure liiklusega teed, kuna just need n\u00f5uavad <strong>k\u00f5rgemat l\u00e4bilaskvust<\/strong> (sooritusv\u00f5imet). Seej\u00e4rel saab liiklust klassifitseerida. Ja seej\u00e4rel saab alustada ehitamist.<\/p>\n<p><\/p>\n<p>Kui loodud graafis on <strong>l\u00f5pmatu kogus<\/strong> marsruudiv\u00f5tmeid, siis tasub vaadata mitme poole <code>fanout vahetus<\/code>, mis on 1:1 seotud marsruudiv\u00f5tmega. Peame meeles pidama, et <code>fanout vahetus<\/code> on k\u00f5ige kiirem.<\/p>\n<p><\/p>\n<p>Kui marsruutide arv <strong>l\u00e4heneb l\u00f5pmatusele<\/strong>, siis tasub t\u00e4helepanu p\u00f6\u00f6rata <code>teemavahetuse<\/code> v\u00f5i, kui mall pole vajalik, siis v\u00f5ib valida <code>otsese vahetuse<\/code>, kuna see on kiirem <code>teemavahetuse<\/code>.<\/p>\n<p><\/p>\n<p>Erinevate kombinatsioonide <code>vahetus<\/code> tuleb aidata leida \u00f5ige <strong>skaleeritav konfiguratsioon<\/strong>, mis vastab nii praegustele kui ka kasvavatele s\u00fcsteemi n\u00f5udmistele.<\/p>\n<p><\/p>\n<p>Kogus <code>vahetus<\/code> ja j\u00e4rjekordade arv peaks olema minimaalne v\u00f5rreldes marsruutide arvuga.<\/p>\n<p><\/p>\n<p>J\u00e4rgmises artiklis hakkame s\u00fcgavamalt arvestama Ques ja Bindings'iga.<\/p>\n<p><\/p>\n<h3 id=\"ssylki\">Viidatud lingid<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/\">RabbitMQ projekti veebileht<\/a><\/noindex><\/li>\n<\/ul>\n<p>Allikas: <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.1.1 - 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\/et\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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. Osa 2. Uurime Exchanges | ProHoster","description":"Exchange \u2014 vahetuspunkt v\u00f5i vahetuspunkt. Siia saadetakse s\u00f5numid. Exchange jagab s\u00f5numi \u00fche v\u00f5i mitme j\u00e4rjekorra vahel.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/69621","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=69621"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/69621\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/69622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=69621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=69621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=69621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}