Exchange â Austauschstelle oder Wechselpunkt. Nachrichten werden dorthin gesendet. Exchange verteilt die Nachricht in eine oder mehrere Warteschlangen. Er leitet Nachrichten an die Warteschlange auf der Grundlage von erstellten Verbindungen (Bindings) zwischen ihm und der Warteschlange.
Exchange kein . Aus GrĂŒnden der Skalierbarkeit exchange â ist dies eine Zeichenfolge (Link zu einem Modul mit Code, wo die Logik der RoutenfĂŒhrung liegt) in der integrierten Datenbank . 1.000 Austauschstellen verbrauchen insgesamt nur 1 MB Speicher.
Inhaltsverzeichnis
- RabbitMQ. Teil 3. VerstÀndnis von Queues und Bindings
- 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
Direct Exchange
Direct exchange â wird verwendet, wenn es notwendig ist, eine Nachricht an bestimmte Warteschlangen zu liefern.. Die Nachricht wird in der Austauschstelle mit einem bestimmten Routing-SchlĂŒssel veröffentlicht und gelangt in alle Warteschlangen, die mit dieser Austauschstelle ĂŒber den gleichen Routing-SchlĂŒssel verbunden sind. Der Routing-SchlĂŒssel ist eine Zeichenfolge. Die Ăbereinstimmung erfolgt durch PrĂŒfung von Strings auf Ăquivalenz.
Grafische Darstellung des Nachrichtenflusses:

In rabbitmq gibt es das Konzept Standard-Austauschstelle. Dies ist direct exchange ohne Namen. Wenn die Standard-Austauschstelle verwendet wird, wird die Nachricht an eine Warteschlange weitergeleitet, deren Name dem entspricht Routing-SchlĂŒssel der Nachricht.
Topic Exchange
Topic exchange â Ă€hnlich zu direct exchange ermöglicht die selektive Weiterleitung durch den Vergleich des Routing-SchlĂŒssels. In diesem Fall wird der SchlĂŒssel jedoch festgelegt nach einem Muster. Bei der Erstellung eines Musters werden 0 eins oder mehrere Wörter (Buchstaben AZ und az und Zahlen 0-9), getrennt durch Punkte, sowie die Zeichen * und #.
*kann durch genau1Wort#ersetzt werden0oder mehrere Wörter
Grafische Darstellung des Nachrichtenflusses:

Ab Version RabbitMQ 2.4.0 der Routing-Algorithmus fĂŒr topic exchange arbeitet bis zu 145 einmal schneller. Dies wurde erreicht durch die Implementierung des Ansatzes , der die Darstellung von Mustern in Form einer Baumstruktur vorsieht. Zum Beispiel werden die Muster a.b.c, a.*.b.c, a.#.c und b.b.c in der folgenden Struktur dargestellt:

Die MusterĂŒbereinstimmung erfolgt beginnend von der Wurzel und folgt von oben nach unten.
Besonderheiten:
- Die Anwendung dieses Austauschtyps könnte ein gutes Wahl fĂŒr kĂŒnftige Entwicklungen der Anwendung sein, da Muster immer so konfiguriert werden können, dass die Nachricht Ă€hnlich wie eine
direct exchangeoderfanout exchange - mustern, die verwenden
*deutlich schneller., als Muster, die verwenden#. topic exchangelangsamerdirect exchange
Fanout Exchange
Fanout exchange â alle Nachrichten werden an alle Warteschlangen zugestellt selbst wenn im Nachricht der Routing-SchlĂŒssel festgelegt ist.
Besonderheiten:
RabbitMQfunktioniert nicht mit Routing-SchlĂŒsseln und Vorlagen was sich positiv auf die Leistung auswirkt. Dies ist die schnellsteexchange;- alle Verbraucher sollten in der Lage sein, alle Nachrichten zu verarbeiten;
Grafische Darstellung des Nachrichtenflusses:

Headers Exchange
Headers Exchange leitet Nachrichten in verwandte Warteschlangen basierend auf dem Vergleich von Paaren (SchlĂŒssel, Wert) der Eigenschaften headers Bindungen und Ă€hnlichen Eigenschaften der Nachricht. headers stellt dar Dictionary.
Wenn ein spezieller SchlĂŒssel zum Wörterbuch hinzugefĂŒgt wird x-match mit dem Wert any, wird die Nachricht bei teilweisem Ăbereinstimmen der Paare (SchlĂŒssel, Wert) weitergeleitet. Dieses Verhalten entspricht dem Operator oder.
var bindingArguments = new Dictionary();
bindingArguments.add("x-match", "any");StandardmĂ€Ăig enthĂ€lt der SchlĂŒssel x-match den Wert all. Dies bedeutet, dass die Nachricht bei vollstĂ€ndigem Ăbereinstimmen der Paare (SchlĂŒssel, Wert) weitergeleitet wird. Dieses Verhalten entspricht dem Operator und.
Grafische Darstellung des Nachrichtenflusses:

Besonderheiten:
- zusÀtzliche FlexibilitÀt
- zusĂ€tzliche Rechenaufwendungen. Alle Paare (SchlĂŒssel, Wert) des Attributs
headersmĂŒssen vor der Berechnung der Routing-Werte der Nachricht nach dem SchlĂŒssel sortiert werden. Langsamer als andere Arten von Exchanges.
Consistent-Hashing Exchange
Dieser Exchange ist und nicht eingebaut in RabbitMQ.
Consistent-Hashing Exchange (Exchange mit vereinbartem Hashing) â wird verwendet, wenn es mehrere Warteschlangen gibt, die potenzielle EmpfĂ€nger der Nachricht sind und die Last zwischen ihnen ausgeglichen werden muss. Die Verbindung der Nachricht zur Warteschlange erfolgt nach Gewicht (ein bedingter Stringwert von 0 - n).
Das Ă€quivalente Gewicht der Warteschlangen â bedeutet, dass jede Warteschlange ungefĂ€hr die gleiche Anzahl von Nachrichten erhalten wird (jede Nachricht wird nur in einer Warteschlange platziert). Es gibt keine vollstĂ€ndige Garantie fĂŒr eine gleichmĂ€Ăige Verteilung der Nachrichten..
Grafische Darstellung des Nachrichtenflusses:

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 verwendet oder headers.
Soll helfen, wenn die Durchsatzrate des Verbrauchers höher gesteigert werden muss als die Lösung mit mehreren Verbrauchern, die eine Warteschlange verwenden.
Kombination von Exchanges (E2E)
Das Verhalten aller Exchanges kann durch Verbindungen kombiniert werden. Exchange-to-Exchange (Die Kombination von Exchanges ist nicht Teil der Spezifikation) AMQP. Diese Erweiterung des Protokolls auf der Serverseite RabbitMQ).
Grafische Darstellung des Nachrichtenflusses:

Durch E2E können wir die richtige skalierbare Konfiguration finden, die sowohl aktuellen als auch wachsenden Anforderungen gerecht wird.
Exchange erstellen
Die Erstellung eines Exchanges erfolgt mithilfe des synchronen RPC Anruf an den Server. Der Aufruf erfolgt ĂŒber die Methode Exchange.Declare, die mit den folgenden 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 einzigartig seintypeâ Typ des Exchangesdurableâ wenn gesetzttrue, dannexchangewird dauerhaft sein. Er wird auf der Festplatte gespeichert und kann einen Neustart des Servers/Brokers ĂŒberstehen. Wenn der Wertfalse, dannexchangevorĂŒbergehend ist, wird er gelöscht, wenn der Server/Broker neu gestartet wird.autoDeleteâ automatische Löschung.Exchangewird gelöscht, wenn alle damit verbundenen Warteschlangen gelöscht werden.Argumenteâ optionale Argumente. HĂ€ufig werden ĂŒber die Argumentealternative exchange(alternativer Exchange). Wenn die Nachricht den ursprĂŒnglichen Weg nicht nehmen kann, kann sie an den alternativen Exchange gesendet werden, um ĂŒber einen anderen Weg geroutet zu werden.

Wenn die Erstellung exchange möglich, sendet der Server eine synchrone RPC Antwort Exchange.DeclareOk. Wenn die Erstellung nicht erstellt werden kann (Fehler beim Anforderungsauftrag Exchange.Declare), dann wird der Kanal vom Server mit dem Befehl vom Server mittels eines asynchronen Befehls erfolgt. geschlossen und der Client erhÀlt eine Ausnahme OperationInterruptedException Ein erneuter Aufruf
Der Exchange muss erstellt werden, bevor Nachrichten veröffentlicht werden. Wenn Sie eine Nachricht in einen nicht existierenden Exchange veröffentlichen â RabbitMQ wird sie stillschweigend gelöscht.
Exchange ĂŒber die grafische BenutzeroberflĂ€che erstellen
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 Austausche und klicken auf Neuen Exchange hinzufĂŒgen. Wir fĂŒllen die Eigenschaften aus:

Der GroĂteil der Eigenschaften wurde bereits oben beschrieben. Hier sei angemerkt, dass, wenn Sie Internal, der Exchange nur fĂŒr E2E. Producer nicht in der Lage sein wird, Nachrichten an diesen Exchange zu senden.
Fazit
Bei der Entwicklung des Systems ist es praktisch, die Topologie mit Hilfe eines Graphen zu beschreiben. Bevor Sie jedoch mit dem Aufbau des Graphen beginnen, sollten Sie die Wege mit hohem Datenverkehr hervorheben, da diese eine höhere Bandbreite (Leistung) erfordern. Danach kann der Datenverkehr klassifiziert werden. Und erst dann kann mit dem Aufbau begonnen werden.
Wenn im aufgebauten Graphen eine endliche Menge von Routing-SchlĂŒsseln existiert, sollten Sie sich nach mehreren umsehen, fanout exchange, die 1:1 mit dem Routing-SchlĂŒssel verbunden sind. Denken Sie daran, dass fanout exchange der schnellste ist.
Wenn die Anzahl der Routen gegen unendlich strebt,, sollten Sie auf topic exchange oder, wenn das Muster nicht benötigt wird, können Sie auswÀhlen direct exchange,da dieser schneller ist. topic exchange.
Kombinationen verschiedener exchange sollten helfen, die richtige zu finden. skalierbare Konfiguration, die sowohl den aktuellen als auch den wachsenden Anforderungen des Systems gerecht wird.
Anzahl exchange und die Anzahl der Warteschlangen im Vergleich zur Anzahl der Routen minimal sein sollte.
Im nÀchsten Artikel werden wir uns eingehender mit Queues und Bindings befassen.
Links
Quelle: habr.com
