Warteschlange (Warteschlange) â eine Datenstruktur auf der Festplatte oder im Arbeitsspeicher, die Verweise auf Nachrichten speichert und deren Kopien ĂŒbergibt consumers (Verbraucher). Warteschlange stellt dar mit Zustand (in dem auch die Nachrichten zwischengespeichert werden können). 1.000 Warteschlangen können etwa 80 Mb in Anspruch nehmen.
Bindung (Binding) â eine Regel, die dem Exchange mitteilt, in welche Warteschlangen die Nachrichten gelangen sollen.
Inhaltsverzeichnis
- RabbitMQ. Teil 4. Wir klÀren, was Nachrichten und Frames sind
- RabbitMQ. Teil 5. Leistung bei der Publikation und dem Konsum von Nachrichten
- RabbitMQ. Teil 6. Ăberblick ĂŒber die Module Federation und Shovel
- RabbitMQ. Teil 7. Detaillierte Informationen zu Verbindung und Kanal
- RabbitMQ. Teil 8. RabbitMQ in .NET
- RabbitMQ. Teil 9. Monitoring
TemporÀre Warteschlangen
Wenn die Warteschlange mit dem gesetzten Parameter erstellt wird autoDelete, dann erhÀlt diese Warteschlange die FÀhigkeit sich selbst automatisch zu löschen. Solche Warteschlangen werden in der Regel beim Anschluss des ersten Clients erstellt und gelöscht, wenn alle Clients getrennt sind.
Wenn die Warteschlange mit dem gesetzten Parameter erstellt wird exklusiv, dann erlaubt diese Warteschlange nur einem Verbraucher, sich zu verbinden und wird gelöscht, wenn der Kanal geschlossen wird. Solange der Kanal nicht geschlossen ist, kann der Client sich wÀhrend der gleichen Verbindung trennen/verbinden. Wenn der Parameter exklusiv gesetzt ist, hat der Parameter autoDelete keine Auswirkungen.
Besonderheiten:
- Bei kurzfristigen Verbindungsunterbrechungen verlieren wir Nachrichten, die noch nicht den Verbraucher erreicht haben.
- Man kann das PhÀnomen
Binding Churnbeobachten. Das PhĂ€nomen tritt auf, wenn die Anzahl der Operationen zum Erstellen/Löschen von Warteschlangen und Bindungen sehr hohe Werte erreicht. Im Clusterbetrieb wird dieser Umfang an Operationen sich ĂŒber alle Knoten ausbreiten und eine erhebliche Belastung verursachen. Dieser Prozess kann durch die Kontrolle der Anzahl der Abonnements optimiert werden.
Dauerhafte Warteschlangen
Wenn die Warteschlange mit dem gesetzten Parameter erstellt wird durable, dann erlaubt diese Warteschlange bewahren ihren Zustand und stellen sich nach dem Neustart des Servers/Brokers wieder her. Diese Warteschlange wird existieren, bis der Befehl Queue.Delete.
HochverfĂŒgbare Warteschlangen
HA Warteschlangen erfordern eine Clusterumgebung von RabbitMQ. Im Clustermodus werden alle Informationen ĂŒber Exchanges, Warteschlangen, Bindungen und Verbraucher auf alle Knoten kopiert.
Wenn eine Nachricht in eine HA Warteschlange veröffentlicht wird, wird sie auf jedem Knoten gespeichert, der zur HA Warteschlange gehört. Sobald die Nachricht auf einem der Knoten konsumiert wird, werden alle Kopien dieser Nachricht auf den anderen Knoten gelöscht.
HA Warteschlangen können sich ĂŒber alle Knoten in einem bestimmten Cluster oder nur ĂŒber einzelne erstrecken.

Besonderheiten:
- Die Verwendung von HA-Warteschlangen fĂŒhrt zu LeistungseinbuĂen. Beim HinzufĂŒgen einer Nachricht zu einer HA-Warteschlange oder beim Abrufen einer Nachricht aus einer HA-Warteschlange muss RabbitMQ die Koordination ĂŒber alle Knoten hinweg durchfĂŒhren (in der Regel sind 2-3 Knoten ausreichend).
Warteschlange erstellen
Die Erstellung einer Warteschlange erfolgt synchron. RPC Anruf an den Server. Die Anfrage erfolgt mit der Methode Queue.Declare, die mit den Parametern aufgerufen wird:
- Name der Warteschlange
- weitere Parameter
Beispiel zur Erstellung einer Warteschlange mit :
// ...
channel.QueueDeclare(
queue: "my_queue",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null
);
// ...queueâ der Name der Warteschlange, die wir erstellen möchten. Der Name muss eindeutig sein und darf nicht mit dem Systemnamen der Warteschlange ĂŒbereinstimmen.durableâ wenn true, speichert die Warteschlange ihren Zustand und stellt ihn nach einem Neustart des Servers/Brokers wieder her. â wenn true, erlaubt die Warteschlange nur einem Verbraucher den Zugriff.exklusivâ wenn true, erhĂ€lt die Warteschlange die FĂ€higkeitautoDeleteâ optionale Argumente. Wir werden diese unten nĂ€her erlĂ€utern. sich selbst automatisch zu löschenargumentsx-message-ttl
arguments
x-message-time-to-live() â ermöglicht es, die Lebensdauer von Nachrichten in Millisekunden festzulegen. Wenn die Warteschlange mit einem festgelegten Wert fĂŒr das Argument erstellt wird,wird diese Warteschlangex-message-time-to-liveautomatisch Nachrichten ausschlieĂen, deren GĂŒltigkeit abgelaufen ist. Das Setzen des Argumentwertslegt das maximale Alter fĂŒr alle Nachrichten in dieser Warteschlange fest. Die Erstellung einer solchen Warteschlangex-message-time-to-livehilft, den Erhalt veralteter Informationen zu verhindern. Dies kann in Echtzeitsystemen verwendet werden. Wenn fĂŒr die Warteschlange, der ein Austausch fĂŒr abgelehnte Nachrichten zugewiesen ist, ein Wert fĂŒr das Argument festgelegt wird,beginnen abgelehnte Nachrichten in dieser Warteschlangex-message-time-to-liveeine Lebensdauer zu haben. x-expires.â legt den Wert in Millisekunden fest, nach dessen Ablauf die Warteschlange gelöscht 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öschen, wenn alle AbonnentenBasic.Cancelaufrufen oder sich abmelden. Die Lebensdauer der Warteschlange kann nur ablaufen, wenn keine Anforderung an sie gestellt wurdeBasic.Get.Andernfalls wird der aktuelle Wert der Lebensdauer auf null gesetzt, und die Warteschlange wird nicht mehr automatisch gelöscht. Zudemgibt es keine Garantie dafĂŒr, wie schnell die Löschung der Warteschlange nach Ablauf ihrer Lebensdauer erfolgt. x-max-length.x-max-lengthsetzt die maximale Anzahl von Nachrichten in der Warteschlange fest. Wenn die Anzahl der Nachrichten in der Warteschlange die maximale Zahl ĂŒberschreitet, werden die Ă€ltesten Nachrichten gelöscht.

x-max-lenght-bytessetzt die maximal zulĂ€ssige GesamtgröĂe der Nutzlastnachrichten in der Warteschlange fest. Bei Ăberschreitung des festgelegten Wertes (WarteschlangenĂŒberlauf beim Veröffentlichen einer Nachricht) beginnen die Ă€ltesten Nachrichten gelöscht zu werden.x-overflowdieses Argument wird verwendet, um das Verhalten im Fall eines WarteschlangenĂŒberlaufs zu konfigurieren. Es sind zwei Werte verfĂŒgbar:drop-head(Standardwert) undreject-publish. Wenn Sie wĂ€hlen,drop-head, werden die Ă€ltesten Nachrichten gelöscht. Wenn Sie wĂ€hlen,reject-publish, wird der Empfang von Nachrichten ausgesetzt.x-dead-letter-exchangesetzt den Exchange fest, an den abgelehnte Nachrichten weitergeleitet werden, die nicht wieder in die Warteschlange gestellt werden.x-dead-letter-routing-keysetzt einen optionalen Routing-SchlĂŒssel fĂŒr abgelehnte Nachrichten fest.x-max-priorityermöglicht die Sortierung nach PrioritĂ€ten in der Warteschlange mit einem maximalen PrioritĂ€tswert von 255 (RabbitMQ-Versionen 3.5.0 und höher). Diese Zahl gibt die maximale PrioritĂ€t an, die die Warteschlange unterstĂŒtzen wird. Wenn das Argument nicht festgelegt ist, unterstĂŒtzt die Warteschlange keine NachrichtenprioritĂ€ten.x-queue-modeermöglicht es, die Warteschlange in den faulen Moduszu versetzen. In diesem Modus werden so viele Nachrichten wie möglich 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öglich zuzustellen.x-queue-master-locatorwenn wir einen Cluster haben, kann die Master-Warteschlange festgelegt werden.x-ha-policywird bei der Erstellung von HA-Warteschlangen verwendet und bestimmt, wie die Nachricht ĂŒber die Knoten verteilt wird. Wenn der Wert festgelegt ist,all, wird die Nachricht auf allen Knoten gespeichert. Wenn der Wert festgelegt ist,nodes, wird die Nachricht auf bestimmten Knoten im Cluster gespeichert.x-ha-nodeslegt die Knoten fest, zu denen eine bestimmte Warteschlange gehören wird.HA

Wenn die Warteschlange erstellt wird, es könnte, dann wird der Server dem Client eine synchrone RPC Antwort Queue.DeclareOk. Wenn die Warteschlange vom Server mit dem Befehl erstellt wird, nicht möglich ist (Die Anfrage wurde abgelehnt Queue.Declare), dann wird der Kanal vom Server mit einem asynchronen Befehl ein erneuter Aufruf geschlossen und der Client erhÀlt eine Ausnahme , die den Fehlercode und die Beschreibung enthÀlt.
mit denselben Parametern Queue.Declare liefert nĂŒtzliche Informationen ĂŒber diese Warteschlange. Zum Beispiel die Gesamtzahl der Nachrichten, die in dieser Warteschlange warten, und die Gesamtzahl der Abonnenten. gibt nĂŒtzliche Informationen ĂŒber diese Warteschlange zurĂŒck. Zum Beispiel die Gesamtzahl der Nachrichten, die in dieser Warteschlange warten, und die Gesamtzahl der darauf registrierten Verbraucher.
Aufruf Queue.Declare unter den Benutzerdaten, denen die erforderlichen Rechte nicht zugewiesen sind schlieĂt den Kanal mit dem Befehl geschlossen und der Client erhĂ€lt eine Ausnahme , der den Fehlercode enthalten wird und dessen Beschreibung.
Nachdem die Warteschlange fĂŒr >= 10 Sekunden inaktiv war, geht sie in den Ruhezustand, indem sie GC in der Warteschlange aufruft, was zu einer erheblichen Reduzierung des Speichers fĂŒhrt, der fĂŒr diese Warteschlange erforderlich ist.
Erstellen einer Warteschlange ĂŒber die grafische BenutzeroberflĂ€che
Melden Sie sich beim Administrationspanel RabbitMQ als Benutzer guest (Benutzername: guest und Passwort: guest). Beachten Sie, dass der Benutzer guest nur von localhost aus eine Verbindung herstellen kann. Lassen Sie uns nun zur Registerkarte Warteschlangen gehen und auf Eine neue Warteschlange hinzufĂŒgen. Eigenschaften ausfĂŒllen:

Sobald wir alle erforderlichen Daten eingegeben haben und auf Warteschlangen hinzufĂŒgen, erscheint die Warteschlange in der Gesamtliste.

Ein Klick auf den Namen der Warteschlange zeigt ihre detaillierten Informationen. Hier können Sie die Bindung zwischen dem Exchange und der Warteschlange konfigurieren, die Liste anzeigen consumers, Nachrichten veröffentlichen/empfangen, die Warteschlange löschen und Statistiken einsehen.
Bindung erstellen
Die Bindung erfolgt durch eine synchrone RPC Anruf an den Server. Die Anfrage erfolgt mit der Methode Queue.Bind, die mit den Parametern aufgerufen wird:
- Name der Warteschlange
- Name des Exchanges
- weitere Parameter
Beispiel fĂŒr die Erstellung einer Bindung mit :
//...
channel.QueueBind(
queue: queueName,
exchange: "my_exchange",
routingKey: "my_key",
arguments: null
);
//...queueâ Warteschlangennameexchangeâ Name des BrokersroutingKeyâ Routing-SchlĂŒsselargumentsâ optionale Argumente

Wenn die Bindung erstellt wird es könnte, dann wird der Server dem Client eine synchrone RPC Antwort Queue.BindOk.
Erstellen einer Bindung ĂŒber die grafische BenutzeroberflĂ€che
Melden Sie sich beim Administrationspanel RabbitMQ als Benutzer guest (Benutzername: guest und Passwort: guest). Beachten Sie, dass der Benutzer guest nur von localhost aus eine Verbindung herstellen kann. Lassen Sie uns nun zur Registerkarte Warteschlangen und klicken Sie auf die Warteschlange my_queue. FĂŒllen Sie die Felder im Abschnitt aus Bindings:

Sobald wir alle erforderlichen Daten eingegeben haben und auf Binden, wird die Bindung in der Gesamtliste angezeigt:

Code
In diesem Abschnitt beschreiben wir die Warteschlange und die Bindung mit C#-Code, als ob wir eine Bibliothek entwickeln mĂŒssten. Das könnte fĂŒr das VerstĂ€ndnis hilfreich sein.
public interface IQueue
{
string Name { get; }
//
// Wenn Sie true setzen, wird die Warteschlange dauerhaft sein.
// Sie wird auf der Festplatte gespeichert und kann
// einen Server-/Brokerneustart ĂŒberstehen.
// Wenn false, ist die Warteschlange temporÀr und wird gelöscht,
// wenn der Server/Broker neu gestartet wird
//
bool IsDurable { get; }
//
// Wenn der Wert true ist,
// kann nur ein Consumer an diese Warteschlange angeschlossen werden
//
bool IsExclusive { get; }
//
// Automatische Löschung.
// Die Warteschlange wird gelöscht, wenn alle Clients getrennt sind.
//
bool IsAutoDelete { get; }
//
// Optionale Argumente
//
IDictionary Arguments { get; }
}öffentliche Klasse Warteschlange : IWarteschlange
{
öffentliche Warteschlange(
string name,
bool istDauerhaft = true,
bool istExklusiv = false,
bool istAutomatischLöschen = false,
IDictionary argumente = null)
{
Name = name ??
werfen eine ArgumentNullAusnahme(name, $"{name} darf nicht null sein");
IstDauerhaft = istDauerhaft;
IstExklusiv = istExklusiv;
IstAutomatischLöschen = istAutomatischLöschen;
Argumente = argumente ?? new Dictionary();
}
öffentliche string Name { get; }
öffentliche bool IstDauerhaft { get; }
öffentliche bool IstExklusiv { get; }
öffentliche bool IstAutomatischLöschen { get; }
öffentliche IDictionary Argumente { get; }
}öffentliche statische Klasse Wartemodus
{
öffentliche konst string Standard = "default";
// <summary>
// Fauler Modus. Der faule Modus wird dazu zwingen,
// so viele Nachrichten wie möglich auf der Festplatte zu speichern,
// um den Speicherverbrauch zu reduzieren
// </summary>
öffentliche konst string Faul = "lazy";
}öffentliches Interface IBinding
{
// <summary>
// Austausch, der durch Bindung verbunden wird
// </summary>
IExchange Exchange { get; }
// <summary>
// Routing-SchlĂŒssel
// </summary>
string RoutingKey { get; }
// <summary>
// Optionale Argumente
// </summary>
IDictionary Argumente { get; }
}öffentliche Klasse Bindung : IBinding
{
öffentliche Bindung(
IExchange exchange,
string routingKey,
IDictionary argumente)
{
Exchange = exchange;
RoutingKey = routingKey;
Argumente = argumente;
}
öffentliche IExchange Exchange { get; }
öffentliche string RoutingKey { get; }
öffentliche IDictionary Argumente { get; }
}Quelle: habr.com
