Austausch — Wechselstube oder Wechselpunkt. Nachrichten werden dorthin gesendet. Austausch verteilt die Nachricht in eine oder mehrere Warteschlangen. Er leitet Nachrichten anhand von erstellten Verbindungen ( BindingBindings) zwischen ihm und der Warteschlange.
Austausch ist nicht . Aus Gründen der Skalierbarkeit exchange — dies ist ein String (Verweis auf das Modul mit dem Code, wo die Routing-Logik liegt) in der eingebetteten Datenbank . 1.000 Wechselstuben benötigen insgesamt nur 1 MB Arbeitsspeicher.
Inhaltsverzeichnis
- RabbitMQ. Teil 3. Wir beschäftigen uns mit Queues und Bindings
- 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
Direkter Austausch
Direct Exchange — wird verwendet, wenn es nötig ist, eine Nachricht an bestimmte Warteschlangen zuzustellen. Die Nachricht wird in der Wechselstube mit einem bestimmten Routing-Schlüssel veröffentlicht und gelangt in alle Warteschlangen, die mit dieser Wechselstube über einen ähnlichen Routing-Schlüssel verbunden sind. Der Routing-Schlüssel ist ein String. Die Übereinstimmung wird durch Überprüfung der Strings auf Gleichheit.
ermittelt.

Im Grafische Darstellung des Nachrichtenflusses: rabbitmq gibt es das Konzept. Es ist Wechselstube ohne Namen. Wenn eine Standardwechselstube verwendet wird, wird die Nachricht an die Warteschlange mit dem Namen weitergeleitet, der dem Routing-Schlüssel der Nachricht entspricht..
Themenwechsel
Topic Exchange – ähnlich Wechselstube ermöglicht selektives Routing durch Vergleich des Routing-Schlüssels. In diesem Fall wird der Schlüssel jedoch nach einem Muster. Bei der Erstellung eines Musters werden 0 ein oder mehrere Wörter (Buchstaben AZ und az und Ziffern 0-9), getrennt durch einen Punkt, sowie die Zeichen * und #.
*— können jeweils ersetzt werden durch genau1Wort#— können ersetzt werden durch0ein oder mehrere Wörter
ermittelt.

Beginnend mit Version RabbitMQ 2.4.0 wurde der Routing-Algorithmus für den Topic Exchange bis zu 145 doppelt so schnell. Trie-Implementierung , die die Darstellung der Muster als Baumstruktur vorsieht. Beispielsweise werden die Muster, a.b.c, a.*.b.c und a.#.c b.b.c

so dargestellt:
Merkmale:
- Die Übereinstimmung mit dem Muster erfolgt von der Wurzel aus und folgt von oben nach unten. Die Verwendung dieser Wechselstube kann einegute Wahl für die mögliche zukünftige Entwicklung der Anwendung sein
Wechselstubeoder, da Muster stets so konfiguriert werden können, dass die Nachricht analog zu - Fanout Exchange
*viel schnellerMuster, die verwenden#. den Topic Exchange, als Muster, die verwendenWechselstube
Fanout Exchange
Fanout Exchange – alle Nachrichten werden in alle Warteschlangen geliefert auch wenn der Routing-Schlüssel in der Nachricht angegeben ist.
Merkmale:
RabbitMQfunktioniert nicht mit Routing-Schlüsseln und Mustern. was sich positiv auf die Leistung auswirkt. Dies ist der schnellsteexchange;- alle Verbraucher sollten in der Lage sein, alle Nachrichten zu verarbeiten;
ermittelt.

Headers Exchange
Headers exchange leitet Nachrichten an verbundene Warteschlangen basierend auf dem Vergleich von Paaren (Schlüssel, Wert) von Eigenschaften weiter Headers Bindings und ähnlichen Eigenschaften der Nachricht. Headers stellt dar Dictionary.
Wenn man dem Wörterbuch einen speziellen Schlüssel hinzufügt x-match mit dem Wert any, wird die Nachricht bei teilweiser Übereinstimmung der Paare (Schlüssel, Wert) weitergeleitet. Dieses Verhalten entspricht dem Operator or.
var bindingArguments = new Dictinary();
bindingArguments.add("x-match", "any");Standardmäßig enthält der Schlüssel x-match den Wert all. Das bedeutet, dass die Nachricht bei vollständiger Übereinstimmung der Paare (Schlüssel, Wert) weitergeleitet wird. Dieses Verhalten entspricht dem Operator and.
ermittelt.

Merkmale:
- zusätzliche Flexibilität
- zusätzliche Rechenkosten. Alle Paare (Schlüssel, Wert) des Attributs
Headersmüssen vor der Berechnung der Werte für die Nachrichtenweiterleitung nach Schlüsseln sortiert werden. Langsamer als andere Arten von Exchanges.
Consistent-Hashing Exchange
Dieser Exchange ist ein und nicht eingebaut in RabbitMQ.
Consistent-hashing exchange (Exchange mit konsistentem Hashing) – wird verwendet, wenn es mehrere Warteschlangen gibt, die potenzielle Empfänger der Nachricht sind, und wenn die Last zwischen ihnen ausgewogen werden soll. Die Zuordnung der Nachricht zur Warteschlange erfolgt nach Gewicht (ein bedingter stringwert von 0 - n).
Das äquivalente Gewicht der Warteschlangen bedeutet, dass in jede Warteschlange ungefähr die gleiche Anzahl von Nachrichten kommen wird (jede Nachricht wird nur in eine Warteschlange gelegt). Es gibt keine vollständige Garantie für eine gleichmäßige Verteilung der Nachrichten..
ermittelt.

Der Hash wird basierend auf dem Routing-Schlüssel oder der Eigenschaft Headers der Nachricht berechnet. Wenn alle veröffentlichten Nachrichten unterschiedliche Routing-Schlüssel hatten oder Headers, erfolgt die Verteilung nach Gewicht. Andernfalls wird der Routing-Schlüssel oder Headers.
Es sollte helfen, wenn die Bandbreite des Verbrauchers stärker gesteigert werden muss, als es bei mehreren Verbrauchern der Fall wäre, die eine Warteschlange verwenden.
Kombination von Exchanges (E2E)
Das Verhalten aller Exchanges kann über Exchange-to-Exchange (Kombination von Exchanges ist nicht in der Spezifikation enthalten ), das einen offenen Standard für den Austausch von Geschäftsnachrichten zwischen Anwendungen oder Organisationen darstellt.. Dies ist eine Erweiterung des Protokolls von RabbitMQ).
ermittelt.

Durch E2E Wir können die richtige skalierbare Konfiguration finden, die sowohl aktuellen als auch wachsenden Anforderungen entspricht.
Exchange erstellen
Die Erstellung eines Exchanges erfolgt durch einen synchronen RPC Anruf an den Server. Die Anfrage erfolgt mit der Methode Exchange.Declare, die mit den Parametern aufgerufen wird:
- Name des Exchanges
- Typ des Exchanges
- weitere Parameter
Beispiel für die Erstellung exchange mit Hilfe von :
//...
channel.ExchangeDeclare(
exchange: "my_exchange",
type: "direct",
durable: "false",
autoDelete: "false",
arguments: null
);
//...exchange— der Name des Exchanges, den wir erstellen möchten. Der Name muss eindeutig seintype— Typ des Exchangesdurable— wenn gesetzt ist,true, dannexchangewird er dauerhaft sein. Er wird auf der Festplatte gespeichert und kann einen Server-/Broker-Neustart überstehen. Wenn der Wertfalse, dannexchangevorübergehend ist und gelöscht wird, wenn der Server/Broker neu gestartet wirdautoDelete— automatisches Löschen.Austauschwird gelöscht, wenn alle damit verbundenen Warteschlangen gelöscht werdenarguments— optionale Argumente. Meistens werden über die Argumentealternative exchange(alternativer Exchange). Wenn eine Nachricht den ursprünglichen Pfad nicht durchlaufen kann, kann sie an den alternativen Exchange zur Umleitung auf einem anderen Pfad gesendet werden.

Wenn die Erstellung exchange es könnte, dann wird der Server dem Client eine synchrone RPC Antwort Exchange.DeclareOk. Wenn die Erstellung nicht möglich ist (Die Anfrage wurde abgelehnt Exchange.Declare), dann wird der Kanal vom Server mit einem asynchronen Befehl Channel.Close geschlossen und der Client erhält eine Ausnahme , die den Fehlercode und die Beschreibung enthält.
Der Exchange muss vor dem Veröffentlichen von Nachrichten erstellt werden. Wenn Sie eine Nachricht in einen nicht existierenden Exchange veröffentlichen möchten — RabbitMQ wird er stillschweigend gelöscht.
Exchange über die grafische Benutzeroberfläche erstellen
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 Exchanges gehen und auf Neuen Exchange hinzufügen. Eigenschaften ausfüllen:

Die meisten Eigenschaften wurden oben beschrieben. Hier sei erwähnt, dass wenn Sie Internal, dann kann der Exchange nur für E2E. Producer kann keine Nachrichten an einen solchen Exchange senden.
Fazit
Beim Entwerfen eines Systems ist es hilfreich, die Topologie mithilfe eines Graphen zu beschreiben. Aber bevor Sie beginnen, einen Graphen zu erstellen, sollten Sie die Pfade mit hohem Datenverkehr hervorheben, da diese eine höhere Bandbreite benötigen. (Leistung). Danach kann der Datenverkehr klassifiziert werden. Und erst dann kann mit dem Aufbau begonnen werden.
Wenn im erstellten Diagramm eine endliche Menge von Routing-Schlüsseln existiert, lohnt es sich, in Richtung mehrerer , da Muster stets so konfiguriert werden können, dass die Nachricht analog zu, die 1:1 mit dem Routing-Schlüssel verbunden sind, zu schauen. Denken Sie daran, dass , da Muster stets so konfiguriert werden können, dass die Nachricht analog zu es der schnellste ist.
Wenn die Anzahl der Routen gegen unendlich strebt, sollte man auf den Topic Exchange oder, wenn die Vorlage nicht benötigt wird, direkt wählen. direct exchange, da er schneller ist. den Topic Exchange.
Kombinationen verschiedener exchange sollte helfen, die richtige skalierbare Konfiguration, die sowohl den aktuellen als auch den wachsenden Anforderungen des Systems entspricht, zu finden.
Die Anzahl exchange und Warteschlangen sollte im Vergleich zur Anzahl der Routen minimal sein.
Im nächsten Artikel werden wir uns näher mit Warteschlangen und Bindungen beschäftigen.
Links
Quelle: habr.com
