{"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\/sv\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","title":{"rendered":"RabbitMQ. Del 3. Vi g\u00e5r igenom Queues och Bindings","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>K\u00f6<\/code> (k\u00f6) \u2014 en datstruktur p\u00e5 disken eller i RAM som lagrar referenser till meddelanden och returnerar deras kopior <code>consumers<\/code> (till konsumenterna). <code>K\u00f6<\/code> representerar <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">Erlang-process<\/a><\/noindex> med tillst\u00e5nd (d\u00e4r meddelandena sj\u00e4lva kan cachelagras). 1 tusen k\u00f6er kan ta upp omkring 80 Mb.<\/p>\n<p><\/p>\n<p><code>Binding<\/code> (bindning) \u2014 en regel som informerar meddelandebrokern om vilken k\u00f6 meddelanden ska g\u00e5 till.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"oglavlenie\">Inneh\u00e5llsf\u00f6rteckning<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/488654\/\">RabbitMQ. Del 1. Introduktion. Erlang, AMQP och RPC<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">RabbitMQ. Del 2. Vi g\u00e5r igenom Exchanges<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490960\/\">RabbitMQ. Del 3. Vi g\u00e5r igenom Queues och Bindings<\/a><\/noindex><\/li>\n<li>RabbitMQ. Del 4. L\u00e5t oss f\u00f6rst\u00e5 vad meddelanden och ramar \u00e4r<\/li>\n<li>RabbitMQ. Del 5. Prestanda f\u00f6r publicering och konsumtion av meddelanden<\/li>\n<li>RabbitMQ. Del 6. \u00d6versikt av modulerna Federation och Shovel<\/li>\n<li>RabbitMQ. Del 7. Detaljer om Connection och Channel<\/li>\n<li>RabbitMQ. Del 8. RabbitMQ i .NET<\/li>\n<li>RabbitMQ. Del 9. \u00d6vervakning<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"vremennye-ocheredi\"><em>Tillf\u00e4lliga k\u00f6er<\/em><\/h4>\n<p><\/p>\n<p>Om k\u00f6creationen sker med en inst\u00e4lld parameter <code>autoDelete<\/code>, s\u00e5 f\u00e5r den k\u00f6en m\u00f6jlighet <strong>att automatiskt ta bort sig sj\u00e4lv<\/strong>. Dessa k\u00f6er skapas vanligtvis vid anslutningen av den f\u00f6rsta klienten och tas bort n\u00e4r alla klienter har kopplats bort. <\/p>\n<p><\/p>\n<p>Om k\u00f6creationen sker med en inst\u00e4lld parameter <code>exklusiv<\/code>, s\u00e5 till\u00e5ter den k\u00f6 <strong>att endast en konsument kan ansluta<\/strong> och tas bort om kanalen st\u00e4ngs. Tills kanalen st\u00e4ngs kan klienten koppla bort\/ansluta, men bara inom samma anslutning. Om parametern <code>exklusiv<\/code> \u00e4r inst\u00e4lld, s\u00e5 har parametern <code>autoDelete<\/code> ingen effekt.<\/p>\n<p><\/p>\n<p>Egenskaper:<\/p>\n<p><\/p>\n<ul>\n<li>vid kortvarigt avbrott i kommunikationen kommer vi att f\u00f6rlora meddelanden som \u00e4nnu inte har n\u00e5tt konsumenten<\/li>\n<li>kan f\u00e5nga fenomenet <code>bindingskrusning<\/code>. Fenomenet uppst\u00e5r n\u00e4r antalet operationer f\u00f6r att skapa\/ta bort k\u00f6er och bindningar n\u00e5r mycket h\u00f6ga niv\u00e5er. I klusterl\u00e4ge kommer denna str\u00f6m av operationer att spridas \u00f6ver alla noder och skapa en stor belastning. Denna process kan optimeras genom att kontrollera antalet prenumerationer<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"postoyannye-ocheredi\"><em>Permanenta k\u00f6er<\/em><\/h4>\n<p><\/p>\n<p>Om k\u00f6creationen sker med en inst\u00e4lld parameter <code>h\u00e5llbar<\/code>, s\u00e5 till\u00e5ter den k\u00f6 <strong>bevarar sitt tillst\u00e5nd<\/strong> och \u00e5terst\u00e4lls efter omstart av servern\/brokern. Denna k\u00f6 kommer att existera tills kommandot <code>Queue.Delete<\/code>. <\/p>\n<p><\/p>\n<h4 id=\"highly-available-ocheredi\"><em>H\u00f6gt tillg\u00e4ngliga k\u00f6er<\/em><\/h4>\n<p><\/p>\n<p>HA-k\u00f6er kr\u00e4ver en klustermilj\u00f6 f\u00f6r RabbitMQ. I klusterl\u00e4ge kommer all information om v\u00e4xlare, k\u00f6er, bindningar och konsumenter att kopieras till alla noder.<\/p>\n<p><\/p>\n<p>N\u00e4r ett meddelande publiceras i en HA-k\u00f6, lagras det p\u00e5 varje nod som tillh\u00f6r HA-k\u00f6n. N\u00e4r meddelandet konsumeras p\u00e5 n\u00e5gon av noderna kommer alla kopior av meddelandet att tas bort fr\u00e5n andra noder. <\/p>\n<p><\/p>\n<p>HA-k\u00f6er kan spridas \u00f6ver alla noder i ett kluster eller bara p\u00e5 individuella. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 3. Vi g\u00e5r igenom Queues och Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/46d560ab33e686ddf9adb0b18b4bb0b0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Egenskaper:<\/p>\n<p><\/p>\n<ul>\n<li>Anv\u00e4ndning av HA-k\u00f6er leder till straff i prestanda. N\u00e4r ett meddelande placeras i en HA-k\u00f6 eller n\u00e4r ett meddelande konsumeras fr\u00e5n en HA-k\u00f6, m\u00e5ste RabbitMQ samordna mellan alla noder (2-3 noder \u00e4r vanligtvis tillr\u00e4ckliga).<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"sozdanie-ocheredi\"><em>Skapa k\u00f6<\/em><\/h4>\n<p><\/p>\n<p>K\u00f6ning skapande sker med hj\u00e4lp av synkron. <code>RPC<\/code> beg\u00e4ran till servern. Beg\u00e4ran g\u00f6rs genom metoden <code>Queue.Declare<\/code>, som anropas med f\u00f6ljande parametrar:<\/p>\n<p><\/p>\n<ul>\n<li>K\u00f6 namn<\/li>\n<li>andra parametrar<\/li>\n<\/ul>\n<p><\/p>\n<p>Exempel p\u00e5 k\u00f6 skapande med hj\u00e4lp av <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 namnet p\u00e5 k\u00f6 som vi vill skapa. Namnet m\u00e5ste vara unikt och f\u00e5r inte koincidera med systemnamnet f\u00f6r k\u00f6.<\/li>\n<li><code>h\u00e5llbar<\/code> \u2014 om true, kommer k\u00f6n att <strong>spara sitt tillst\u00e5nd<\/strong> och \u00e5terst\u00e4llas efter en omstart av servern\/m\u00e4klaren.<\/li>\n<li><code>exklusiv<\/code> \u2014 om true, kommer k\u00f6n att till\u00e5ta endast en konsument att ansluta.<\/li>\n<li><code>autoDelete<\/code> \u2014 om true, ger k\u00f6n m\u00f6jlighet <strong>att automatiskt ta bort sig sj\u00e4lv<\/strong><\/li>\n<li><code>argument<\/code> \u2014 valfria argument. Nedan g\u00e5r vi in mer detaljerat.<\/li>\n<\/ul>\n<p><\/p>\n<h5 id=\"arguments\"><em>argument<\/em><\/h5>\n<p><\/p>\n<ul>\n<li><code>x-message-ttl<\/code>(<code>x-message-time-to-live<\/code>) \u2014 g\u00f6r det m\u00f6jligt att st\u00e4lla in meddelandets livsl\u00e4ngd i millisekunder. Om k\u00f6 skapas med ett angivet v\u00e4rde f\u00f6r argumentet <code>x-message-ttl<\/code>, s\u00e5 kommer en s\u00e5dan k\u00f6 att <strong>automatiskt exkludera meddelanden vars livsl\u00e4ngd har g\u00e5tt ut.<\/strong>Att st\u00e4lla in v\u00e4rdet f\u00f6r argumentet <code>x-message-ttl<\/code> anger max\u00e5ldern f\u00f6r alla meddelanden i denna k\u00f6. Att skapa en s\u00e5dan k\u00f6 <strong>kan f\u00f6rhindra att f\u00f6r\u00e5ldrad information tas emot.<\/strong>Detta kan anv\u00e4ndas i realtidssystem. Om en k\u00f6 har ett utbyte f\u00f6r avvisade meddelanden och f\u00e5r v\u00e4rdet f\u00f6r argumentet <code>x-message-ttl<\/code>, kommer avvisade meddelanden i denna k\u00f6 <strong>att b\u00f6rja ha en livsl\u00e4ngd.<\/strong>.<\/li>\n<li><code>x-expires<\/code> \u2014 anger ett v\u00e4rde i millisekunder efter vilket k\u00f6n tas bort. En k\u00f6 kan utl\u00f6pa sitt liv endast om den inte har n\u00e5gra prenumeranter. Om det finns prenumeranter ansluten till k\u00f6n, kan den automatiskt tas bort endast n\u00e4r alla prenumeranter anropar <code>Basic.Cancel<\/code> eller kopplar bort sig. En k\u00f6 livsl\u00e4ngd kan endast avslutas om den inte har beg\u00e4rts. <code>Basic.Get<\/code>. Annars nollst\u00e4lls nuvarande livsl\u00e4ngdsinst\u00e4llning, och k\u00f6n kommer inte l\u00e4ngre att tas bort automatiskt. \u00c4ven <strong>finns det inga garantier f\u00f6r hur snabbt k\u00f6n tas bort efter att dess livsl\u00e4ngd har l\u00f6pt ut.<\/strong>.<\/li>\n<li><code>x-max-length<\/code> \u2014 anger maxantal meddelanden i k\u00f6n. Om antalet meddelanden i k\u00f6n b\u00f6rjar \u00f6verskrida det maximala antalet, kommer de \u00e4ldsta b\u00f6rja rensas bort.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 3. Vi g\u00e5r igenom Queues och 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-l\u00e4ngd-bytes<\/code> \u2014 anger den maximalt till\u00e5tna sammanlagda storleken av nyttolasten i meddelandena i k\u00f6n. Om det angivna v\u00e4rdet \u00f6verskrids (en \u00f6verbelastning i k\u00f6n intr\u00e4ffar vid en ny publicering av ett meddelande) kommer de \u00e4ldsta meddelandena att b\u00f6rja rensas bort.<\/li>\n<li><code>x-overflow<\/code> \u2014 detta argument anv\u00e4nds f\u00f6r att st\u00e4lla in beteendet vid \u00f6verfl\u00f6d i k\u00f6n. Tv\u00e5 v\u00e4rden \u00e4r tillg\u00e4ngliga: <code>drop-head<\/code> (standardv\u00e4rdet) och <code>reject-publish<\/code>. Om du v\u00e4ljer <code>drop-head<\/code>, kommer de \u00e4ldsta meddelandena att rensas bort. Om du v\u00e4ljer <code>reject-publish<\/code>, kommer mottagandet av meddelanden att stoppas.<\/li>\n<li><code>x-dead-letter-exchange<\/code> \u2014 anger en exchange dit avvisade meddelanden skickas, som inte har st\u00e4llts tillbaka i k\u00f6n.<\/li>\n<li><code>x-dead-letter-routing-key<\/code> \u2014 anger en valfri routningsnyckel f\u00f6r avvisade meddelanden.<\/li>\n<li><code>x-max-priority<\/code> \u2014 m\u00f6jligg\u00f6r sortering efter prioritet i k\u00f6n med en maximal prioritet p\u00e5 255 (RabbitMQ versioner 3.5.0 och senare). Siffran anger den maximala prioriteten som k\u00f6n kommer att st\u00f6dja. Om argumentet inte anges kommer k\u00f6n inte att st\u00f6dja meddelandets prioritet.<\/li>\n<li><code>x-queue-mode<\/code> \u2014 till\u00e5ter att k\u00f6en \u00f6verf\u00f6rs till <strong>l\u00e5gprioritetsl\u00e4get<\/strong>. I detta l\u00e4ge kommer s\u00e5 m\u00e5nga meddelanden som m\u00f6jligt att sparas p\u00e5 disken. Anv\u00e4ndningen av RAM-minne kommer att vara minimal. Om det inte anges kommer k\u00f6n att spara meddelanden i minnet f\u00f6r att leverera meddelanden s\u00e5 snabbt som m\u00f6jligt.<\/li>\n<li><code>x-queue-master-locator<\/code> \u2014 om vi har en kluster kan vi ange masterk\u00f6n.<\/li>\n<li><code>x-ha-policy<\/code> \u2014 anv\u00e4nds vid skapandet av HA-k\u00f6er och definierar hur meddelanden kommer att spridas \u00f6ver noder. Om v\u00e4rdet anges <code>all<\/code>, kommer meddelandet att sparas p\u00e5 alla noder. Om v\u00e4rdet anges <code>nodes<\/code>, kommer meddelandet att sparas p\u00e5 specifika noder i klustret.<\/li>\n<li><code>x-ha-nodes<\/code> \u2014 anger noder som en viss k\u00f6 kommer att tillh\u00f6ra. <code>HA<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 3. Vi g\u00e5r igenom Queues och Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/a8f660b6c0a43626e4025cf7769a4425.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om skapandet av k\u00f6n <strong>\u00e4r m\u00f6jligt<\/strong>, s\u00e5 kommer servern att skicka ett synkront <code>RPC<\/code> svar <code>Queue.DeclareOk<\/code>. Om skapandet av k\u00f6n <strong>\u00e4r om\u00f6jligt<\/strong> (det har skett ett avslag p\u00e5 beg\u00e4ran <code>Queue.Declare<\/code>), s\u00e5 <strong>kanalen st\u00e4ngs<\/strong> av servern med kommandot <code>Channel.Close<\/code> och klienten f\u00e5r ett undantag <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>, som kommer att inneh\u00e5lla felkoden och dess beskrivning. <\/p>\n<p><\/p>\n<p><strong>Ett \u00e5teranrop<\/strong> <code>Queue.Declare<\/code> <strong>med samma parametrar<\/strong> kommer att returnera anv\u00e4ndbar information om denna k\u00f6. Till exempel det totala antalet meddelanden som v\u00e4ntar i denna k\u00f6 och det totala antalet prenumeranter p\u00e5 den. <\/p>\n<p><\/p>\n<p>Anrop <code>Queue.Declare<\/code> med anv\u00e4ndaruppgifter som inte har de n\u00f6dv\u00e4ndiga r\u00e4ttigheterna tilldelade <strong>st\u00e4nger kanalen<\/strong> med kommandot <code>Channel.Close<\/code> och klienten f\u00e5r ett undantag <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>, som kommer att inneh\u00e5lla felkoden <noindex><a rel=\"nofollow\" href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/HTTP\/Status\/403\">403<\/a><\/noindex> och dess beskrivning.<\/p>\n<p><\/p>\n<p>N\u00e4r k\u00f6n har varit inaktiv i mer \u00e4n 10 sekunder, <strong>g\u00e5r den in i vilol\u00e4ge<\/strong>, vilket anropar GC i k\u00f6n och d\u00e4rmed avsev\u00e4rt minskar minnesbehovet f\u00f6r denna k\u00f6.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-queue-cherez-graficheskiy-interfeys\"><em>Skapa en k\u00f6 via anv\u00e4ndargr\u00e4nssnittet<\/em><\/h4>\n<p><\/p>\n<p>G\u00e5 till administrationspanelen <code>RabbitMQ<\/code> under anv\u00e4ndaren <code>guest<\/code> (anv\u00e4ndarnamn: <code>guest<\/code> och l\u00f6senord: <code>guest<\/code>). Observera att anv\u00e4ndaren <code>guest<\/code> bara kan ansluta fr\u00e5n localhost. L\u00e5t oss nu g\u00e5 till fliken <code>K\u00f6er<\/code> och klicka p\u00e5 <code>L\u00e4gg till en ny k\u00f6<\/code>. Fyll i egenskaperna:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 3. Vi g\u00e5r igenom Queues och Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/ea77a406ad16f0871c7197e96a66818f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u00e5 snart vi har angett alla n\u00f6dv\u00e4ndiga uppgifter och klickar p\u00e5 <code>L\u00e4gg till k\u00f6er<\/code>, kommer k\u00f6n att visas i den \u00f6vergripande listan.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 3. Vi g\u00e5r igenom Queues och Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/8342e044a0d6c0a035a2c9f646035cad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Klicka p\u00e5 k\u00f6ens namn f\u00f6r att visa detaljerad information. H\u00e4r kan du konfigurera bindningen mellan utbytet och k\u00f6n, se listan <code>consumers<\/code>, publicera\/mottaga meddelanden, ta bort k\u00f6n och visa statistik.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding\"><em>Skapa Bindning<\/em><\/h4>\n<p><\/p>\n<p>Att skapa en bindning g\u00f6rs genom en synkron <code>RPC<\/code> beg\u00e4ran till servern. Beg\u00e4ran g\u00f6rs genom metoden <code>Queue.Bind<\/code>, som anropas med f\u00f6ljande parametrar:<\/p>\n<p><\/p>\n<ul>\n<li>K\u00f6 namn<\/li>\n<li>namnet p\u00e5 utbytet<\/li>\n<li>andra parametrar<\/li>\n<\/ul>\n<p><\/p>\n<p>Exempel p\u00e5 skapande av bindning via <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 namnet p\u00e5 k\u00f6n<\/li>\n<li><code>exchange<\/code> \u2014 namnet p\u00e5 utbytet<\/li>\n<li><code>routingKey<\/code> \u2014 rutt nyckel<\/li>\n<li><code>argument<\/code> \u2014 valfria argument<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 3. Vi g\u00e5r igenom Queues och Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/9123186c94a822309b679f26c2e511ea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om skapandet av bindning <strong>\u00e4r m\u00f6jligt<\/strong>, s\u00e5 kommer servern att skicka ett synkront <code>RPC<\/code> svar <code>Queue.BindOk<\/code>.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding-cherez-graficheskiy-interfeys\"><em>Skapa Bindning via anv\u00e4ndargr\u00e4nssnittet<\/em><\/h4>\n<p><\/p>\n<p>G\u00e5 till administrationspanelen <code>RabbitMQ<\/code> under anv\u00e4ndaren <code>guest<\/code> (anv\u00e4ndarnamn: <code>guest<\/code> och l\u00f6senord: <code>guest<\/code>). Observera att anv\u00e4ndaren <code>guest<\/code> bara kan ansluta fr\u00e5n localhost. L\u00e5t oss nu g\u00e5 till fliken <code>K\u00f6er<\/code> och klicka p\u00e5 k\u00f6n <code>my_queue<\/code>. Fyll i f\u00e4lten i avsnittet <code>bindings<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 3. Vi g\u00e5r igenom Queues och Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/7db6b42a4f29a1860aabe54ade0b6833.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u00e5 snart vi har angett alla n\u00f6dv\u00e4ndiga uppgifter och klickar p\u00e5 <code>Bind<\/code>, kommer bindningen att visas i den \u00f6vergripande listan:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 3. Vi g\u00e5r igenom Queues och Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/499eda8e8cb061e6feb75c471eb64b92.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"code\">Code<\/h3>\n<p><\/p>\n<p>I detta avsnitt beskriver vi k\u00f6n och bindningen med kod i C#, som om vi skulle utveckla ett bibliotek. Det kan vara anv\u00e4ndbart f\u00f6r f\u00f6rst\u00e5elsen.<\/p>\n<p><\/p>\n<pre><code class=\"cs\">public interface IQueue\n    {        \n        string Name { get; }\n\n        \/\/ <summary>\n        \/\/     Om det s\u00e4tts till true, kommer k\u00f6n att vara permanent.\n        \/\/     Den kommer att lagras p\u00e5 disken och kan\n        \/\/     \u00f6verleva omstart av servern\/brokern.\n        \/\/     Om v\u00e4rdet \u00e4r false, \u00e4r k\u00f6n tempor\u00e4r och kommer att tas bort,\n        \/\/     n\u00e4r servern\/brokern startas om\n        \/\/ <\/summary>\n        bool IsDurable { get; }\n\n        \/\/ <summary>\n        \/\/     Om v\u00e4rdet \u00e4r true, kommer\n        \/\/     denna k\u00f6 bara att till\u00e5ta anslutning\n        \/\/     av en konsument\n        \/\/ <\/summary>\n        bool IsExclusive { get; }\n\n        \/\/ <summary>\n        \/\/     Automatisk borttagning.\n        \/\/     K\u00f6n kommer att tas bort n\u00e4r alla klienter kopplar ifr\u00e5n.\n        \/\/ <\/summary>\n        bool IsAutoDelete { get; }\n\n        \/\/ <summary>\n        \/\/     Valfria argument\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} f\u00e5r inte vara null\");\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        \/\/ <summary>\n        \/\/     L\u00e4ttviktsl\u00e4ge. L\u00e4ttviktsl\u00e4ge kommer att spara \n        \/\/     s\u00e5 m\u00e5nga meddelanden som m\u00f6jligt p\u00e5 disken f\u00f6r att minska \n        \/\/     anv\u00e4ndningen av RAM-minne\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        \/\/     Koppling som kommer att binda en f\u00f6rbindelse\n        \/\/ <\/summary>\n        IExchange Exchange { get; }\n\n        \/\/ <summary>\n        \/\/     Routingnyckel\n        \/\/ <\/summary>\n        string RoutingKey { get; }\n\n        \/\/ <summary>\n        \/\/     Valfria argument\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>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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. Del 3. Utforska Queues och Bindings | ProHoster","description":"K\u00f6 Queue (k\u00f6) \u2014 en datakonstruktion p\u00e5 disken eller i det interna minnet som lagrar referenser till meddelanden och skickar kopior till konsumenterna.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/73065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=73065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/73065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/73066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=73065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=73065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=73065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}