{"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\/et\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","title":{"rendered":"RabbitMQ. Osa 3. Uurime Queue-sid ja Bindings-e","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>Oote<\/code> (oote) \u2014 andmestruktuur, mis asub kettal v\u00f5i m\u00e4lus ja hoiab linke s\u00f5numitele ning edastab nende koopiaid <code>tarbijatele<\/code> (tarbijatele). <code>Oote<\/code> on <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">Erlang-protsess<\/a><\/noindex> olekuga (kus v\u00f5ivad olla vahem\u00e4lus ka s\u00f5numid). 1000 ootej\u00e4rjekorda v\u00f5ib v\u00f5tta umbes 80Mb.<\/p>\n<p><\/p>\n<p><code>Sidumine<\/code> (sidumine) \u2014 reegel, mis \u00fctleb vahetusele, millisesse ootej\u00e4rjekorda s\u00f5numid peaksid j\u00f5udma.<\/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><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490960\/\">RabbitMQ. Osa 3. Uurime Queue-sid ja Bindings-e<\/a><\/noindex><\/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=\"vremennye-ocheredi\"><em>Ajutised ootej\u00e4rjekorrad<\/em><\/h4>\n<p><\/p>\n<p>Kui ootej\u00e4rjekorra loomine toimub m\u00e4\u00e4ratud parameetri <code>autoDelete<\/code>, siis selline j\u00e4rjekord omandab v\u00f5ime <strong>automaatne kustutamine<\/strong>. Sellised j\u00e4rjekorrad luuakse tavaliselt esimese kliendi \u00fchendamisel ja kustutatakse siis, kui k\u00f5ik kliendid lahti \u00fchenduvad. <\/p>\n<p><\/p>\n<p>Kui ootej\u00e4rjekorra loomine toimub m\u00e4\u00e4ratud parameetri <code>eksklusiivne<\/code>, siis selline j\u00e4rjekord <strong>lubab ainult \u00fchel tarbijal \u00fchenduda<\/strong> ja kustutatakse, kui kanal suletakse. Kuni kanal ei ole suletud, v\u00f5ib klient lahti \u00fchenduda ja uuesti \u00fchenduda, kuid ainult sama seose piires. Kui parameeter <code>eksklusiivne<\/code> on m\u00e4\u00e4ratud, siis parameeter <code>autoDelete<\/code> ei oma mingit m\u00f5ju.<\/p>\n<p><\/p>\n<p>suurendatud ressursside piirangud;<\/p>\n<p><\/p>\n<ul>\n<li>ajutise katkestuse korral kaotame s\u00f5numid, mis ei ole veel tarbijani j\u00f5udnud<\/li>\n<li>v\u00f5ime j\u00e4lgida n\u00e4htust <code>sidumise keerukus<\/code>. See n\u00e4htus tekib, kui loodud ja eemaldatud ootej\u00e4rjekordade ja sidumiste arv saavutab v\u00e4ga suure v\u00e4\u00e4rtuse. Klasterre\u017eiimis levib see toimingute voog k\u00f5igi s\u00f5lmede vahel ja loob suurt koormust. Seda protsessi saab optimeerida tellimuste arvu kontrollimise kaudu<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"postoyannye-ocheredi\"><em>P\u00fcsivad ootej\u00e4rjekorrad<\/em><\/h4>\n<p><\/p>\n<p>Kui ootej\u00e4rjekorra loomine toimub m\u00e4\u00e4ratud parameetri <code>kestvad<\/code>, siis selline j\u00e4rjekord <strong>salvestavad oma oleku<\/strong> ja taastuvad p\u00e4rast serveri\/brokkeri taask\u00e4ivitamist. Antud j\u00e4rjekord p\u00fcsib seni, kuni k\u00e4ivitatakse k\u00e4sk <code>Queue.Delete<\/code>. <\/p>\n<p><\/p>\n<h4 id=\"highly-available-ocheredi\"><em>K\u00f5rge k\u00e4ttesaadavusega ootej\u00e4rjekorrad<\/em><\/h4>\n<p><\/p>\n<p>HA j\u00e4rjekorrad n\u00f5uavad RabbitMQ klastrikeskkonda. Klusterre\u017eiimis kopeeritakse kogu teave vahetuste, ootej\u00e4rjekordade, sidumiste ja tarbijate kohta k\u00f5igile s\u00f5lmedele.<\/p>\n<p><\/p>\n<p>Kui s\u00f5num avaldatakse HA j\u00e4rjekorda, salvestatakse see iga s\u00f5lme, mis kuulub HA j\u00e4rjekonda. P\u00e4rast seda, kui s\u00f5num tarbitakse m\u00f5nes s\u00f5lmes, eemaldatakse k\u00f5ik selle s\u00f5numi koopiad teistelt s\u00f5lmedelt. <\/p>\n<p><\/p>\n<p>HA j\u00e4rjekorrad v\u00f5ivad laieneda k\u00f5igile s\u00f5lmedele mingis klastris v\u00f5i ainult individuaalsetele. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 3. Uurime Queue-sid ja Bindings-e\" src=\"\/wp-content\/uploads\/2020\/03\/46d560ab33e686ddf9adb0b18b4bb0b0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>suurendatud ressursside piirangud;<\/p>\n<p><\/p>\n<ul>\n<li>HA j\u00e4rjekordade kasutamine v\u00f5ib kaasa tuua tulemuslikkuse karistusi. Kui s\u00f5num pannakse mingisse HA j\u00e4rjekorda v\u00f5i kui s\u00f5numit tarbitakse HA j\u00e4rjekorrast, peab RabbitMQ koordineerima k\u00f5ikide s\u00f5lmede vahel (2-3 s\u00f5lme on tavaliselt piisavad).<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"sozdanie-ocheredi\"><em>J\u00e4rjekorra loomine<\/em><\/h4>\n<p><\/p>\n<p>J\u00e4rjekorra loomine toimub s\u00fcnkroonse <code>RPC<\/code> serveri p\u00e4ringu kaudu. P\u00e4ring tehakse meetodi <code>Queue.Declare<\/code>, mis kutsutakse esile koos parameetritega:<\/p>\n<p><\/p>\n<ul>\n<li>j\u00e4rjekorra nimi<\/li>\n<li>muu parameeter<\/li>\n<\/ul>\n<p><\/p>\n<p>N\u00e4ide j\u00e4rjekorra loomisest kasutades <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 j\u00e4rjekorra nimi, mille soovime luua. Nimi peab olema ainulaadne ja ei tohi kattuda s\u00fcsteemi j\u00e4rjekorra nimega.<\/li>\n<li><code>kestvad<\/code> \u2014 kui true, siis j\u00e4rjekord s\u00e4ilitab oma oleku <strong>ja taastatakse p\u00e4rast serveri\/brokkeri taask\u00e4ivitamist.<\/strong> \u2014 kui true, siis j\u00e4rjekord lubab \u00fchendada ainult \u00fchte tarbijat.<\/li>\n<li><code>eksklusiivne<\/code> \u2014 kui true, siis j\u00e4rjekord omandab v\u00f5ime<\/li>\n<li><code>autoDelete<\/code> arguments <strong>automaatne kustutamine<\/strong><\/li>\n<li><code>\u2014 valikulised argumendid. Allpool vaatame l\u00e4hemalt.<\/code> x-message-ttl<\/li>\n<\/ul>\n<p><\/p>\n<h5 id=\"arguments\"><em>\u2014 valikulised argumendid. Allpool vaatame l\u00e4hemalt.<\/em><\/h5>\n<p><\/p>\n<ul>\n<li><code>x-message-time-to-live<\/code>(<code>) \u2014 v\u00f5imaldab m\u00e4\u00e4rata s\u00f5numi eluea millisekundites. Kui j\u00e4rjekorra loomine toimub seatud argumendi v\u00e4\u00e4rtusega,<\/code>, siis selline j\u00e4rjekord <code>x-message-time-to-live<\/code>automaatselt k\u00f5rvaldada s\u00f5numid, mille kehtivusaeg on l\u00f5ppenud. <strong>Argumendi v\u00e4\u00e4rtuse seadmine<\/strong>m\u00e4\u00e4rab maksimaalse vanuse k\u00f5igile nende j\u00e4rjekorra s\u00f5numitele. Sellise j\u00e4rjekorra loomine <code>x-message-time-to-live<\/code> aitab v\u00e4ltida aegunud teabe saamist. <strong>Seda saab kasutada reaalajas s\u00fcsteemides. Kui j\u00e4rjekord, mille jaoks on seatud vahetiga \u00e4raviskatud s\u00f5numid, seadistatakse argumendi v\u00e4\u00e4rtus<\/strong>, siis \u00e4raviskatud s\u00f5numid selles j\u00e4rjekorras <code>x-message-time-to-live<\/code>algavad eluea saamist. <strong>x-expires<\/strong>.<\/li>\n<li><code>x-pr\u00e4\u00e4gib<\/code> \u2014 m\u00e4\u00e4rab millisekundide arvu, mille m\u00f6\u00f6dudes toimub j\u00e4rjekorra kustutamine. J\u00e4rjekord v\u00f5ib oma eluiga \u00e4ra kasutada ainult siis, kui tal ei ole mingeid tellijaid. Kui j\u00e4rjekorrale on \u00fchendatud tellijad, saab see automaatselt kustuda ainult siis, kui k\u00f5ik tellijad kutsuvad <code>Basic.Cancel<\/code> v\u00f5i lahti \u00fchendavad. J\u00e4rjekorra eluea l\u00f5ppemine v\u00f5ib toimuda ainult juhul, kui selle vastu ei ole esitatud n\u00f5udmisi <code>Basic.Get<\/code>. Vastasel juhul l\u00e4htestatakse praegune eluaja seadistus ja j\u00e4rjekord ei kustuta enam automaatselt. Samuti <strong>ei ole garantiid, kui kiiresti j\u00e4rjekord kustutatakse p\u00e4rast selle eluaja l\u00f5ppemist<\/strong>.<\/li>\n<li><code>x-max-length<\/code> \u2014 m\u00e4\u00e4rab maksimaalse s\u00f5numite arvu j\u00e4rjekorras. Kui s\u00f5numite arv j\u00e4rjekorras hakkab \u00fcletama maksimaalset arvu, hakkavad eemalduma vanimad<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 3. Uurime Queue-sid ja Bindings-e\" 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-length-bytes<\/code> \u2014 m\u00e4\u00e4rab maksimaalselt lubatud koormuse suuruse j\u00e4rjekorras. \u00dcksuse \u00fcletamisel (kui j\u00e4rjekord \u00fcletati j\u00e4rgmise s\u00f5numi avaldamise ajal) hakkavad vanimad s\u00f5numid eemalduma<\/li>\n<li><code>x-overflow<\/code> \u2014 see argument kasutatakse j\u00e4rjekorra \u00fcletamise k\u00e4itumise seadmiseks. Saadaval on kaks v\u00e4\u00e4rtust: <code>drop-head<\/code> (vaikimisi v\u00e4\u00e4rtus) ja <code>reject-publish<\/code>. Kui valida <code>drop-head<\/code>, siis eemaldatakse vanimad s\u00f5numid. Kui valida <code>reject-publish<\/code>, siis s\u00f5numite vastuv\u00f5tt peatatakse<\/li>\n<li><code>x-dead-letter-exchange<\/code> \u2014 m\u00e4\u00e4rab vahetuse, kuhu suunatakse tagasil\u00fckatud s\u00f5numid, mis ei ole uuesti j\u00e4rjekorda pandud<\/li>\n<li><code>x-dead-letter-routing-key<\/code> \u2014 m\u00e4\u00e4rab valikulise marsruudiv\u00f5tme tagasil\u00fckatud s\u00f5numite jaoks<\/li>\n<li><code>x-max-priority<\/code> \u2014 v\u00f5imaldab j\u00e4rjekorras prioriteetide j\u00e4rgi sortimist maksimaalse prioriteedi v\u00e4\u00e4rtusega 255 (RabbitMQ versioonides 3.5.0 ja k\u00f5rgem). Number n\u00e4itab maksimaalset prioriteeti, mida j\u00e4rjekord toetab. Kui argument puudub, ei toeta j\u00e4rjekord s\u00f5numite prioriteete<\/li>\n<li><code>x-queue-mode<\/code> \u2014 v\u00f5imaldab viia j\u00e4rjekorra <strong>laiskre\u017eiimi<\/strong>. Sellises re\u017eiimis hoitakse v\u00f5imalikult palju s\u00f5numeid kettal. M\u00e4lu kasutamine on minimaalne. Kui see ei ole seadistatud, salvestab j\u00e4rjekord s\u00f5numid m\u00e4llu, et edastada s\u00f5numeid maksimaalse kiirus<\/li>\n<li><code>x-queue-master-locator<\/code> \u2014 kui meil on klaster, saab m\u00e4\u00e4rata pea j\u00e4rjekorra<\/li>\n<li><code>x-ha-policy<\/code> \u2014 kasutatakse HA j\u00e4rjekordade loomisel ja m\u00e4\u00e4rab, kuidas s\u00f5num levib s\u00f5lmedes. Kui v\u00e4\u00e4rtus on seadistatud <code>all<\/code>, siis s\u00f5num s\u00e4ilitakse k\u00f5igis s\u00f5lmedes. Kui v\u00e4\u00e4rtus on seadistatud <code>s\u00f5lmed<\/code>, siis s\u00f5num s\u00e4ilitakse teatud klastris\u00f5lmedes<\/li>\n<li><code>x-ha-nodes<\/code> \u2014 m\u00e4\u00e4rab s\u00f5lmed, millele teatud j\u00e4rjekord kuulub <code>HA<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 3. Uurime Queue-sid ja Bindings-e\" src=\"\/wp-content\/uploads\/2020\/03\/a8f660b6c0a43626e4025cf7769a4425.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kui j\u00e4rjekorra loomine <strong>v\u00f5ib-olla<\/strong>, siis server saadab kliendile s\u00fcnkroonse <code>RPC<\/code> vastuse <code>Queue.DeclareOk<\/code>. Kui j\u00e4rjekorra loomine <strong>teostada<\/strong> (tekib t\u00f5rge p\u00e4ringus <code>Queue.Declare<\/code>), siis <strong>kanal suletakse<\/strong> serveri poolt k\u00e4suga <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><strong>Uuesti kutsumine<\/strong> <code>Queue.Declare<\/code> <strong>sarnaste parameetritega<\/strong> tagastab kasulikku informatsiooni selle j\u00e4rjekorra kohta. N\u00e4iteks, kokku s\u00f5numite arv, mis ootavad selle j\u00e4rjekorra peal, ja kokku registreeritud tarbijaid. <\/p>\n<p><\/p>\n<p>Kutsumine <code>Queue.Declare<\/code> kasutaja, kellele ei ole antud vajalikke \u00f5igusi <strong>sulgeb kanali<\/strong> k\u00e4skluse 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 <noindex><a rel=\"nofollow\" href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/HTTP\/Status\/403\">403<\/a><\/noindex> ja selle kirjelduse.<\/p>\n<p><\/p>\n<p>P\u00e4rast seda, kui j\u00e4rjekord on olnud vaikne &gt; 10 sekundit, <strong>kimbu seisu<\/strong>, kutsudes GC j\u00e4rjekorras, mis toob kaasa m\u00e4rkimisv\u00e4\u00e4rse m\u00e4lumahtude v\u00e4henemise, mis on vajalik selle j\u00e4rjekorra jaoks.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-queue-cherez-graficheskiy-interfeys\"><em>J\u00e4rjekorra loomine graafilise liidese kaudu<\/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>Queues<\/code> ja vajutame <code>Lisa uus j\u00e4rjekord<\/code>. T\u00e4idame omadused:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 3. Uurime Queue-sid ja Bindings-e\" src=\"\/wp-content\/uploads\/2020\/03\/ea77a406ad16f0871c7197e96a66818f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kui oleme sisestanud k\u00f5ik vajalikud andmed ja vajutame <code>Lisa j\u00e4rjekorrad<\/code>, siis j\u00e4rjekord ilmub \u00fcldnimekirja.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 3. Uurime Queue-sid ja Bindings-e\" src=\"\/wp-content\/uploads\/2020\/03\/8342e044a0d6c0a035a2c9f646035cad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nimele kl\u00f5psamine n\u00e4itab selle detailselt teavet. Siin saab seada sidumist vahetuse ja j\u00e4rjekorra vahel, vaadata nimekirja <code>tarbijatele<\/code>, avaldada\/saada s\u00f5numeid, kustutada j\u00e4rjekord ja vaadata statistikat.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding\"><em>Sidumise loomine<\/em><\/h4>\n<p><\/p>\n<p>Sidumise loomine toimub s\u00fcnkroonse kaudu <code>RPC<\/code> serveri p\u00e4ringu kaudu. P\u00e4ring tehakse meetodi <code>Queue.Bind<\/code>, mis kutsutakse esile koos parameetritega:<\/p>\n<p><\/p>\n<ul>\n<li>j\u00e4rjekorra nimi<\/li>\n<li>vahetuspunkti nimi<\/li>\n<li>muu parameeter<\/li>\n<\/ul>\n<p><\/p>\n<p>N\u00e4ide sidumise loomisest kasutatakse <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 j\u00e4rjekorra nimi<\/li>\n<li><code>vahetus<\/code> \u2014 vahetuspunkti nimi<\/li>\n<li><code>routingKey<\/code> \u2014 marsruudi v\u00f5ti<\/li>\n<li><code>\u2014 valikulised argumendid. Allpool vaatame l\u00e4hemalt.<\/code> \u2014 valikulised argumendid<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 3. Uurime Queue-sid ja Bindings-e\" src=\"\/wp-content\/uploads\/2020\/03\/9123186c94a822309b679f26c2e511ea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kui sidumise loomine <strong>v\u00f5ib-olla<\/strong>, siis server saadab kliendile s\u00fcnkroonse <code>RPC<\/code> vastuse <code>Queue.BindOk<\/code>.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding-cherez-graficheskiy-interfeys\"><em>Sidumise loomine graafilise liidese kaudu<\/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>Queues<\/code> ja vajutame j\u00e4rjekorrale <code>my_queue<\/code>. T\u00e4idame v\u00e4ljad jaotises <code>sidemed<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 3. Uurime Queue-sid ja Bindings-e\" src=\"\/wp-content\/uploads\/2020\/03\/7db6b42a4f29a1860aabe54ade0b6833.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kui oleme sisestanud k\u00f5ik vajalikud andmed ja vajutame <code>Siduma<\/code>, seondus kuvatakse \u00fcldises loetelus:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Osa 3. Uurime Queue-sid ja Bindings-e\" src=\"\/wp-content\/uploads\/2020\/03\/499eda8e8cb061e6feb75c471eb64b92.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"code\">Kood<\/h3>\n<p><\/p>\n<p>K\u00e4esolevas jaotises kirjeldame j\u00e4rjekorda ja sidumise koodi C#-s, justkui peaksime arendama teeki. See v\u00f5ib osutuda kasulikuks arusaamiseks.<\/p>\n<p><\/p>\n<pre><code class=\"cs\">public interface IQueue\n    {        \n        string Name { get; }\n\n        \/\/ <summary>\n        \/\/     Kui on seatud true, siis queue on p\u00fcsiv. \n        \/\/     See salvestatakse kettale ja suudab \n        \/\/     ellu j\u00e4\u00e4da serveri\/brokeri taask\u00e4ivitamisel. \n        \/\/     Kui v\u00e4\u00e4rtus on false, siis queue on ajutine ja kustutatakse, \n        \/\/     kui server\/broker taask\u00e4ivitub\n        \/\/ <\/summary>\n        bool IsDurable { get; }\n\n        \/\/ <summary>\n        \/\/     Kui v\u00e4\u00e4rtus on true, siis \n        \/\/     see j\u00e4rjekord lubab \u00fchenduda \n        \/\/     ainult \u00fchel tarbijal\n        \/\/ <\/summary>\n        bool IsExclusive { get; }\n\n        \/\/ <summary>\n        \/\/     Automaatne kustutamine. \n        \/\/     J\u00e4rjekord kustutatakse, kui k\u00f5ik kliendid lahti \u00fchenduvad.\n        \/\/ <\/summary>\n        bool IsAutoDelete { get; }\n\n        \/\/ <summary>\n        \/\/     Valikulised argumendid\n        \/\/ <\/summary>\n        IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">avalik klass 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} ei tohi olla t\u00fchi\");\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\">avalik statiline klass QueueMode\n    {       \n        public const string Default = \"default\";\n        \/\/\/\/ <summary>\n        \/\/\/\/     Laisk re\u017eiim. Laisk re\u017eiim sunnib salvestama \n        \/\/\/\/     nii palju s\u00f5numeid kettale kui v\u00f5imalik, et v\u00e4hendada \n        \/\/\/\/     m\u00e4lu kasutust\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        \/\/     Vahetus, millega sidumine toimub\n        \/\/ <\/summary>\n        IExchange Exchange { get; }\n\n        \/\/ <summary>\n        \/\/     Marsruutimisv\u00f5ti\n        \/\/ <\/summary>\n        string RoutingKey { get; }\n\n        \/\/ <summary>\n        \/\/     Valikulised argumendid\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>Allikas: <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.1.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\/et\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings\" \/>\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 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\/et\/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. Osa 3. Uurime Queues ja Bindings | ProHoster","description":"Queue (j\u00e4rjekord) \u2014 andmestruktuur, mis asub diskil v\u00f5i m\u00e4lus, mis hoiab linke s\u00f5numitele ja toimetab nende koopiaid consumers (tarbijatele).","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","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 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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/73065","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=73065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/73065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/73066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=73065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=73065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=73065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}