RabbitMQ. Teil 2. Verstehen der Exchanges

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 ein Erlang-Prozess. 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 mnesia. 1.000 Wechselstuben benötigen insgesamt nur 1 MB Arbeitsspeicher.

Inhaltsverzeichnis

  • RabbitMQ. Teil 1. Einführung. Erlang, AMQP und RPC
  • RabbitMQ. Teil 2. Verstehen der Exchanges
  • 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.

RabbitMQ. Teil 2. Verstehen der Exchanges

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

ermittelt.

RabbitMQ. Teil 2. Verstehen der Exchanges

Beginnend mit Version RabbitMQ 2.4.0 wurde der Routing-Algorithmus für den Topic Exchange bis zu 145 doppelt so schnell. Sie erreichten dies durch die Implementierung desTrie-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

RabbitMQ. Teil 2. Verstehen der Exchanges

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 Wechselstube oder , 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 verwenden Wechselstube

Fanout Exchange

Fanout Exchangealle Nachrichten werden in alle Warteschlangen geliefert auch wenn der Routing-Schlüssel in der Nachricht angegeben ist.

Merkmale:

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

ermittelt.

RabbitMQ. Teil 2. Verstehen der Exchanges

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.

RabbitMQ. Teil 2. Verstehen der Exchanges

Merkmale:

  • zusätzliche Flexibilität
  • zusätzliche Rechenkosten. Alle Paare (Schlüssel, Wert) des Attributs Headers mü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 Plugin 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.

RabbitMQ. Teil 2. Verstehen der Exchanges

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.

RabbitMQ. Teil 2. Verstehen der Exchanges

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 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 eindeutig sein
  • type — Typ des Exchanges
  • durable — wenn gesetzt ist, true, dann exchange wird er dauerhaft sein. Er wird auf der Festplatte gespeichert und kann einen Server-/Broker-Neustart überstehen. Wenn der Wert false, dann exchange vorübergehend ist und gelöscht wird, wenn der Server/Broker neu gestartet wird
  • autoDelete — automatisches Löschen. Austausch wird gelöscht, wenn alle damit verbundenen Warteschlangen gelöscht werden
  • arguments — optionale Argumente. Meistens werden über die Argumente alternative 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.

RabbitMQ. Teil 2. Verstehen der Exchanges

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 OperationInterruptedException, 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:

RabbitMQ. Teil 2. Verstehen der Exchanges

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

60GB SSD 8Gb DDR4