{"id":73065,"date":"2020-03-06T20:42:13","date_gmt":"2020-03-06T17:42:13","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings"},"modified":"2020-03-06T20:42:13","modified_gmt":"2020-03-06T17:42:13","slug":"rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","title":{"rendered":"RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>Coad\u0103<\/code> (coada) \u2014 o structur\u0103 de date pe disk sau \u00een memorie care stocheaz\u0103 referin\u021be la mesaje \u0219i returneaz\u0103 copiile acestora <code>consumers<\/code> (consumatorilor). <code>Coad\u0103<\/code> reprezint\u0103 <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">proces Erlang<\/a><\/noindex> cu starea (unde pot fi memorate \u0219i mesajele \u00een sine). 1.000 de cozi pot ocupa aproximativ 80Mb.<\/p>\n<p><\/p>\n<p><code>Binding<\/code> (leg\u0103tur\u0103) \u2014 o regul\u0103 care informeaz\u0103 brokerul \u00een care dintre cozi ar trebui s\u0103 ajung\u0103 mesajele.<\/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><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490960\/\">RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings<\/a><\/noindex><\/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=\"vremennye-ocheredi\"><em>Cozi temporare<\/em><\/h4>\n<p><\/p>\n<p>Dac\u0103 crearea cozii se face cu parametrul setat <code>autoDelete<\/code>, atunci aceast\u0103 coad\u0103 devine capabil\u0103 <strong>s\u0103 se \u0219terg\u0103 automat<\/strong>. Astfel de cozi sunt de obicei create \u00een momentul conect\u0103rii primului client \u0219i sunt \u0219terse atunci c\u00e2nd to\u021bi clien\u021bii s-au deconectat. <\/p>\n<p><\/p>\n<p>Dac\u0103 crearea cozii se face cu parametrul setat <code>exclusiv<\/code>, atunci aceast\u0103 coad\u0103 <strong>permit conectarea doar unui singur consumator<\/strong> \u0219i este \u0219tears\u0103 dac\u0103 canalul se \u00eenchide. P\u00e2n\u0103 c\u00e2nd canalul nu se \u00eenchide, clientul poate s\u0103 se deconecteze\/conecteze, dar numai \u00een cadrul acelea\u0219i conexiuni. Dac\u0103 parametrul <code>exclusiv<\/code> este setat, atunci parametrul <code>autoDelete<\/code> nu are niciun efect.<\/p>\n<p><\/p>\n<p>Caracteristici:<\/p>\n<p><\/p>\n<ul>\n<li>\u00een cazul unei \u00eentreruperi temporare a conexiunii, vom pierde mesajele care nu au ajuns \u00eenc\u0103 la consumator<\/li>\n<li>se poate observa fenomenul <code>binding churn<\/code>. Fenomenul apare atunci c\u00e2nd num\u0103rul de opera\u021biuni de creare\/\u0219tergere a cozilor \u0219i leg\u0103turilor atinge valori foarte mari. \u00cen modul cluster, acest flux de opera\u021biuni se va r\u0103sp\u00e2ndi pe toate nodurile \u0219i va crea o \u00eenc\u0103rc\u0103tur\u0103 mare. Acest proces poate fi optimizat prin controlul num\u0103rului de subscrieri.<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"postoyannye-ocheredi\"><em>Cozi permanente<\/em><\/h4>\n<p><\/p>\n<p>Dac\u0103 crearea cozii se face cu parametrul setat <code>durabil<\/code>, atunci aceast\u0103 coad\u0103 <strong>\u00ee\u0219i p\u0103streaz\u0103 starea<\/strong> \u0219i se recupereaz\u0103 dup\u0103 repornirea serverului\/brokerului. Aceast\u0103 coad\u0103 va exista p\u00e2n\u0103 c\u00e2nd va fi invocat\u0103 comanda <code>Queue.Delete<\/code>. <\/p>\n<p><\/p>\n<h4 id=\"highly-available-ocheredi\"><em>Cozi \u00eenalt disponibile<\/em><\/h4>\n<p><\/p>\n<p>Cozi HA necesit\u0103 un mediu cluster RabbitMQ. \u00cen modul cluster, toate informa\u021biile despre exchange-uri, cozi, leg\u0103turi \u0219i consumatori vor fi copiate pe toate nodurile.<\/p>\n<p><\/p>\n<p>C\u00e2nd un mesaj este publicat \u00eentr-o coad\u0103 HA, acesta este stocat pe fiecare nod care apar\u021bine cozii HA. Dup\u0103 ce mesajul este consumat pe unul dintre noduri, toate copiile acestui mesaj vor fi \u0219terse pe celelalte noduri. <\/p>\n<p><\/p>\n<p>Cozi HA pot fi distribuite pe toate nodurile dintr-un anumit cluster sau doar pe noduri individuale. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/46d560ab33e686ddf9adb0b18b4bb0b0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Caracteristici:<\/p>\n<p><\/p>\n<ul>\n<li>utilizarea cozii HA duce la penaliz\u0103ri \u00een performan\u021b\u0103. Atunci c\u00e2nd un mesaj este plasat \u00eentr-o coad\u0103 HA sau este consumat din coada HA, RabbitMQ trebuie s\u0103 coordoneze \u00eentre toate nodurile (2-3 noduri sunt de obicei suficiente)<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"sozdanie-ocheredi\"><em>Crearea cozii<\/em><\/h4>\n<p><\/p>\n<p>Crearea cozii se face printr-o opera\u021biune sincronizat\u0103 <code>RPC<\/code> cerere sincron\u0103 la server. Cererea se face prin metoda <code>Queue.Declare<\/code>, apelat\u0103 cu urm\u0103torii parametri:<\/p>\n<p><\/p>\n<ul>\n<li>numele cozii<\/li>\n<li>alte parametrii<\/li>\n<\/ul>\n<p><\/p>\n<p>Exemplu de creare a cozii folosind <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/dotnet.html\">RabbitMQ.Client<\/a><\/noindex>:<\/p>\n<p><\/p>\n<pre><code class=\"cs\">\/\/ ...\nchannel.QueueDeclare(\n    queue: &quot;my_queue&quot;,\n    durable: false,\n    exclusive: false,\n    autoDelete: false,\n    arguments: null\n);\n\/\/ ...<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><code>queue<\/code> \u2014 numele cozii pe care dorim s\u0103 o cre\u0103m. Numele trebuie s\u0103 fie unic \u0219i nu poate coincide cu numele de sistem al cozii<\/li>\n<li><code>durabil<\/code> \u2014 dac\u0103 este true, atunci coada va <strong>men\u021bine starea sa<\/strong> \u0219i se va restaura dup\u0103 repornirea serverului\/broker-ului<\/li>\n<li><code>exclusiv<\/code> \u2014 dac\u0103 este true, atunci coada va permite conectarea doar unui singur consumator<\/li>\n<li><code>autoDelete<\/code> \u2014 dac\u0103 este true, atunci coada ob\u021bine capacitatea <strong>s\u0103 se \u0219terg\u0103 automat<\/strong><\/li>\n<li><code>arguments<\/code> \u2014 argumente op\u021bionale. Mai jos vom detalia.<\/li>\n<\/ul>\n<p><\/p>\n<h5 id=\"arguments\"><em>arguments<\/em><\/h5>\n<p><\/p>\n<ul>\n<li><code>x-message-ttl<\/code>(<code>x-message-time-to-live<\/code>) \u2014 permite stabilirea timpului de expirare a mesajului \u00een milisecunde. Dac\u0103 crearea cozii se face cu o valoare setat\u0103 a argumentului <code>x-message-ttl<\/code>, atunci aceast\u0103 coad\u0103 va <strong>excluz\u00e2nd automat mesajele a c\u0103ror valoare de expirare a expirat<\/strong>. Setarea valorii argumentului <code>x-message-ttl<\/code> stabile\u0219te v\u00e2rsta maxim\u0103 pentru toate mesajele din aceast\u0103 coad\u0103. Crearea unei astfel de cozi <strong>permite prevenirea ob\u021binerii de informa\u021bii \u00eenvechite<\/strong>. Acesta poate fi utilizat \u00een sistemele \u00een timp real. Dac\u0103 coada pentru care este stabilit un schimb pentru mesajele respinse are setat\u0103 valoarea argumentului <code>x-message-ttl<\/code>, atunci mesajele respinse din aceast\u0103 coad\u0103 <strong>vor \u00eencepe s\u0103 aib\u0103 un termen de expirare<\/strong>.<\/li>\n<li><code>x-expires<\/code> \u2014 stabile\u0219te o valoare \u00een milisecunde dup\u0103 care coada este \u0219tears\u0103. Coada poate s\u0103-\u0219i consume termenul de valabilitate doar dac\u0103 nu are abona\u021bi. Dac\u0103 sunt conecta\u021bi abona\u021bi la coad\u0103, aceasta se va putea \u0219terge automat doar atunci c\u00e2nd to\u021bi abona\u021bii vor apela <code>Basic.Cancel<\/code> sau se deconecteaz\u0103. Termenul de valabilitate al cozii se poate \u00eencheia doar dac\u0103 nu a fost cerut <code>Basic.Get<\/code>. Altfel, valoarea curent\u0103 a timpului de via\u021b\u0103 este resetat\u0103 \u0219i coada nu va mai fi \u0219tears\u0103 automat. De asemenea, <strong>nu exist\u0103 garan\u021bii cu privire la c\u00e2t de repede se va \u0219terge coada dup\u0103 expirarea termenului s\u0103u de valabilitate<\/strong>.<\/li>\n<li><code>x-max-length<\/code> \u2014 stabile\u0219te num\u0103rul maxim de mesaje din coad\u0103. Dac\u0103 num\u0103rul de mesaje din coad\u0103 \u00eencepe s\u0103 dep\u0103\u0219easc\u0103 limita maxim\u0103, cele mai vechi mesaje vor \u00eencepe s\u0103 fie \u0219terse.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/738f23dcfdd173a66be619032b46c5cc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li><code>x-max-lenght-bytes<\/code> \u2014 stabile\u0219te dimensiunea maxim\u0103 total\u0103 permis\u0103 a \u00eenc\u0103rc\u0103turii utile a mesajelor din coad\u0103. Dac\u0103 valoarea stabilit\u0103 este dep\u0103\u0219it\u0103 (a ap\u0103rut o supraplin\u0103 a cozii la publicarea unui mesaj), cele mai vechi mesaje vor \u00eencepe s\u0103 fie \u0219terse.<\/li>\n<li><code>x-overflow<\/code> \u2014 acest argument este folosit pentru a configura comportamentul \u00een urma unei supraplin\u0103 a cozii. Sunt disponibile dou\u0103 valori: <code>drop-head<\/code> (valoare implicit\u0103) \u0219i <code>reject-publish<\/code>. Dac\u0103 alege\u021bi <code>drop-head<\/code>, cele mai vechi mesaje vor fi \u0219terse. Dac\u0103 alege\u021bi <code>reject-publish<\/code>, recep\u021bia mesajelor va fi suspendat\u0103.<\/li>\n<li><code>x-dead-letter-exchange<\/code> \u2014 stabile\u0219te exchange-ul \u00een care sunt trimise mesajele respinse, care nu sunt reintroduse \u00een coad\u0103.<\/li>\n<li><code>x-dead-letter-routing-key<\/code> \u2014 stabile\u0219te o cheie de rutare op\u021bional\u0103 pentru mesajele respinse.<\/li>\n<li><code>x-max-priority<\/code> \u2014 permite sortarea pe baza priorit\u0103\u021bilor \u00een coad\u0103, cu o valoare maxim\u0103 a priorit\u0103\u021bii de 255 (RabbitMQ versiunea 3.5.0 \u0219i ulterioare). Num\u0103rul indic\u0103 prioritatea maxim\u0103 pe care o va sprijini coada. Dac\u0103 argumentul nu este stabilit, coada nu va sus\u021bine priorit\u0103\u021bile mesajelor.<\/li>\n<li><code>x-queue-mode<\/code> \u2014 permite trecerea coadei \u00een <strong>mod lene\u0219<\/strong>. \u00cen acest mod, c\u00e2t mai multe mesaje vor fi stocate pe disc. Utilizarea memoriei RAM va fi minim\u0103. \u00cen cazul \u00een care nu este stabilit, coada va stoca mesajele \u00een memorie pentru a livra mesajele c\u00e2t mai rapid.<\/li>\n<li><code>x-queue-master-locator<\/code> \u2014 dac\u0103 avem un cluster, atunci putem specifica coada master.<\/li>\n<li><code>x-ha-policy<\/code> \u2014 este folosit la crearea coadelor HA \u0219i determin\u0103 cum va fi distribuit un mesaj \u00eentre noduri. Dac\u0103 este setat\u0103 valoarea <code>all<\/code>, mesajul va fi p\u0103strat pe toate nodurile. Dac\u0103 este setat\u0103 valoarea <code>nodes<\/code>, mesajul va fi p\u0103strat pe anumite noduri din cluster.<\/li>\n<li><code>x-ha-nodes<\/code> \u2014 stabile\u0219te nodurile la care va fi legat\u0103 o coad\u0103. <code>HA<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/a8f660b6c0a43626e4025cf7769a4425.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dac\u0103 crearea cozii <strong>se poate<\/strong>, serverul va trimite clientului o cerere sincron\u0103 <code>RPC<\/code> r\u0103spuns <code>Queue.DeclareOk.<\/code>Dac\u0103 crearea cozii <strong>nu este posibil<\/strong> (s-a produs o eroare \u00een cerere <code>Queue.Declare<\/code>), atunci <strong>canalul se va \u00eenchide<\/strong> serverului prin intermediul comenzii <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><strong>Un nou apel<\/strong> <code>Queue.Declare<\/code> <strong>cu parametrii similari<\/strong> va returna informa\u021bii utile despre aceast\u0103 coad\u0103. De exemplu, num\u0103rul total de mesaje \u00een a\u0219teptare \u00een aceast\u0103 coad\u0103 \u0219i num\u0103rul total de consumatori abona\u021bi la aceasta. <\/p>\n<p><\/p>\n<p>Apel <code>Queue.Declare<\/code> sub contul utilizatorului care nu are drepturile necesare <strong>va \u00eenchide canalul<\/strong> folosind comanda <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 <noindex><a rel=\"nofollow\" href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/HTTP\/Status\/403\">403<\/a><\/noindex> \u0219i descrierea acesteia.<\/p>\n<p><\/p>\n<p>Dup\u0103 ce coada st\u0103 \u00een inactivitate timp de &gt;= 10 secunde, aceasta <strong>intra \u00een modul de a\u0219teptare<\/strong>, provoc\u00e2nd apelarea GC \u00een coad\u0103, ceea ce duce la o reducere semnificativ\u0103 a memoriei necesare pentru aceast\u0103 coad\u0103.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-queue-cherez-graficheskiy-interfeys\"><em>Crearea Queue 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>Queues<\/code> \u0219i s\u0103 facem clic pe <code>Ad\u0103uga\u021bi o nou\u0103 coad\u0103<\/code>. Completa\u021bi propriet\u0103\u021bile:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/ea77a406ad16f0871c7197e96a66818f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Odat\u0103 ce am introdus toate datele necesare \u0219i ap\u0103s\u0103m pe <code>Ad\u0103uga\u021bi cozi<\/code>, coada va ap\u0103rea \u00een lista general\u0103.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/8342e044a0d6c0a035a2c9f646035cad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Click pe numele cozii va ar\u0103ta informa\u021biile detaliate. Aici putem configura leg\u0103tura dintre schimb \u0219i coad\u0103, vizualiza lista <code>consumers<\/code>, publica \/ primi mesaje, \u0219terge coada \u0219i vizualiza statistici.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding\"><em>Crearea Binding<\/em><\/h4>\n<p><\/p>\n<p>Crearea leg\u0103turii se face printr-un <code>RPC<\/code> cerere sincron\u0103 la server. Cererea se face prin metoda <code>Queue.Bind<\/code>, apelat\u0103 cu urm\u0103torii parametri:<\/p>\n<p><\/p>\n<ul>\n<li>numele cozii<\/li>\n<li>numele punctului de schimb<\/li>\n<li>alte parametrii<\/li>\n<\/ul>\n<p><\/p>\n<p>Exemplu de creare a leg\u0103turii folosind <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/dotnet.html\">RabbitMQ.Client<\/a><\/noindex>:<\/p>\n<p><\/p>\n<pre><code class=\"cs\">\/\/...\nchannel.QueueBind(\n    queue: queueName,\n    exchange: &quot;my_exchange&quot;,\n    routingKey: &quot;my_key&quot;,\n    arguments: null\n);\n\/\/...<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><code>queue<\/code> \u2014 numele cozii<\/li>\n<li><code>exchange<\/code> \u2014 numele schimbului<\/li>\n<li><code>routingKey<\/code> \u2014 cheia de rutare<\/li>\n<li><code>arguments<\/code> \u2014 argumente op\u021bionale<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/9123186c94a822309b679f26c2e511ea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dac\u0103 crearea leg\u0103turii <strong>se poate<\/strong>, serverul va trimite clientului o cerere sincron\u0103 <code>RPC<\/code> r\u0103spuns <code>Queue.BindOk<\/code>.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding-cherez-graficheskiy-interfeys\"><em>Crearea Binding 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>Queues<\/code> \u0219i ap\u0103s\u0103m pe coad\u0103 <code>my_queue<\/code>. Completa\u021bi c\u00e2mpurile din sec\u021biunea <code>bindings<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/7db6b42a4f29a1860aabe54ade0b6833.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Odat\u0103 ce am introdus toate datele necesare \u0219i ap\u0103s\u0103m pe <code>Bind<\/code>, leg\u0103tura va fi afi\u0219at\u0103 \u00een lista general\u0103:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/499eda8e8cb061e6feb75c471eb64b92.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"code\">Cod<\/h3>\n<p><\/p>\n<p>\u00cen aceast\u0103 sec\u021biune vom descrie coada \u0219i leg\u0103tura cu cod C#, ca \u0219i cum ar trebui s\u0103 dezvolt\u0103m o bibliotec\u0103. Poate fi util pentru \u00een\u021belegere.<\/p>\n<p><\/p>\n<pre><code class=\"cs\">public interface IQueue\n    {        \n        string Name { get; }\n\n        \/\/ <summary>\n        \/\/     Dac\u0103 este setat true, coada va fi persistent\u0103. \n        \/\/     Aceasta va fi stocat\u0103 pe disc \u0219i va putea \n        \/\/     supravie\u021bui repornirii serverului \/ brokerului. \n        \/\/     Dac\u0103 este false, coada este temporar\u0103 \u0219i va fi \u0219tears\u0103, \n        \/\/     c\u00e2nd serverul \/ brokerul va fi repornit\n        \/\/ <\/summary>\n        bool IsDurable { get; }\n\n        \/\/ <summary>\n        \/\/     Dac\u0103 este true, \n        \/\/     aceast\u0103 coad\u0103 va permite conectarea \n        \/\/     doar unui consumator\n        \/\/ <\/summary>\n        bool IsExclusive { get; }\n\n        \/\/ <summary>\n        \/\/     \u0218tergere automat\u0103. \n        \/\/     Coada va fi \u0219tears\u0103, c\u00e2nd to\u021bi clien\u021bii se deconecteaz\u0103.\n        \/\/ <\/summary>\n        bool IsAutoDelete { get; }\n\n        \/\/ <summary>\n        \/\/     Argumente op\u021bionale\n        \/\/ <\/summary>\n        IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">public class Queue : IQueue\n    {\n        public Queue(\n             string name, \n             bool isDurable = true, \n             bool isExclusive = false, \n             bool isAutoDelete = false, \n             IDictionary arguments = null)\n        {\n            Name = name ??\n                throw new ArgumentNullException(name, $\"{name} nu trebuie s\u0103 fie nul\");\n\n            IsDurable = isDurable;\n            IsExclusive = isExclusive;\n            IsAutoDelete = isAutoDelete;\n            Arguments = arguments ?? new Dictionary();\n        }\n\n        public string Name { get; }\n        public bool IsDurable { get; }\n        public bool IsExclusive { get; }\n        public bool IsAutoDelete { get; }\n        public IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">public static class QueueMode\n    {       \n        public const string Default = \"default\";\n        \n        \/\/ <summary>\n        \/\/     Mod de func\u021bionare lene\u0219. Mod de func\u021bionare lene\u0219 va for\u021ba salvarea \n        \/\/     c\u00e2t mai multor mesaje pe disc, pentru a reduce \n        \/\/     utilizarea memoriei operative\n        \/\/ <\/summary>\n        public const string Lazy = \"lazy\";\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">public interface IBinding\n    {\n        \/\/ <summary>\n        \/\/     Schimb\u0103tor care va fi legat printr-o leg\u0103tur\u0103\n        \/\/ <\/summary>\n        IExchange Exchange { get; }\n\n        \/\/ <summary>\n        \/\/     Cheie de rutare\n        \/\/ <\/summary>\n        string RoutingKey { get; }\n\n        \/\/ <summary>\n        \/\/     Argumente op\u021bionale\n        \/\/ <\/summary>\n        IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">public class Binding : IBinding\n    {\n        public Binding(\n             IExchange exchange, \n             string routingKey, \n             IDictionary arguments)\n        {\n            Exchange = exchange;\n            RoutingKey = routingKey;\n            Arguments = arguments;\n        }\n\n        public IExchange Exchange { get; }\n        public string RoutingKey { get; }\n        public IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490960\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c). Queue \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 Erlang-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c (\u0433\u0434\u0435 \u043c\u043e\u0433\u0443\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u0430\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f). 1 \u0442\u044b\u0441\u044f\u0447\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u0430 80Mb. Binding (\u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430) \u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a\u0443 \u0432 \u043a\u0430\u043a\u0443\u044e \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":73066,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-73065","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c).\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings\" \/>\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 3. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 Queues \u0438 Bindings | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c).\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-06T17:42:13+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-06T17:42:13+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47RabbitMQ. Partea 3. \u00cen\u021belegem Queues \u0219i Bindings | ProHoster","description":"Queue (coada) \u2014 o structur\u0103 de date pe disc sau \u00een memorie operativ\u0103, care stocheaz\u0103 referin\u021be la mesaje \u0219i le furnizeaz\u0103 copii consumatorilor.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","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 3. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 Queues \u0438 Bindings | ProHoster","og:description":"Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c).","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-06T17:42:13+00:00","article:modified_time":"2020-03-06T17:42:13+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"73065","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:41:06","updated":"2022-09-30 05:07:23","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/73065","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=73065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/73065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/73066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=73065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=73065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=73065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}