Warteschlange (Warteschlange) â eine Datenstruktur auf der Festplatte oder im Arbeitsspeicher, die Verweis auf Nachrichten speichert und deren Kopien bereitstellt. Konsumenten (der Konsumenten). Warteschlange stellt dar mit Zustand (in dem die Nachrichten auch zwischengespeichert werden können). 1.000 Warteschlangen können etwa 80 MB belegen.
Bindung (Bindung) â eine Regel, die dem Broker mitteilt, in welche Warteschlange die Nachrichten zugestellt werden sollen.
Inhaltsverzeichnis
- RabbitMQ. Teil 4. Was sind Nachrichten und Frames?
- RabbitMQ. Teil 5. Leistung bei der Veröffentlichung 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. Ăberwachung
TemporÀre Warteschlangen
Wenn eine Warteschlange mit dem Parameter autoDeleteerstellt wird, dann erhÀlt diese Warteschlange die FÀhigkeit sich automatisch zu löschen. Solche Warteschlangen werden normalerweise beim Anschluss des ersten Clients erstellt und gelöscht, wenn alle Clients getrennt werden.
Wenn eine Warteschlange mit dem Parameter exclusive, dann erlaubt diese Warteschlange nur einem Konsumenten die Verbindung. und wird entfernt, wenn der Kanal geschlossen wird. Solange der Kanal nicht geschlossen ist, kann der Kunde sich ab- und wieder anmelden, jedoch nur innerhalb derselben Verbindung. Wenn der Parameter exclusive eingerichtet ist, hat der Parameter autoDelete keine Wirkung.
Besonderheiten:
- Bei kurzzeitigem Verbindungsabbruch werden wir Nachrichten verlieren, die noch nicht beim Verbraucher angekommen sind.
- man kann das PhÀnomen
Binding Churn. Dieses PhÀnomen entsteht, wenn die Anzahl der Erstellungs- und LöschvorgÀnge von Warteschlangen und Bindungen sehr hoch wird. Im Clusterbetrieb wird dieser Strom von Operationen auf alle Knoten verteilt und erzeugt erhebliche Belastung. Dieser Prozess kann optimiert werden, indem die Anzahl der Abonnements kontrolliert wird.
Dauerhafte Warteschlangen
Wenn eine Warteschlange mit dem Parameter durable, dann erlaubt diese Warteschlange bewahrt ihren Zustand und wird nach dem Neustart des Servers/Brokers wiederhergestellt. Diese Warteschlange existiert, bis der Befehl Queue.Delete.
HochverfĂŒgbare Warteschlangen
HA-Warteschlangen erfordern eine Cluster-Umgebung von RabbitMQ. Im Clusterbetrieb werden alle Informationen ĂŒber Austausch, 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 zu dieser HA-Warteschlange gehört. Nachdem die Nachricht von einem der Knoten konsumiert wurde, werden alle Kopien dieser Nachricht auf den anderen Knoten gelöscht.
HA-Warteschlangen können sich ĂŒber alle Knoten in einem Cluster erstrecken oder nur auf einzelne Knoten beschrĂ€nkt sein.

Besonderheiten:
- Die Nutzung von HA-Warteschlangen fĂŒhrt zu LeistungseinbuĂen. Wenn eine Nachricht in eine HA-Warteschlange eingefĂŒgt oder aus einer HA-Warteschlange konsumiert wird, muss RabbitMQ die Koordination zwischen allen Knoten durchfĂŒhren (2-3 Knoten sind in der Regel ausreichend).
Warteschlange erstellen
Das Erstellen einer Warteschlange erfolgt ĂŒber einen synchronen RPC Anruf an den Server. Der Aufruf erfolgt ĂŒber die Methode Queue.Declare, die mit den folgenden Parametern aufgerufen wird:
- Name der Warteschlange
- weitere Parameter
Ein Beispiel fĂŒr die 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 einem Systemnamen der Warteschlange ĂŒbereinstimmen.durableâ Wenn true, wird die Warteschlange ihren Zustand speichern und nach einem Neustart des Servers/Brokers wiederhergestellt.exclusiveâ wenn true, erlaubt die Warteschlange nur einem Verbraucher den Zugriff.autoDeleteâ wenn true, erlangt die Warteschlange die FĂ€higkeit sich automatisch zu löschenArgumenteâ optionale Argumente. Im Folgenden erlĂ€utern wir dies nĂ€her.
Argumente
x-message-ttl(x-message-time-to-live) â ermöglicht die Festlegung einer Verfallszeit fĂŒr die Nachricht in Millisekunden. Wenn die Warteschlange mit einem festgelegten Argumentwert erstellt wird,x-message-ttlwird diese Warteschlange automatisch Nachrichten ausschlieĂen, deren Ablaufdatum ĂŒberschritten ist.Durch die Festlegung eines Argumentwertsx-message-ttlwird das maximale Alter fĂŒr alle Nachrichten in dieser Warteschlange definiert. Das Erstellen einer solchen Warteschlange hilft, das Empfangen veralteter Informationen zu verhindern.Dies kann in Echtzeitsystemen verwendet werden. Wenn fĂŒr eine Warteschlange, fĂŒr die ein Exchange fĂŒr abgelehnte Nachrichten festgelegt ist, ein Argumentwert definiert wird,x-message-ttlbeginnen die abgelehnten Nachrichten in dieser Warteschlange eine Lebensdauer zu haben..x-expiresâ legt die Zeit in Millisekunden fest, nach deren Ablauf die Warteschlange gelöscht wird. Eine Warteschlange kann ihre GĂŒltigkeit nur verlieren, wenn sie keine Abonnenten hat. Ist die Warteschlange mit Abonnenten verbunden, kann sie sich nur dann automatisch löschen, wenn alle Abonnenten"Basic.Canceloder sich abmelden. Die Lebensdauer der Warteschlange kann nur enden, wenn keine Anfrage an sie gerichtet wurde,Basic.Get. Andernfalls wird der aktuelle Wert der Lebensdauer zurĂŒckgesetzt, und die Warteschlange wird nicht mehr automatisch gelöscht. AuĂerdem gibt es keine Garantie dafĂŒr, wie schnell die Löschung der Warteschlange nach Ablauf ihrer Lebensdauer erfolgt..x-max-lengthâ definiert die maximale Anzahl von Nachrichten in der Warteschlange. Wenn die Anzahl der Nachrichten in der Warteschlange die maximale Anzahl ĂŒberschreitet, beginnen die Ă€ltesten Nachrichten gelöscht zu werden.

x-max-length-bytesâ legt die maximal zulĂ€ssige Gesamtdatenmenge der Nachrichten in der Warteschlange fest. Wenn der festgelegte Wert ĂŒberschritten wird (eine Ăberlauf der Warteschlange tritt bei der nĂ€chsten Veröffentlichung einer Nachricht auf), werden die Ă€ltesten Nachrichten gelöscht.x-overflowâ Dieses Argument wird verwendet, um das Verhalten im Falle eines WarteschlangenĂŒberlaufs zu steuern. 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 unterbrochen.x-dead-letter-exchangeâ Legt die Exchange fest, in die abgelehnte Nachrichten gesendet werden, die nicht erneut in die Warteschlange eingereiht werden.x-dead-letter-routing-keyâ Legt einen optionalen Routing-SchlĂŒssel fĂŒr abgelehnte Nachrichten fest.x-max-priorityâ Ermöglicht die PrioritĂ€tsSortierung in der Warteschlange mit einem maximalen PrioritĂ€tswert von 255 (RabbitMQ-Versionen 3.5.0 und höher). Die Zahl gibt die maximale PrioritĂ€t an, die die Warteschlange unterstĂŒtzen wird. Wenn das Argument nicht gesetzt ist, unterstĂŒtzt die Warteschlange keine NachrichtenprioritĂ€ten.x-queue-modeâ Ermöglicht es, die Warteschlange in den schlummernden Moduszu versetzen. In diesem Modus werden so viele Nachrichten wie möglich auf der Festplatte gespeichert. Der Verbrauch von RAM wird minimal sein. Wenn es nicht gesetzt ist, speichert die Warteschlange Nachrichten im Speicher, um eine möglichst schnelle Lieferung zu gewĂ€hrleisten.x-queue-master-locatorâ wenn wir ein Cluster haben, kann eine Master-Warteschlange eingestellt werdenx-ha-policyâ wird beim Erstellen von HA-Warteschlangen verwendet und bestimmt, wie die Nachricht ĂŒber die Knoten verteilt wird. Wenn der Wert gesetzt istall, wird die Nachricht auf allen Knoten gespeichert. Wenn der Wert gesetzt istnodes, wird die Nachricht auf bestimmten Knoten des Clusters gespeichertx-ha-nodesâ definiert die Knoten, denen eine bestimmte Warteschlange zugeordnet istHA

Wenn die Warteschlange erstellt wird möglich, sendet der Server eine synchrone RPC Antwort Queue.DeclareOk. Wenn die Warteschlange nicht erstellt werden kann (Fehler beim Anforderungsauftrag Queue.Declare), dann wird der Kanal vom Server mit dem Befehl Channel.Close geschlossen und der Client erhÀlt eine Ausnahme OperationInterruptedException Ein erneuter Aufruf
mit Ă€hnlichen Parametern Queue.Declare liefert nĂŒtzliche Informationen ĂŒber diese Warteschlange. Beispielsweise die Gesamtzahl der Nachrichten, die in dieser Warteschlange warten, und die Gesamtzahl der darauf registrierten Verbraucher. Ein Aufruf
Aufruf Queue.Declare unter Benutzeranmeldedaten, denen die erforderlichen Rechte nicht zugewiesen sind schlieĂt den Kanal mithilfe des Befehls geschlossen und der Client erhĂ€lt eine Ausnahme OperationInterruptedException , der einen Fehlercode und eine Beschreibung enthalten wird.
Nachdem die Warteschlange lĂ€nger als 10 Sekunden inaktiv ist, geht sie in den Ruhezustand, was die GC in der Warteschlange auslöst und zu einer signifikanten Reduzierung des benötigten Speichers fĂŒr diese Warteschlange fĂŒhrt.
Erstellen einer Warteschlange ĂŒber die grafische BenutzeroberflĂ€che
Loggen Sie sich im Administrationsbereich ein RabbitMQ mit dem Benutzer guest (Benutzername: guest und Passwort: guest). Beachten Sie, dass sich der Benutzer guest nur von localhost aus anmelden kann. Jetzt wechseln wir zum Tab Queues und klicken auf Eine neue Warteschlange hinzufĂŒgen. Wir fĂŒllen die Eigenschaften aus:

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

Ein Klick auf den Namen der Warteschlange zeigt ihre Details an. Hier können Sie die Bindung zwischen dem Exchange und der Warteschlange konfigurieren, die Liste Konsumenteneinsehen, Nachrichten veröffentlichen/erhalten, die Warteschlange löschen und Statistiken anzeigen.
Erstellen einer Bindung
Die Erstellung der Bindung erfolgt mithilfe von RPC Anruf an den Server. Der Aufruf erfolgt ĂŒber die Methode Queue.Bind, die mit den folgenden Parametern aufgerufen wird:
- Name der Warteschlange
- Name des Exchange
- weitere Parameter
Beispiel fĂŒr die Erstellung einer Bindung mit :
//...
channel.QueueBind(
queue: queueName,
exchange: "my_exchange",
routingKey: "my_key",
arguments: null
);
//...queueâ Name der Warteschlangeexchangeâ Name des ExchangesroutingKeyâ SchlĂŒssel zur WeiterleitungArgumenteâ optionale Argumente

Wenn die Bindung erstellt wird, möglich, sendet der Server eine synchrone RPC Antwort Queue.BindOk.
Erstellen einer Bindung ĂŒber die grafische BenutzeroberflĂ€che
Loggen Sie sich im Administrationsbereich ein RabbitMQ mit dem Benutzer guest (Benutzername: guest und Passwort: guest). Beachten Sie, dass sich der Benutzer guest nur von localhost aus anmelden kann. Jetzt wechseln wir zum Tab Queues und klicken Sie auf die Warteschlange my_queue. FĂŒllen Sie die Felder im Abschnitt aus Bindings:

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

Code
In diesem Abschnitt beschreiben wir die Warteschlange und die Bindung mit C#, als ob wir eine Bibliothek entwickeln mĂŒssten. Dies könnte hilfreich sein, um das Konzept besser zu verstehen.
public interface IQueue
{
string Name { get; }
//
// Wenn true gesetzt ist, ist die Warteschlange dauerhaft.
// Sie wird auf der Festplatte gespeichert und kann
// einen Server-/Brokerneustart ĂŒberstehen.
// Wenn der Wert false ist, ist die Warteschlange vorĂŒbergehend und wird gelöscht,
// wenn der Server/Broker neu gestartet wird.
//
bool IsDurable { get; }
//
// Wenn der Wert true ist,
// erlaubt diese Warteschlange den Zugriff
// nur fĂŒr einen Verbraucher.
//
bool IsExclusive { get; }
//
// Automatisches Löschen.
// Die Warteschlange wird gelöscht, wenn alle Clients getrennt sind.
//
bool IsAutoDelete { get; }
//
// Optionale Argumente
//
IDictionary Arguments { get; }
}public class Queue : IQueue
{
public Queue(
string name,
bool isDurable = true,
bool isExclusive = false,
bool isAutoDelete = false,
IDictionary arguments = null)
{
Name = name ??
throw new ArgumentNullException(name, $"{name} darf nicht null sein");
IsDurable = isDurable;
IsExclusive = isExclusive;
IsAutoDelete = isAutoDelete;
Arguments = arguments ?? new Dictionary();
}
public string Name { get; }
public bool IsDurable { get; }
public bool IsExclusive { get; }
public bool IsAutoDelete { get; }
public IDictionary Arguments { get; }
}public static class QueueMode
{
public const string Default = "default";
//
// Fauler Modus. Der faule Modus verpflichtet dazu,
// möglichst viele Nachrichten auf der Festplatte zu speichern,
// um den Einsatz von RAM zu verringern
//
public const string Lazy = "lazy";
}public interface IBinding
{
//
// Der Austausch, der mit der Bindung verbunden ist
//
IExchange Exchange { get; }
//
// Routing-SchlĂŒssel
//
string RoutingKey { get; }
//
// Optionale Argumente
//
IDictionary Arguments { get; }
}public class Binding : IBinding
{
public Binding(
IExchange exchange,
string routingKey,
IDictionary arguments)
{
Exchange = exchange;
RoutingKey = routingKey;
Arguments = arguments;
}
public IExchange Exchange { get; }
public string RoutingKey { get; }
public IDictionary Arguments { get; }
}Quelle: habr.com
