RabbitMQ. Teil 2. VerstÀndnis der Exchanges

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 Erlang-Prozess. 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 mnesia. 1.000 Austauschstellen verbrauchen insgesamt nur 1 MB Speicher.

Inhaltsverzeichnis

  • RabbitMQ. Teil 1. EinfĂŒhrung. Erlang, AMQP und RPC
  • RabbitMQ. Teil 2. VerstĂ€ndnis der Exchanges
  • 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:

RabbitMQ. Teil 2. VerstÀndnis der Exchanges

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 genau 1 Wort
  • # ersetzt werden 0 oder mehrere Wörter

Grafische Darstellung des Nachrichtenflusses:

RabbitMQ. Teil 2. VerstÀndnis der Exchanges

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 trie implementation, 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:

RabbitMQ. Teil 2. VerstÀndnis der Exchanges

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 exchange oder fanout exchange
  • mustern, die verwenden * deutlich schneller., als Muster, die verwenden #.
  • topic exchange langsamer direct exchange

Fanout Exchange

Fanout exchange – alle Nachrichten werden an alle Warteschlangen zugestellt selbst wenn im Nachricht der Routing-SchlĂŒssel festgelegt ist.

Besonderheiten:

  • RabbitMQ funktioniert nicht mit Routing-SchlĂŒsseln und Vorlagen was sich positiv auf die Leistung auswirkt. Dies ist die schnellste exchange;
  • alle Verbraucher sollten in der Lage sein, alle Nachrichten zu verarbeiten;

Grafische Darstellung des Nachrichtenflusses:

RabbitMQ. Teil 2. VerstÀndnis der Exchanges

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:

RabbitMQ. Teil 2. VerstÀndnis der Exchanges

Besonderheiten:

  • zusĂ€tzliche FlexibilitĂ€t
  • zusĂ€tzliche Rechenaufwendungen. Alle Paare (SchlĂŒssel, Wert) des Attributs headers mĂŒ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 ein Plugin 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:

RabbitMQ. Teil 2. VerstÀndnis der Exchanges

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:

RabbitMQ. Teil 2. VerstÀndnis der Exchanges

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 RabbitMQ.Client:

//...
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 sein
  • type — Typ des Exchanges
  • durable — wenn gesetzt true, dann exchange wird dauerhaft sein. Er wird auf der Festplatte gespeichert und kann einen Neustart des Servers/Brokers ĂŒberstehen. Wenn der Wert false, dann exchange vorĂŒbergehend ist, wird er gelöscht, wenn der Server/Broker neu gestartet wird.
  • autoDelete — automatische Löschung. Exchange wird gelöscht, wenn alle damit verbundenen Warteschlangen gelöscht werden.
  • Argumente — optionale Argumente. HĂ€ufig werden ĂŒber die Argumente alternative 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.

RabbitMQ. Teil 2. VerstÀndnis der Exchanges

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 , die einen Fehlercode und eine Beschreibung enthalten wird.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:

RabbitMQ. Teil 2. VerstÀndnis der Exchanges

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 der Routing 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

ZuverlĂ€ssiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen đŸ”„ ZuverlĂ€ssiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster