{"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\/nl\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","title":{"rendered":"RabbitMQ. Deel 3. Laten we kijken naar Queues en Bindings","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>Wachtrij<\/code> (wachtrij) - een datastructuur op schijf of in het geheugen die verwijzingen naar berichten opslaat en deze kopie\u00ebn levert <code>consumers<\/code> (consumenten). <code>Wachtrij<\/code> is <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">Erlang-proces<\/a><\/noindex> met een status (waar berichten zelf kunnen worden cached). 1000 wachtrijen kunnen ongeveer 80Mb in beslag nemen.<\/p>\n<p><\/p>\n<p><code>Binding<\/code> (binding) - een regel die de broker vertelt naar welke wachtrijen berichten moeten worden gestuurd.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"oglavlenie\">Inhoudsopgave<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/488654\/\">RabbitMQ. Deel 1. Introductie. Erlang, AMQP en RPC<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">RabbitMQ. Deel 2. Laten we Exchanges verkennen<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490960\/\">RabbitMQ. Deel 3. Laten we kijken naar Queues en Bindings<\/a><\/noindex><\/li>\n<li>RabbitMQ. Deel 4. Laten we kijken wat berichten en frames zijn<\/li>\n<li>RabbitMQ. Deel 5. Prestatie van het publiceren en consumeren van berichten<\/li>\n<li>RabbitMQ. Deel 6. Overzicht van de modules Federation en Shovel<\/li>\n<li>RabbitMQ. Deel 7. Gedetailleerd over Connection en Channel<\/li>\n<li>RabbitMQ. Deel 8. RabbitMQ in .NET<\/li>\n<li>RabbitMQ. Deel 9. Monitoring<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"vremennye-ocheredi\"><em>Tijdelijke wachtrijen<\/em><\/h4>\n<p><\/p>\n<p>Als het aanmaken van een wachtrij gebeurt met een ingestelde parameter <code>autoDelete<\/code>, dan krijgt die wachtrij het vermogen <strong>zichzelf automatisch te verwijderen<\/strong>. Dergelijke wachtrijen worden meestal aangemaakt op het moment dat de eerste client verbinding maakt en worden verwijderd op het moment dat alle clients zijn losgekoppeld. <\/p>\n<p><\/p>\n<p>Als het aanmaken van een wachtrij gebeurt met een ingestelde parameter <code>exclusief<\/code>, dan staat die wachtrij <strong>slechts \u00e9\u00e9n consument toe om verbinding te maken<\/strong> en wordt verwijderd als de kanaal sluit. Tot dat moment kan de client loskoppelen\/aansluiten, maar alleen binnen dezelfde verbinding. Als de parameter <code>exclusief<\/code> is ingesteld, dan heeft de parameter <code>autoDelete<\/code> geen effect.<\/p>\n<p><\/p>\n<p>Kenmerken:<\/p>\n<p><\/p>\n<ul>\n<li>bij een tijdelijke onderbreking van de verbinding zullen we berichten verliezen die nog niet bij de consument zijn aangekomen<\/li>\n<li>kan men het fenomeen <code>binding churn<\/code>vastleggen. Het fenomeen ontstaat wanneer het aantal aanmaak\/verwijderoperaties van wachtrijen en bindingen zeer hoge waarden bereikt. In cluster-modus zal deze stroom van operaties zich verspreiden over alle knooppunten en een hoge belasting cre\u00ebren. Dit proces kan worden geoptimaliseerd door het aantal abonnementen te controleren.<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"postoyannye-ocheredi\"><em>Permanente wachtrijen<\/em><\/h4>\n<p><\/p>\n<p>Als het aanmaken van een wachtrij gebeurt met een ingestelde parameter <code>duurable<\/code>, dan staat die wachtrij <strong>behouden hun status<\/strong> en herstellen zich na een herstart van de server\/broker. Deze wachtrij zal bestaan totdat het commando <code>Queue.Delete<\/code>. <\/p>\n<p><\/p>\n<h4 id=\"highly-available-ocheredi\"><em>Highly Available wachtrijen<\/em><\/h4>\n<p><\/p>\n<p>HA-wachtrijen vereisen een clustered RabbitMQ-omgeving. In cluster-modus zal alle informatie over brokers, wachtrijen, bindingen en consumenten worden gekopieerd naar alle knooppunten.<\/p>\n<p><\/p>\n<p>Wanneer een bericht in een HA-wachtrij wordt gepubliceerd, wordt het op elk knooppunt opgeslagen dat bij de HA-wachtrij hoort. Nadat het bericht op een van de knooppunten is geconsumeerd, worden alle kopie\u00ebn van dat bericht op andere knooppunten verwijderd. <\/p>\n<p><\/p>\n<p>HA-wachtrijen kunnen zich over alle knooppunten in een cluster verspreiden of alleen over specifieke. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Deel 3. Laten we kijken naar Queues en Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/46d560ab33e686ddf9adb0b18b4bb0b0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kenmerken:<\/p>\n<p><\/p>\n<ul>\n<li>Het gebruik van HA-queues leidt tot prestatienadelen. Bij het plaatsen van een bericht in een HA-queue of het consumeren van een bericht uit een HA-queue, moet RabbitMQ co\u00f6rdinatie uitvoeren tussen alle knooppunten (2-3 knooppunten zijn meestal voldoende)<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"sozdanie-ocheredi\"><em>Een queue cre\u00ebren<\/em><\/h4>\n<p><\/p>\n<p>Het cre\u00ebren van een queue gebeurt synchronisch <code>RPC<\/code> verzoek aan de server. Het verzoek wordt gedaan met behulp van de methode <code>Queue.Declare<\/code>, aangeroepen met de parameters:<\/p>\n<p><\/p>\n<ul>\n<li>de naam van de queue<\/li>\n<li>andere parameters<\/li>\n<\/ul>\n<p><\/p>\n<p>Voorbeeld van het cre\u00ebren van een queue met behulp van <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 de naam van de queue die we willen cre\u00ebren. De naam moet uniek zijn en mag niet overeenkomen met een systeemnaam van een queue<\/li>\n<li><code>duurable<\/code> \u2014 als true, zal de queue <strong>zijn status behouden<\/strong> en hersteld worden na een herstart van de server\/broker<\/li>\n<li><code>exclusief<\/code> \u2014 als true, zal de queue toestaan dat alleen \u00e9\u00e9n consument verbinding maakt<\/li>\n<li><code>autoDelete<\/code> \u2014 als true, krijgt de queue de mogelijkheid <strong>zichzelf automatisch te verwijderen<\/strong><\/li>\n<li><code>arguments<\/code> \u2014 optionele argumenten. Hieronder bespreken we dit verder.<\/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 stelt de levensduur van een bericht in milliseconden in. Als de queue wordt gecre\u00eberd met een ingesteld argumentwaarde <code>x-message-ttl<\/code>, dan zal die queue <strong>automatisch berichten uitsluiten waarvan de termijn is verstreken<\/strong>. Het instellen van de argumentwaarde <code>x-message-ttl<\/code> stelt de maximale leeftijd in voor alle berichten in deze queue. Het cre\u00ebren van zo'n queue <strong>helpt om verouderde informatie te voorkomen<\/strong>. Dit kan worden gebruikt in realtime-systemen. Als er voor een queue waaraan een wisselaar voor afgewezen berichten is toegewezen, een argumentwaarde wordt ingesteld <code>x-message-ttl<\/code>, dan zullen de afgewezen berichten in deze queue <strong>een levensduur hebben<\/strong>.<\/li>\n<li><code>x-expires<\/code> \u2014 stelt de waarde in milliseconden in waarbij de queue wordt verwijderd. Een queue kan zijn levensduur alleen verbruiken als deze geen abonnees heeft. Als er abonnees aan de queue zijn verbonden, kan deze automatisch worden verwijderd zodra alle abonnees <code>Basic.Cancel<\/code> of losgekoppeld zijn. De levensduur van de queue kan alleen eindigen als er geen verzoek naar is geweest <code>Basic.Get<\/code>. Anders wordt de huidige levensduur instelling gereset en zal de queue niet langer automatisch worden verwijderd. Ook <strong>is er geen garantie over hoe snel de verwijdering van de queue plaatsvindt na het verstrijken van de levensduur<\/strong>.<\/li>\n<li><code>x-max-length<\/code> \u2014 stelt het maximum aantal berichten in de wachtrij in. Als het aantal berichten in de wachtrij het maximum overschrijdt, zullen de oudste berichten worden verwijderd.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Deel 3. Laten we kijken naar Queues en 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 stelt de maximaal toegestane totale grootte van de nuttige lading van berichten in de wachtrij in. Bij overschrijding van de ingestelde waarde (ontstond een overflow in de wachtrij bij een volgende publicatie van een bericht) zullen de oudste berichten worden verwijderd.<\/li>\n<li><code>x-overflow<\/code> \u2014 dit argument wordt gebruikt om het gedrag bij een overflow van de wachtrij in te stellen. Er zijn twee waarden beschikbaar: <code>drop-head<\/code> (standaard waarde) en <code>reject-publish<\/code>. Als u kiest voor <code>drop-head<\/code>, worden de oudste berichten verwijderd. Als u kiest voor <code>reject-publish<\/code>, wordt de acceptatie van berichten tijdelijk stopgezet.<\/li>\n<li><code>x-dead-letter-exchange<\/code> \u2014 stelt de exchange in waar afgewezen berichten naar worden gestuurd, die niet opnieuw in de wachtrij worden geplaatst.<\/li>\n<li><code>x-dead-letter-routing-key<\/code> \u2014 stelt een optionele routeringssleutel in voor afgewezen berichten.<\/li>\n<li><code>x-max-priority<\/code> \u2014 staat sortering op prioriteit toe in de wachtrij met een maximale prioriteit van 255 (RabbitMQ versies 3.5.0 en hoger). Het getal geeft de maximale prioriteit aan die de wachtrij zal ondersteunen. Als het argument niet is ingesteld, ondersteunt de wachtrij geen prioriteitsberichten.<\/li>\n<li><code>x-queue-mode<\/code> \u2014 maakt het mogelijk om de wachtrij in te stellen op <strong>luie modus<\/strong>. In deze modus zullen zoveel mogelijk berichten op de schijf worden opgeslagen. Het gebruik van het RAM zal minimaal zijn. Als het niet is ingesteld, zal de wachtrij berichten in het geheugen opslaan om berichten zo snel mogelijk te leveren.<\/li>\n<li><code>x-queue-master-locator<\/code> \u2014 als we een cluster hebben, kan de master wachtrij worden ingesteld.<\/li>\n<li><code>x-ha-policy<\/code> \u2014 wordt gebruikt bij het maken van HA wachtrijen en bepaalt hoe een bericht over de knooppunten wordt verspreid. Als de waarde is ingesteld op <code>all<\/code>, wordt het bericht op alle knooppunten opgeslagen. Als de waarde is ingesteld op <code>nodes<\/code>, wordt het bericht op bepaalde knooppunten van het cluster opgeslagen.<\/li>\n<li><code>x-ha-nodes<\/code> \u2014 stelt de knooppunten in waartoe een bepaalde wachtrij zal behoren. <code>HA<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Deel 3. Laten we kijken naar Queues en Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/a8f660b6c0a43626e4025cf7769a4425.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Als de wachtrij is gemaakt <strong>mogelijk<\/strong>, zal de server een synchronisatie <code>RPC<\/code> op de kritiek van het gebruik van advertentieblokker als middel om persoonlijke conflicten op te lossen en druk uit te oefenen op gebruikers, verklaarde ontwikkelaar dimisa <code>Queue.DeclareOk<\/code>. Als de wachtrij is gemaakt <strong>onmogelijk is<\/strong> (er was een fout bij het verzoek <code>Queue.Declare<\/code>), dan <strong>zal de kanaal sluiten<\/strong> door de server met het command <code>Channel.Close<\/code> en de client ontvangt een uitzondering <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>, die de foutcode en de omschrijving zal bevatten. <\/p>\n<p><\/p>\n<p><strong>Een herroep<\/strong> <code>Queue.Declare<\/code> <strong>met dezelfde parameters<\/strong> zal nuttige informatie over deze wachtrij teruggeven. Bijvoorbeeld, het totale aantal berichten dat wacht in deze wachtrij en het totale aantal consumenten dat zich op deze wachtrij heeft geabonneerd. <\/p>\n<p><\/p>\n<p>Aanroep <code>Queue.Declare<\/code> onder gebruikersgegevens waarvoor niet de nodige rechten zijn toegewezen <strong>sluit het kanaal<\/strong> met behulp van het commando <code>Channel.Close<\/code> en de client ontvangt een uitzondering <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>, dat de foutcode bevat <noindex><a rel=\"nofollow\" href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/HTTP\/Status\/403\">403<\/a><\/noindex> en de beschrijving ervan.<\/p>\n<p><\/p>\n<p>Nadat de wachtrij gedurende &gt;= 10 seconden heeft gerust, <strong>valt deze in de slaapstand<\/strong>, waardoor GC in de wachtrij wordt aangeroepen, wat leidt tot een aanzienlijke vermindering van het geheugen dat nodig is voor deze wachtrij.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-queue-cherez-graficheskiy-interfeys\"><em>Een wachtrij aanmaken via de grafische interface<\/em><\/h4>\n<p><\/p>\n<p>Ga naar het beheerderspaneel <code>RabbitMQ<\/code> onder gebruikersnaam <code>gast;<\/code> (username: <code>gast;<\/code> en password: <code>gast;<\/code>). Let op dat de gebruiker <code>gast;<\/code> alleen vanaf de lokale host kan verbinden. Laten we nu naar het tabblad <code>Wachtrijen<\/code> gaan en op de <code>Voeg een nieuwe wachtrij toe<\/code>. Vul de eigenschappen in:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Deel 3. Laten we kijken naar Queues en Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/ea77a406ad16f0871c7197e96a66818f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zodra we alle nodige gegevens hebben ingevoerd en op <code>Wachtrijen toevoegen<\/code>, verschijnt de wachtrij in de algemene lijst.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Deel 3. Laten we kijken naar Queues en Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/8342e044a0d6c0a035a2c9f646035cad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Een klik op de naam van de wachtrij toont de gedetailleerde informatie. Hier kan de binding tussen de uitwisseling en de wachtrij worden ingesteld, kan de lijst worden bekeken <code>consumers<\/code>, berichten worden gepubliceerd\/ontvangen, de wachtrij kan worden verwijderd en de statistieken kunnen worden bekeken.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding\"><em>Binding aanmaken<\/em><\/h4>\n<p><\/p>\n<p>Het aanmaken van een binding gebeurt via een synchrone <code>RPC<\/code> verzoek aan de server. Het verzoek wordt gedaan met behulp van de methode <code>Queue.Bind<\/code>, aangeroepen met de parameters:<\/p>\n<p><\/p>\n<ul>\n<li>de naam van de queue<\/li>\n<li>naam van het uitwisselpunt<\/li>\n<li>andere parameters<\/li>\n<\/ul>\n<p><\/p>\n<p>Voorbeeld van het aanmaken van een binding met behulp van <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 naam van de wachtrij<\/li>\n<li><code>exchange<\/code> \u2014 naam van de uitwisseling<\/li>\n<li><code>routingKey<\/code> \u2014 routeringssleutel<\/li>\n<li><code>arguments<\/code> \u2014 optionele argumenten<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Deel 3. Laten we kijken naar Queues en Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/9123186c94a822309b679f26c2e511ea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Als de binding wordt aangemaakt <strong>mogelijk<\/strong>, zal de server een synchronisatie <code>RPC<\/code> op de kritiek van het gebruik van advertentieblokker als middel om persoonlijke conflicten op te lossen en druk uit te oefenen op gebruikers, verklaarde ontwikkelaar dimisa <code>Queue.BindOk<\/code>.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding-cherez-graficheskiy-interfeys\"><em>Binding aanmaken via de grafische interface<\/em><\/h4>\n<p><\/p>\n<p>Ga naar het beheerderspaneel <code>RabbitMQ<\/code> onder gebruikersnaam <code>gast;<\/code> (username: <code>gast;<\/code> en password: <code>gast;<\/code>). Let op dat de gebruiker <code>gast;<\/code> alleen vanaf de lokale host kan verbinden. Laten we nu naar het tabblad <code>Wachtrijen<\/code> en klikken op de wachtrij <code>my_queue<\/code>. Vul de velden in het gedeelte in <code>bindings<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Deel 3. Laten we kijken naar Queues en Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/7db6b42a4f29a1860aabe54ade0b6833.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zodra we alle nodige gegevens hebben ingevoerd en op <code>Bind<\/code>, wordt de binding weergegeven in de algemene lijst:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Deel 3. Laten we kijken naar Queues en 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>In dit gedeelte beschrijven we de wachtrij en binding met C#-code, alsof we een bibliotheek zouden moeten ontwikkelen. Dit kan nuttig zijn voor het begrip.<\/p>\n<p><\/p>\n<pre><code class=\"cs\">public interface IQueue\n    {        \n        string Name { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Als true is ingesteld, is de wachtrij permanent. \n        \/\/     Deze wordt op schijf opgeslagen en kan \n        \/\/     herstarten van de server\/broker overleven. \n        \/\/     Als false, is de wachtrij tijdelijk en wordt verwijderd, \n        \/\/     wanneer de server\/broker opnieuw wordt opgestart\n        \/\/ &lt;\/summary&gt;\n        bool IsDurable { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Als true is ingesteld, \n        \/\/     mag deze wachtrij alleen door \u00e9\u00e9n consumer worden benaderd\n        \/\/ &lt;\/summary&gt;\n        bool IsExclusive { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Automatische verwijdering. \n        \/\/     De wachtrij wordt verwijderd wanneer alle clients worden ontkoppeld.\n        \/\/ &lt;\/summary&gt;\n        bool IsAutoDelete { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Optionele argumenten\n        \/\/ &lt;\/summary&gt;\n        IDictionary&lt;string, object&gt; 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} mag niet null zijn\");\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        \/\/\/     Luie modus. Luie modus zorgt ervoor dat zoveel mogelijk berichten op schijf worden opgeslagen,\n        \/\/\/     om het gebruik van RAM te verminderen\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        \/\/     Wisselaar die een binding zal uitvoeren\n        \/\/ <summary>\n        IExchange Exchange { get; }\n\n        \/\/ <summary>\n        \/\/     Routeringssleutel\n        \/\/ <summary>\n        string RoutingKey { get; }\n\n        \/\/ <summary>\n        \/\/     Optionele argumenten\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>Bron: <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.3 - 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\/nl\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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. Deel 3. We bestuderen Queues en Bindings | ProHoster","description":"Queue (wachtrij) \u2014 een gegevensstructuur op de schijf of in het geheugen die verwijzingen naar berichten opslaat en kopie\u00ebn ervan aan consumenten (consumenten) aanbiedt.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/73065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=73065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/73065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/73066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=73065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=73065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=73065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}