{"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\/de\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","title":{"rendered":"RabbitMQ. Teil 3. Wir besch\u00e4ftigen uns mit Queues und Bindings","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>Warteschlange<\/code> (Warteschlange) \u2014 eine Datenstruktur auf der Festplatte oder im Arbeitsspeicher, die Verweise auf Nachrichten speichert und deren Kopien \u00fcbergibt <code>consumers<\/code> (Verbraucher). <code>Warteschlange<\/code> stellt dar <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">Erlang-Prozess<\/a><\/noindex> mit Zustand (in dem auch die Nachrichten zwischengespeichert werden k\u00f6nnen). 1.000 Warteschlangen k\u00f6nnen etwa 80 Mb in Anspruch nehmen.<\/p>\n<p><\/p>\n<p><code>Bindung<\/code> (Binding) \u2014 eine Regel, die dem Exchange mitteilt, in welche Warteschlangen die Nachrichten gelangen sollen.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"oglavlenie\">Inhaltsverzeichnis<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/488654\/\">RabbitMQ. Teil 1. Einf\u00fchrung. Erlang, AMQP und RPC<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">RabbitMQ. Teil 2. Verstehen der Exchanges<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490960\/\">RabbitMQ. Teil 3. Wir besch\u00e4ftigen uns mit Queues und Bindings<\/a><\/noindex><\/li>\n<li>RabbitMQ. Teil 4. Wir kl\u00e4ren, was Nachrichten und Frames sind<\/li>\n<li>RabbitMQ. Teil 5. Leistung bei der Publikation und dem Konsum von Nachrichten<\/li>\n<li>RabbitMQ. Teil 6. \u00dcberblick \u00fcber die Module Federation und Shovel<\/li>\n<li>RabbitMQ. Teil 7. Detaillierte Informationen zu Verbindung und Kanal<\/li>\n<li>RabbitMQ. Teil 8. RabbitMQ in .NET<\/li>\n<li>RabbitMQ. Teil 9. Monitoring<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"vremennye-ocheredi\"><em>Tempor\u00e4re Warteschlangen<\/em><\/h4>\n<p><\/p>\n<p>Wenn die Warteschlange mit dem gesetzten Parameter erstellt wird <code>autoDelete<\/code>, dann erh\u00e4lt diese Warteschlange die F\u00e4higkeit <strong>sich selbst automatisch zu l\u00f6schen<\/strong>. Solche Warteschlangen werden in der Regel beim Anschluss des ersten Clients erstellt und gel\u00f6scht, wenn alle Clients getrennt sind. <\/p>\n<p><\/p>\n<p>Wenn die Warteschlange mit dem gesetzten Parameter erstellt wird <code>exklusiv<\/code>, dann erlaubt diese Warteschlange <strong>nur einem Verbraucher, sich zu verbinden<\/strong> und wird gel\u00f6scht, wenn der Kanal geschlossen wird. Solange der Kanal nicht geschlossen ist, kann der Client sich w\u00e4hrend der gleichen Verbindung trennen\/verbinden. Wenn der Parameter <code>exklusiv<\/code> gesetzt ist, hat der Parameter <code>autoDelete<\/code> keine Auswirkungen.<\/p>\n<p><\/p>\n<p>Merkmale:<\/p>\n<p><\/p>\n<ul>\n<li>Bei kurzfristigen Verbindungsunterbrechungen verlieren wir Nachrichten, die noch nicht den Verbraucher erreicht haben.<\/li>\n<li>Man kann das Ph\u00e4nomen <code>Binding Churn<\/code>beobachten. Das Ph\u00e4nomen tritt auf, wenn die Anzahl der Operationen zum Erstellen\/L\u00f6schen von Warteschlangen und Bindungen sehr hohe Werte erreicht. Im Clusterbetrieb wird dieser Umfang an Operationen sich \u00fcber alle Knoten ausbreiten und eine erhebliche Belastung verursachen. Dieser Prozess kann durch die Kontrolle der Anzahl der Abonnements optimiert werden.<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"postoyannye-ocheredi\"><em>Dauerhafte Warteschlangen<\/em><\/h4>\n<p><\/p>\n<p>Wenn die Warteschlange mit dem gesetzten Parameter erstellt wird <code>durable<\/code>, dann erlaubt diese Warteschlange <strong>bewahren ihren Zustand<\/strong> und stellen sich nach dem Neustart des Servers\/Brokers wieder her. Diese Warteschlange wird existieren, bis der Befehl <code>Queue.Delete<\/code>. <\/p>\n<p><\/p>\n<h4 id=\"highly-available-ocheredi\"><em>Hochverf\u00fcgbare Warteschlangen<\/em><\/h4>\n<p><\/p>\n<p>HA Warteschlangen erfordern eine Clusterumgebung von RabbitMQ. Im Clustermodus werden alle Informationen \u00fcber Exchanges, Warteschlangen, Bindungen und Verbraucher auf alle Knoten kopiert.<\/p>\n<p><\/p>\n<p>Wenn eine Nachricht in eine HA Warteschlange ver\u00f6ffentlicht wird, wird sie auf jedem Knoten gespeichert, der zur HA Warteschlange geh\u00f6rt. Sobald die Nachricht auf einem der Knoten konsumiert wird, werden alle Kopien dieser Nachricht auf den anderen Knoten gel\u00f6scht. <\/p>\n<p><\/p>\n<p>HA Warteschlangen k\u00f6nnen sich \u00fcber alle Knoten in einem bestimmten Cluster oder nur \u00fcber einzelne erstrecken. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Teil 3. Wir besch\u00e4ftigen uns mit Queues und Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/46d560ab33e686ddf9adb0b18b4bb0b0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Merkmale:<\/p>\n<p><\/p>\n<ul>\n<li>Die Verwendung von HA-Warteschlangen f\u00fchrt zu Leistungseinbu\u00dfen. Beim Hinzuf\u00fcgen einer Nachricht zu einer HA-Warteschlange oder beim Abrufen einer Nachricht aus einer HA-Warteschlange muss RabbitMQ die Koordination \u00fcber alle Knoten hinweg durchf\u00fchren (in der Regel sind 2-3 Knoten ausreichend).<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"sozdanie-ocheredi\"><em>Warteschlange erstellen<\/em><\/h4>\n<p><\/p>\n<p>Die Erstellung einer Warteschlange erfolgt synchron. <code>RPC<\/code> Anruf an den Server. Die Anfrage erfolgt mit der Methode <code>Queue.Declare<\/code>, die mit den Parametern aufgerufen wird:<\/p>\n<p><\/p>\n<ul>\n<li>Name der Warteschlange<\/li>\n<li>weitere Parameter<\/li>\n<\/ul>\n<p><\/p>\n<p>Beispiel zur Erstellung einer Warteschlange mit <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 der Name der Warteschlange, die wir erstellen m\u00f6chten. Der Name muss eindeutig sein und darf nicht mit dem Systemnamen der Warteschlange \u00fcbereinstimmen.<\/li>\n<li><code>durable<\/code> \u2014 wenn true, speichert die Warteschlange ihren Zustand <strong>und stellt ihn nach einem Neustart des Servers\/Brokers wieder her.<\/strong> \u2014 wenn true, erlaubt die Warteschlange nur einem Verbraucher den Zugriff.<\/li>\n<li><code>exklusiv<\/code> \u2014 wenn true, erh\u00e4lt die Warteschlange die F\u00e4higkeit<\/li>\n<li><code>autoDelete<\/code> \u2014 optionale Argumente. Wir werden diese unten n\u00e4her erl\u00e4utern. <strong>sich selbst automatisch zu l\u00f6schen<\/strong><\/li>\n<li><code>arguments<\/code> x-message-ttl<\/li>\n<\/ul>\n<p><\/p>\n<h5 id=\"arguments\"><em>arguments<\/em><\/h5>\n<p><\/p>\n<ul>\n<li><code>x-message-time-to-live<\/code>(<code>) \u2014 erm\u00f6glicht es, die Lebensdauer von Nachrichten in Millisekunden festzulegen. Wenn die Warteschlange mit einem festgelegten Wert f\u00fcr das Argument erstellt wird,<\/code>wird diese Warteschlange <code>x-message-time-to-live<\/code>automatisch Nachrichten ausschlie\u00dfen, deren G\u00fcltigkeit abgelaufen ist. <strong>Das Setzen des Argumentwerts<\/strong>legt das maximale Alter f\u00fcr alle Nachrichten in dieser Warteschlange fest. Die Erstellung einer solchen Warteschlange <code>x-message-time-to-live<\/code> hilft, den Erhalt veralteter Informationen zu verhindern. <strong>Dies kann in Echtzeitsystemen verwendet werden. Wenn f\u00fcr die Warteschlange, der ein Austausch f\u00fcr abgelehnte Nachrichten zugewiesen ist, ein Wert f\u00fcr das Argument festgelegt wird,<\/strong>beginnen abgelehnte Nachrichten in dieser Warteschlange <code>x-message-time-to-live<\/code>eine Lebensdauer zu haben. <strong>x-expires<\/strong>.<\/li>\n<li><code>\u2014 legt den Wert in Millisekunden fest, nach dessen Ablauf die Warteschlange gel\u00f6scht wird. Die Warteschlange kann ihre Lebensdauer nur verlieren, wenn sie keine Abonnenten hat. Wenn Abonnenten mit der Warteschlange verbunden sind, kann sie sich nur dann automatisch l\u00f6schen, wenn alle Abonnenten<\/code> Basic.Cancel <code>aufrufen oder sich abmelden. Die Lebensdauer der Warteschlange kann nur ablaufen, wenn keine Anforderung an sie gestellt wurde<\/code> Basic.Get. <code>Andernfalls wird der aktuelle Wert der Lebensdauer auf null gesetzt, und die Warteschlange wird nicht mehr automatisch gel\u00f6scht. Zudem<\/code>gibt es keine Garantie daf\u00fcr, wie schnell die L\u00f6schung der Warteschlange nach Ablauf ihrer Lebensdauer erfolgt. <strong>x-max-length<\/strong>.<\/li>\n<li><code>x-max-length<\/code> setzt die maximale Anzahl von Nachrichten in der Warteschlange fest. Wenn die Anzahl der Nachrichten in der Warteschlange die maximale Zahl \u00fcberschreitet, werden die \u00e4ltesten Nachrichten gel\u00f6scht.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Teil 3. Wir besch\u00e4ftigen uns mit Queues und 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> setzt die maximal zul\u00e4ssige Gesamtgr\u00f6\u00dfe der Nutzlastnachrichten in der Warteschlange fest. Bei \u00dcberschreitung des festgelegten Wertes (Warteschlangen\u00fcberlauf beim Ver\u00f6ffentlichen einer Nachricht) beginnen die \u00e4ltesten Nachrichten gel\u00f6scht zu werden.<\/li>\n<li><code>x-overflow<\/code> dieses Argument wird verwendet, um das Verhalten im Fall eines Warteschlangen\u00fcberlaufs zu konfigurieren. Es sind zwei Werte verf\u00fcgbar: <code>drop-head<\/code> (Standardwert) und <code>reject-publish<\/code>. Wenn Sie w\u00e4hlen, <code>drop-head<\/code>, werden die \u00e4ltesten Nachrichten gel\u00f6scht. Wenn Sie w\u00e4hlen, <code>reject-publish<\/code>, wird der Empfang von Nachrichten ausgesetzt.<\/li>\n<li><code>x-dead-letter-exchange<\/code> setzt den Exchange fest, an den abgelehnte Nachrichten weitergeleitet werden, die nicht wieder in die Warteschlange gestellt werden.<\/li>\n<li><code>x-dead-letter-routing-key<\/code> setzt einen optionalen Routing-Schl\u00fcssel f\u00fcr abgelehnte Nachrichten fest.<\/li>\n<li><code>x-max-priority<\/code> erm\u00f6glicht die Sortierung nach Priorit\u00e4ten in der Warteschlange mit einem maximalen Priorit\u00e4tswert von 255 (RabbitMQ-Versionen 3.5.0 und h\u00f6her). Diese Zahl gibt die maximale Priorit\u00e4t an, die die Warteschlange unterst\u00fctzen wird. Wenn das Argument nicht festgelegt ist, unterst\u00fctzt die Warteschlange keine Nachrichtenpriorit\u00e4ten.<\/li>\n<li><code>x-queue-mode<\/code> erm\u00f6glicht es, die Warteschlange in den <strong>faulen Modus<\/strong>zu versetzen. In diesem Modus werden so viele Nachrichten wie m\u00f6glich auf der Festplatte gespeichert. Der Arbeitsspeicherverbrauch wird minimal sein. Wenn es nicht festgelegt ist, speichert die Warteschlange die Nachrichten im Arbeitsspeicher, um Nachrichten so schnell wie m\u00f6glich zuzustellen.<\/li>\n<li><code>x-queue-master-locator<\/code> wenn wir einen Cluster haben, kann die Master-Warteschlange festgelegt werden.<\/li>\n<li><code>x-ha-policy<\/code> wird bei der Erstellung von HA-Warteschlangen verwendet und bestimmt, wie die Nachricht \u00fcber die Knoten verteilt wird. Wenn der Wert festgelegt ist, <code>all<\/code>, wird die Nachricht auf allen Knoten gespeichert. Wenn der Wert festgelegt ist, <code>nodes<\/code>, wird die Nachricht auf bestimmten Knoten im Cluster gespeichert.<\/li>\n<li><code>x-ha-nodes<\/code> legt die Knoten fest, zu denen eine bestimmte Warteschlange geh\u00f6ren wird. <code>HA<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Teil 3. Wir besch\u00e4ftigen uns mit Queues und Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/a8f660b6c0a43626e4025cf7769a4425.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn die Warteschlange erstellt wird, <strong>es k\u00f6nnte<\/strong>, dann wird der Server dem Client eine synchrone <code>RPC<\/code> Antwort <code>Queue.DeclareOk<\/code>. Wenn die Warteschlange vom Server mit dem Befehl erstellt wird, <strong>nicht m\u00f6glich ist<\/strong> (Die Anfrage wurde abgelehnt <code>Queue.Declare<\/code>), dann <strong>wird der Kanal vom Server mit einem asynchronen Befehl<\/strong> ein erneuter Aufruf <code>geschlossen<\/code> und der Client erh\u00e4lt eine Ausnahme <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 den Fehlercode und die Beschreibung enth\u00e4lt. <\/p>\n<p><\/p>\n<p><strong>mit denselben Parametern<\/strong> <code>Queue.Declare<\/code> <strong>liefert n\u00fctzliche Informationen \u00fcber diese Warteschlange. Zum Beispiel die Gesamtzahl der Nachrichten, die in dieser Warteschlange warten, und die Gesamtzahl der Abonnenten.<\/strong> gibt n\u00fctzliche Informationen \u00fcber diese Warteschlange zur\u00fcck. Zum Beispiel die Gesamtzahl der Nachrichten, die in dieser Warteschlange warten, und die Gesamtzahl der darauf registrierten Verbraucher. <\/p>\n<p><\/p>\n<p>Aufruf <code>Queue.Declare<\/code> unter den Benutzerdaten, denen die erforderlichen Rechte nicht zugewiesen sind <strong>schlie\u00dft den Kanal<\/strong> mit dem Befehl <code>geschlossen<\/code> und der Client erh\u00e4lt eine Ausnahme <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>, der den Fehlercode enthalten wird <noindex><a rel=\"nofollow\" href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/HTTP\/Status\/403\">403<\/a><\/noindex> und dessen Beschreibung.<\/p>\n<p><\/p>\n<p>Nachdem die Warteschlange f\u00fcr &gt;= 10 Sekunden inaktiv war, <strong>geht sie in den Ruhezustand<\/strong>, indem sie GC in der Warteschlange aufruft, was zu einer erheblichen Reduzierung des Speichers f\u00fchrt, der f\u00fcr diese Warteschlange erforderlich ist.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-queue-cherez-graficheskiy-interfeys\"><em>Erstellen einer Warteschlange \u00fcber die grafische Benutzeroberfl\u00e4che<\/em><\/h4>\n<p><\/p>\n<p>Melden Sie sich beim Administrationspanel <code>RabbitMQ<\/code> als Benutzer <code>guest<\/code> (Benutzername: <code>guest<\/code> und Passwort: <code>guest<\/code>). Beachten Sie, dass der Benutzer <code>guest<\/code> nur von localhost aus eine Verbindung herstellen kann. Lassen Sie uns nun zur Registerkarte <code>Warteschlangen<\/code> gehen und auf <code>Eine neue Warteschlange hinzuf\u00fcgen<\/code>. Eigenschaften ausf\u00fcllen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Teil 3. Wir besch\u00e4ftigen uns mit Queues und Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/ea77a406ad16f0871c7197e96a66818f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sobald wir alle erforderlichen Daten eingegeben haben und auf <code>Warteschlangen hinzuf\u00fcgen<\/code>, erscheint die Warteschlange in der Gesamtliste.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Teil 3. Wir besch\u00e4ftigen uns mit Queues und Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/8342e044a0d6c0a035a2c9f646035cad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein Klick auf den Namen der Warteschlange zeigt ihre detaillierten Informationen. Hier k\u00f6nnen Sie die Bindung zwischen dem Exchange und der Warteschlange konfigurieren, die Liste anzeigen <code>consumers<\/code>, Nachrichten ver\u00f6ffentlichen\/empfangen, die Warteschlange l\u00f6schen und Statistiken einsehen.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding\"><em>Bindung erstellen<\/em><\/h4>\n<p><\/p>\n<p>Die Bindung erfolgt durch eine synchrone <code>RPC<\/code> Anruf an den Server. Die Anfrage erfolgt mit der Methode <code>Queue.Bind<\/code>, die mit den Parametern aufgerufen wird:<\/p>\n<p><\/p>\n<ul>\n<li>Name der Warteschlange<\/li>\n<li>Name des Exchanges<\/li>\n<li>weitere Parameter<\/li>\n<\/ul>\n<p><\/p>\n<p>Beispiel f\u00fcr die Erstellung einer Bindung mit <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 Warteschlangenname<\/li>\n<li><code>exchange<\/code> \u2014 Name des Brokers<\/li>\n<li><code>routingKey<\/code> \u2014 Routing-Schl\u00fcssel<\/li>\n<li><code>arguments<\/code> \u2014 optionale Argumente<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Teil 3. Wir besch\u00e4ftigen uns mit Queues und Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/9123186c94a822309b679f26c2e511ea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn die Bindung erstellt wird <strong>es k\u00f6nnte<\/strong>, dann wird der Server dem Client eine synchrone <code>RPC<\/code> Antwort <code>Queue.BindOk<\/code>.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding-cherez-graficheskiy-interfeys\"><em>Erstellen einer Bindung \u00fcber die grafische Benutzeroberfl\u00e4che<\/em><\/h4>\n<p><\/p>\n<p>Melden Sie sich beim Administrationspanel <code>RabbitMQ<\/code> als Benutzer <code>guest<\/code> (Benutzername: <code>guest<\/code> und Passwort: <code>guest<\/code>). Beachten Sie, dass der Benutzer <code>guest<\/code> nur von localhost aus eine Verbindung herstellen kann. Lassen Sie uns nun zur Registerkarte <code>Warteschlangen<\/code> und klicken Sie auf die Warteschlange <code>my_queue<\/code>. F\u00fcllen Sie die Felder im Abschnitt aus <code>Bindings<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Teil 3. Wir besch\u00e4ftigen uns mit Queues und Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/7db6b42a4f29a1860aabe54ade0b6833.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sobald wir alle erforderlichen Daten eingegeben haben und auf <code>Binden<\/code>, wird die Bindung in der Gesamtliste angezeigt:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Teil 3. Wir besch\u00e4ftigen uns mit Queues und 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 diesem Abschnitt beschreiben wir die Warteschlange und die Bindung mit C#-Code, als ob wir eine Bibliothek entwickeln m\u00fcssten. Das k\u00f6nnte f\u00fcr das Verst\u00e4ndnis hilfreich sein.<\/p>\n<p><\/p>\n<pre><code class=\"cs\">public interface IQueue\n    {        \n        string Name { get; }\n\n        \/\/ <summary>\n        \/\/     Wenn Sie true setzen, wird die Warteschlange dauerhaft sein. \n        \/\/     Sie wird auf der Festplatte gespeichert und kann \n        \/\/     einen Server-\/Brokerneustart \u00fcberstehen. \n        \/\/     Wenn false, ist die Warteschlange tempor\u00e4r und wird gel\u00f6scht, \n        \/\/     wenn der Server\/Broker neu gestartet wird\n        \/\/ <\/summary>\n        bool IsDurable { get; }\n\n        \/\/ <summary>\n        \/\/     Wenn der Wert true ist, \n        \/\/     kann nur ein Consumer an diese Warteschlange angeschlossen werden\n        \/\/ <\/summary>\n        bool IsExclusive { get; }\n\n        \/\/ <summary>\n        \/\/     Automatische L\u00f6schung. \n        \/\/     Die Warteschlange wird gel\u00f6scht, wenn alle Clients getrennt sind.\n        \/\/ <\/summary>\n        bool IsAutoDelete { get; }\n\n        \/\/ <summary>\n        \/\/     Optionale Argumente\n        \/\/ <\/summary>\n        IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">\u00f6ffentliche Klasse Queue : IQueue\n    {\n        \u00f6ffentliche Queue(\n             Zeichenfolge 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} darf nicht null sein\");\n\n            IsDurable = isDurable;\n            IsExclusive = isExclusive;\n            IsAutoDelete = isAutoDelete;\n            Arguments = arguments ?? new Dictionary();\n        }\n\n        \u00f6ffentliche Zeichenfolge Name { get; }\n        \u00f6ffentliche bool IsDurable { get; }\n        \u00f6ffentliche bool IsExclusive { get; }\n        \u00f6ffentliche bool IsAutoDelete { get; }\n        \u00f6ffentliche IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">\u00f6ffentliche statische Klasse QueueMode\n    {       \n        \u00f6ffentliche konstante Zeichenfolge Default = \"default\";\n        \/\/ <summary>\n        \/\/     Faulheitsmodus. Der Faulheitsmodus zwingt dazu, \n        \/\/     so viele Nachrichten wie m\u00f6glich auf der Festplatte zu speichern, \n        \/\/     um den Einsatz von Arbeitsspeicher zu verringern\n        \/\/ <\/summary>\n        \u00f6ffentliche konstante Zeichenfolge Lazy = \"lazy\";\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">\u00f6ffentliches Interface IBinding\n    {\n        \/\/ &lt;summary&gt;\n        \/\/    Austausch, der durch Bindung verbunden wird\n        \/\/ &lt;\/summary&gt;\n        IExchange Exchange { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/    Routing-Schl\u00fcssel\n        \/\/ &lt;\/summary&gt;\n        string RoutingKey { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/    Optionale Argumente\n        \/\/ &lt;\/summary&gt;\n        IDictionary Argumente { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">\u00f6ffentliche Klasse Bindung : IBinding\n    {\n        \u00f6ffentliche Bindung(\n             IExchange exchange, \n             string routingKey, \n             IDictionary argumente)\n        {\n            Exchange = exchange;\n            RoutingKey = routingKey;\n            Argumente = argumente;\n        }\n\n        \u00f6ffentliche IExchange Exchange { get; }\n        \u00f6ffentliche string RoutingKey { get; }\n        \u00f6ffentliche IDictionary Argumente { get; }\n    }<\/code><\/pre>\n<p>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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. Teil 3. Wir befassen uns mit Warteschlangen und Bindungen | ProHoster","description":"Eine Warteschlange (Queue) ist eine Datenstruktur auf der Festplatte oder im Arbeitsspeicher, die Verweise auf Nachrichten speichert und deren Kopien an Verbraucher (Consumers) ausgibt.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/73065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=73065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/73065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/73066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=73065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=73065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=73065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}