{"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\/ro\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","title":{"rendered":"RabbitMQ. Partea 2. S\u0103 \u00een\u021belegem schimburile","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>Exchange<\/code> \u2014 schimb valutar sau punct de schimb. Mesajele sunt trimise \u00een acesta. <code>Exchange<\/code> <strong>distribuie mesajul<\/strong> \u00een una sau mai multe cozi. El <strong>ruteaz\u0103 mesajele c\u0103tre coad\u0103<\/strong> pe baza leg\u0103turilor create (<code>bindings<\/code>) \u00eentre el \u0219i coad\u0103. <\/p>\n<p><\/p>\n<p><code>Exchange<\/code> nu este <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">un proces Erlang<\/a><\/noindex>. Din motive de scalabilitate <code>exchange<\/code> \u2014 aceasta este o linie (link c\u0103tre modulul cu codul unde se afl\u0103 logica de rutare) \u00een baza de date \u00eencorporat\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Mnesia\">mnesia<\/a><\/noindex>. 1.000 de schimburi vor consuma doar 1MB de memorie. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"oglavlenie\">Cuprins<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/488654\/\">RabbitMQ. Partea 1. Introducere. Erlang, AMQP \u0219i RPC<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">RabbitMQ. Partea 2. S\u0103 \u00een\u021belegem schimburile<\/a><\/noindex><\/li>\n<li>RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings<\/li>\n<li>RabbitMQ. Partea 4. \u00cen\u021belegem ce reprezint\u0103 mesajele \u0219i cadrele<\/li>\n<li>RabbitMQ. Partea 5. Performan\u021ba public\u0103rii \u0219i consumului de mesaje<\/li>\n<li>RabbitMQ. Partea 6. Prezentarea modulelor Federation \u0219i Shovel<\/li>\n<li>RabbitMQ. Partea 7. Detalii despre Conexiune \u0219i Canal<\/li>\n<li>RabbitMQ. Partea 8. RabbitMQ \u00een .NET<\/li>\n<li>RabbitMQ. Partea 9. Monitorizare<\/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 este utilizat c\u00e2nd este necesar <strong>s\u0103 livr\u0103m un mesaj \u00een cozi specifice<\/strong>. Mesajul este publicat \u00een schimbul cu un anumit <strong>cheie de rutare<\/strong> \u0219i ajunge \u00een toate cozile legate de acest schimb cu o cheie de rutare similar\u0103. <strong>Cheia de rutare este o linie<\/strong>. C\u0103utarea coresponden\u021bei se face prin <strong>verificarea echivalen\u021bei liniilor<\/strong>.<\/p>\n<p><\/p>\n<p>Reprezentarea grafic\u0103 a fluxului de mesaje:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 2. S\u0103 \u00een\u021belegem schimburile\" src=\"\/wp-content\/uploads\/2020\/02\/8ce3ab37542f2a7f8e7ac02a737c5f88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen <code>rabbitmq<\/code> exist\u0103 un concept <strong>de schimb implicit<\/strong>. Aceasta <code>direct exchange<\/code> f\u0103r\u0103 nume. Dac\u0103 se utilizeaz\u0103 un schimb implicit, atunci mesajul va fi rutat c\u0103tre coada cu numele egal cu <strong>cheia de rutare a mesajului<\/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 similar <code>direct exchange<\/code> ofer\u0103 posibilitatea de a realiza rutare selectiv\u0103 prin compararea cheii de rutare. Dar, \u00een acest caz, cheia este definit\u0103 <strong>dup\u0103 un model<\/strong>. La crearea modelului se utilizeaz\u0103 <code>0<\/code> una sau mai multe cuvinte (litere <code>AZ<\/code> \u0219i <code>az<\/code> \u0219i cifre <code>0-9<\/code>), separate prin punct, precum \u0219i simboluri <code>*<\/code> \u0219i <code>#<\/code>. <\/p>\n<p><\/p>\n<ul>\n<li><code>*<\/code> \u2014 poate fi \u00eenlocuit cu exact <code>1<\/code> cuv\u00e2nt <\/li>\n<li><code>#<\/code> \u2014 poate fi \u00eenlocuit cu <code>0<\/code> una sau mai multe cuvinte <\/li>\n<\/ul>\n<p><\/p>\n<p>Reprezentarea grafic\u0103 a fluxului de mesaje:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 2. S\u0103 \u00een\u021belegem schimburile\" src=\"\/wp-content\/uploads\/2020\/02\/a0ce48b291a3003eabbe61b3dfa5a4e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cencep\u00e2nd cu versiunea <code>RabbitMQ 2.4.0<\/code> algoritmul de rutare pentru <code>topic exchange<\/code> a \u00eenceput s\u0103 func\u021bioneze de <code>145<\/code> de \u0103 ori mai repede. Acest lucru a fost realizat prin implementarea metodei <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>, care implic\u0103 reprezentarea modelelor sub form\u0103 de structur\u0103 de arbore. De exemplu, modelele <code>a.b.c<\/code>, <code>a.*.b.c<\/code>, <code>a.#.c<\/code> \u0219i <code>b.b.c<\/code> vor fi reprezentate de urm\u0103toarea structur\u0103:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 2. S\u0103 \u00een\u021belegem schimburile\" src=\"\/wp-content\/uploads\/2020\/02\/56ef5809fec9eb6c1b50a362b89dd05a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C\u0103utarea coresponden\u021bei cu modelul se realizeaz\u0103, \u00eencep\u00e2nd de la r\u0103d\u0103cin\u0103 \u0219i merg\u00e2nd de sus \u00een jos.<\/p>\n<p><\/p>\n<p>Caracteristici:<\/p>\n<p><\/p>\n<ul>\n<li>aplicarea acestui schimb poate fi <strong>o alegere bun\u0103 pentru o posibil\u0103 dezvoltare viitoare a aplica\u021biei<\/strong>, deoarece modelele pot fi \u00eentotdeauna configurate astfel \u00eenc\u00e2t mesajul s\u0103 fie publicat similar <code>direct exchange<\/code> sau <code>fanout exchange<\/code><\/li>\n<li>modele care folosesc <code>*<\/code> <strong>este mult mai rapid<\/strong>, dec\u00e2t modelele care folosesc <code>#<\/code>. <\/li>\n<li><code>topic exchange<\/code> mai lent <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>toate mesajele sunt livrate \u00een toate cozile<\/strong> chiar dac\u0103 \u00een mesaj se specific\u0103 o cheie de rutare.<\/p>\n<p><\/p>\n<p>Caracteristici:<\/p>\n<p><\/p>\n<ul>\n<li><code>RabbitMQ<\/code> <strong>nu func\u021bioneaz\u0103 cu chei de rutare \u0219i modele<\/strong> ceea ce influen\u021beaz\u0103 pozitiv performan\u021ba. Acesta este cel mai rapid <code>exchange<\/code>;<\/li>\n<li>to\u021bi consumatorii ar trebui s\u0103 aib\u0103 capacitatea de a procesa toate mesajele;<\/li>\n<\/ul>\n<p><\/p>\n<p>Reprezentarea grafic\u0103 a fluxului de mesaje:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 2. S\u0103 \u00een\u021belegem schimburile\" 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 direc\u021bioneaz\u0103 mesajele \u00een cozi conexe pe baza compara\u021biei perechilor (cheie, valoare) a propriet\u0103\u021bii <code>headers<\/code> \u00eentre\u021binerii \u0219i a propriet\u0103\u021bii similare a mesajului. <code>headers<\/code> reprezint\u0103 <code>Dictionary<\/code>. <\/p>\n<p><\/p>\n<p>Dac\u0103 se adaug\u0103 o cheie special\u0103 \u00een dic\u021bionar <code>x-match<\/code> cu valoarea <code>any<\/code>, atunci mesajul este rutat la o potrivire par\u021bial\u0103 a perechilor (cheie, valoare). Acest comportament este similar cu operatorul <code>sau<\/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>\u00cen mod implicit, cheia <code>x-match<\/code> con\u021bine valoarea <code>all<\/code>. Aceasta \u00eenseamn\u0103 c\u0103 mesajul este rutat la o potrivire complet\u0103 a perechilor (cheie, valoare). Acest comportament este similar cu operatorul <code>\u0219i<\/code>.<\/p>\n<p><\/p>\n<p>Reprezentarea grafic\u0103 a fluxului de mesaje:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 2. S\u0103 \u00een\u021belegem schimburile\" src=\"\/wp-content\/uploads\/2020\/02\/e9a02a0df88cb2c0538b97cec9002bf4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Caracteristici:<\/p>\n<p><\/p>\n<ul>\n<li>flexibilitate suplimentar\u0103<\/li>\n<li>costuri suplimentare de calcul. Toate perechile (cheie, valoare) ale atributului <code>headers<\/code> trebuie sortate dup\u0103 numele cheii \u00eenainte de a calcula valorile de rutare ale mesajului. <strong>Mai lent dec\u00e2t alte tipuri de 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>Aceast\u0103 interschimbare este <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rabbitmq\/rabbitmq-consistent-hash-exchange\">un plugin<\/a><\/noindex> \u0219i <strong>nu este integrat<\/strong> \u00een <code>RabbitMQ<\/code>.<\/p>\n<p><\/p>\n<p><code>Consistent-hashing exchange<\/code> (exchange cu hash consistent) \u2013 este folosit atunci c\u00e2nd exist\u0103 mai multe cozi care sunt poten\u021biali destinatari ai mesajului \u0219i c\u00e2nd trebuie s\u0103 echilibr\u0103m carga \u00eentre ele. Rela\u021bia mesajului cu coada se face pe greutate (o valoare de tip \u0219ir condi\u021bionat\u0103 de la <code>0 - n<\/code>). <\/p>\n<p><\/p>\n<p>Greutatea echivalent\u0103 a cozilor \u2013 indic\u0103 faptul c\u0103 \u00een fiecare coad\u0103 va ajunge <strong>aproximativ aceea\u0219i cantitate<\/strong> de mesaje (fiecare mesaj va fi plasat doar \u00eentr-o singur\u0103 coad\u0103). <strong>Nu exist\u0103 nicio garan\u021bie complet\u0103 de distribu\u021bie uniform\u0103 a mesajelor<\/strong>. <\/p>\n<p><\/p>\n<p>Reprezentarea grafic\u0103 a fluxului de mesaje:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 2. S\u0103 \u00een\u021belegem schimburile\" src=\"\/wp-content\/uploads\/2020\/02\/dd22749cad463fe86619a98276554e10.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><code>Hash<\/code> este calculat pe baza cheii de rutare sau a propriet\u0103\u021bii <code>headers<\/code> mesajului. Dac\u0103 toate mesajele publicate au avut chei de rutare diferite sau <code>headers<\/code>, atunci distribu\u021bia se va face pe greutate. \u00cen caz contrar, se va utiliza cheia de rutare sau <code>headers<\/code>.<\/p>\n<p><\/p>\n<p><strong>Ar trebui s\u0103 ajute atunci c\u00e2nd capacitatea de procesare a consumatorului necesit\u0103 o cre\u0219tere mai mare dec\u00e2t solu\u021bia cu mai mul\u021bi consumatori folosind o singur\u0103 coad\u0103.<\/strong><\/p>\n<p><\/p>\n<h4 id=\"kombinirovanie-obmennikov-e2e\"><em>Combinarea exchange-urilor (E2E)<\/em><\/h4>\n<p><\/p>\n<p>Comportamentul tuturor exchange-urilor poate fi combinat prin intermediul leg\u0103turii <strong>Exchange-to-Exchange<\/strong> (combinarea exchange-urilor nu este inclus\u0103 \u00een specifica\u021bie <code>AMQP<\/code>. Aceasta este o extensie a protocolului din partea <code>RabbitMQ<\/code>).<\/p>\n<p><\/p>\n<p>Reprezentarea grafic\u0103 a fluxului de mesaje:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 2. S\u0103 \u00een\u021belegem schimburile\" src=\"\/wp-content\/uploads\/2020\/02\/41ea01a0f43f2dd195fa4f34f7fc176c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prin <code>E2E<\/code> putem g\u0103si configura\u021bia scalabil\u0103 potrivit\u0103, care \u00eendepline\u0219te at\u00e2t cerin\u021bele actuale, c\u00e2t \u0219i pe cele \u00een cre\u0219tere.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-exchange\"><em>Crearea Exchange<\/em><\/h4>\n<p><\/p>\n<p>Crearea unui exchanger se face printr-o <code>RPC<\/code> cerere sincron\u0103 la server. Cererea se face prin metoda <code>Exchange.Declare<\/code>, apelat\u0103 cu urm\u0103torii parametri:<\/p>\n<p><\/p>\n<ul>\n<li>numele exchanger-ului<\/li>\n<li>tipul exchanger-ului<\/li>\n<li>alte parametrii<\/li>\n<\/ul>\n<p><\/p>\n<p>Exemplu de creare <code>exchange<\/code> cu ajutorul <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 numele exchanger-ului pe care dorim s\u0103-l cre\u0103m. Numele trebuie s\u0103 fie unic.<\/li>\n<li><code>type<\/code> \u2014 tipul exchanger-ului<\/li>\n<li><code>durabil<\/code> \u2014 dac\u0103 se seteaz\u0103 <code>true<\/code>, atunci <code>exchange<\/code> va fi permanent. Acesta va fi salvat pe disc \u0219i va putea supravie\u021bui repornirii serverului\/brokerului. Dac\u0103 valoarea <code>false<\/code>, atunci <code>exchange<\/code> este temporar\u0103 \u0219i va fi \u0219tears\u0103 atunci c\u00e2nd serverul\/brokerul va fi repornit.<\/li>\n<li><code>autoDelete<\/code> \u2014 \u0219tergere automat\u0103. <code>Exchange<\/code> va fi \u0219ters atunci c\u00e2nd toate cozile asociate vor fi \u0219terse.<\/li>\n<li><code>arguments<\/code> \u2014 argumente op\u021bionale. Cel mai adesea, prin argumente se define\u0219te <code>alternative exchange<\/code> (<strong>exchanger alternativ<\/strong>). Dac\u0103 mesajul nu poate urma ruta ini\u021bial\u0103, acesta poate fi trimis c\u0103tre exchanger-ul alternativ pentru a fi rutat pe o alt\u0103 cale.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 2. S\u0103 \u00een\u021belegem schimburile\" src=\"\/wp-content\/uploads\/2020\/02\/6a352e92f94dadf58ba24de453806133.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dac\u0103 crearea <code>exchange<\/code> <strong>se poate<\/strong>, serverul va trimite clientului o cerere sincron\u0103 <code>RPC<\/code> r\u0103spuns <code>Exchange.DeclareOk<\/code>. Dac\u0103 crearea <strong>nu este posibil<\/strong> (s-a produs o eroare \u00een cerere <code>Exchange.Declare<\/code>), atunci <strong>canalul se va \u00eenchide<\/strong> de server printr-o comand\u0103 asincron\u0103 <code>Channel.Close<\/code> \u0219i clientul va primi o excep\u021bie <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>, care va con\u021bine codul de eroare \u0219i descrierea acesteia. <\/p>\n<p><\/p>\n<p>Exchanger-ul trebuie creat \u00eenainte de a publica mesaje. Dac\u0103 publica\u021bi un mesaj \u00eentr-un exchanger inexistent \u2014 <code>RabbitMQ<\/code> \u00eel va \u0219terge \u00een t\u0103cere.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-exchange-cherez-graficheskiy-interfeys\"><em>Crearea Exchange prin interfa\u021ba grafic\u0103<\/em><\/h4>\n<p><\/p>\n<p>Acces\u0103m panoul de administrare <code>RabbitMQ<\/code> sub utilizatorul <code>guest<\/code> (username: <code>guest<\/code> \u0219i password: <code>guest<\/code>). Re\u021bine\u021bi c\u0103 utilizatorul <code>guest<\/code> se poate conecta doar de pe gazda local\u0103. Acum s\u0103 mergem la tab-ul <code>Exchanges<\/code> \u0219i s\u0103 facem clic pe <code>Ad\u0103uga\u021bi un nou exchange<\/code>. Completa\u021bi propriet\u0103\u021bile:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 2. S\u0103 \u00een\u021belegem schimburile\" src=\"\/wp-content\/uploads\/2020\/02\/c4fd31b8cdb8182690ec8c01ccd2a460.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Majoritatea propriet\u0103\u021bilor au fost descrise mai sus. Aici men\u021bion\u0103m c\u0103, dac\u0103 se seteaz\u0103 <code>Internal<\/code>, atunci exchanger-ul poate fi utilizat doar pentru <code>E2E<\/code>. <code>Producer<\/code> nu va putea trimite mesaje c\u0103tre un astfel de exchanger.<\/p>\n<p><\/p>\n<h3 id=\"zaklyuchenie\">Concluzie<\/h3>\n<p><\/p>\n<p>Atunci c\u00e2nd dezvolta\u021bi un sistem, este util s\u0103 descrie\u021bi topologia <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\">rut\u0103rii<\/a><\/noindex> prin intermediul unui grafic. Dar \u00eenainte de a \u00eencepe s\u0103 construi\u021bi graficul, este bine s\u0103 identifica\u021bi c\u0103ile cu un trafic mare, deoarece acestea necesit\u0103 <strong>o l\u0103\u021bime de band\u0103 mai mare.<\/strong> (performan\u021b\u0103). Apoi se poate clasifica traficul. \u0218i abia apoi se poate \u00eencepe construc\u021bia.<\/p>\n<p><\/p>\n<p>Dac\u0103 \u00een graficul construit exist\u0103 <strong>un set final<\/strong> de chei de rutare, atunci este cazul s\u0103 se ia \u00een considerare mai multe <code>fanout exchange<\/code>, care sunt legate 1:1 de cheia de rutare. S\u0103 ne amintim c\u0103 <code>fanout exchange<\/code> este cea mai rapid\u0103.<\/p>\n<p><\/p>\n<p>Dac\u0103 num\u0103rul de rute <strong>tinde spre infinit<\/strong>, atunci este bine s\u0103 ne concentr\u0103m pe <code>topic exchange<\/code> sau, dac\u0103 \u0219ablonul nu este necesar, se poate alege <code>direct exchange<\/code>, deoarece este mai rapid <code>topic exchange<\/code>.<\/p>\n<p><\/p>\n<p>Combinarea diferitelor <code>exchange<\/code> ar trebui s\u0103 ajute la g\u0103sirea configura\u021biei corecte <strong>scalabile<\/strong>, care r\u0103spunde at\u00e2t cerin\u021belor actuale, c\u00e2t \u0219i celor \u00een cre\u0219tere ale sistemului.<\/p>\n<p><\/p>\n<p>Num\u0103r <code>exchange<\/code> iar cozii ar trebui s\u0103 fie minime \u00een compara\u021bie cu num\u0103rul de rute.<\/p>\n<p><\/p>\n<p>\u00cen articolul urm\u0103tor, vom \u00eencepe s\u0103 ne aprofund\u0103m \u00een Queues \u0219i Bindings.<\/p>\n<p><\/p>\n<h3 id=\"ssylki\">Linkuri<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/\">Site-ul proiectului RabbitMQ<\/a><\/noindex><\/li>\n<\/ul>\n<p>Sursa: <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.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\/ro\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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. Partea 2. \u00cen\u021belegem Exchanges | ProHoster","description":"Exchange \u2014 un schimb sau un punct de schimb. Aici sunt trimise mesajele. Exchange distribuie mesajul \u00eentr-una sau mai multe cozi.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/69621","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=69621"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/69621\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/69622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=69621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=69621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=69621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}