RabbitMQ. Teil 2. Austausch verstehen

Exchange - Austauscher oder Austauschpunkt. An ihn werden Nachrichten gesendet. Exchange verbreitet die Nachricht in einer oder mehreren Warteschlangen. Er leitet Nachrichten an eine Warteschlange weiter basierend auf erstellten Links (bindings) zwischen ihm und der Warteschlange.

Exchange nicht Erlang-Prozess. Aus Gründen der Skalierbarkeit exchange ist eine Zeichenfolge (ein Link zum Modul mit dem Code, in dem sich die Routing-Logik befindet) in der eingebetteten Datenbank Gedächtnisleistung. 1 Austauscher verbrauchen nur 1 MB Speicher.

Inhaltsverzeichnis

  • RabbitMQ. Teil 1. Einführung. Erlang, AMQP und RPC
  • RabbitMQ. Teil 2. Austausch verstehen
  • RabbitMQ. Teil 3. Warteschlangen und Bindungen verstehen
  • RabbitMQ. Teil 4. Umgang mit Nachrichten und Frames
  • RabbitMQ. Teil 5: Nachrichtenleistung beim Veröffentlichen und Konsumieren
  • RabbitMQ. Teil 6. Überblick über die Federation- und Shovel-Module
  • RabbitMQ. Teil 7. Details zu Connection und Chanel
  • RabbitMQ. Teil 8. RabbitMQ in .NET
  • RabbitMQ. Teil 9. Überwachung

Direkter Austausch

Direct exchange - Wird bei Bedarf verwendet Eine Nachricht an bestimmte Warteschlangen übermitteln. Die Nachricht wird mit einer bestimmten Nachricht an den Exchanger veröffentlicht Routing-Schlüssel und gelangt in alle Warteschlangen, die diesem Exchanger mit einem ähnlichen Routing-Schlüssel zugeordnet sind. Der Routing-Schlüssel ist eine Zeichenfolge. Der Abgleich erfolgt mit Strings auf Gleichheit prüfen.

Grafische Darstellung des Nachrichtenflusses:

RabbitMQ. Teil 2. Austausch verstehen

В rabbitmq Es gibt ein Konzept Standardaustauscher. Es direct exchange namenlos. Wenn der Standard-Exchanger verwendet wird, wird die Nachricht an eine Warteschlange mit dem Namen weitergeleitet Nachrichtenrouting-Schlüssel.

Themenaustausch

Topic exchange - ähnlich direct exchange ermöglicht selektives Routing durch Vergleich des Routing-Schlüssels. Aber in diesem Fall ist der Schlüssel gegeben nach Vorlage. Verwenden Sie beim Erstellen einer Vorlage 0 oder mehr Wörter (Buchstaben AZ и az und Zahlen 0-9), getrennt durch einen Punkt, sowie Symbole * и #.

  • * - kann durch genau ersetzt werden 1 слово
  • # - kann ersetzt werden durch 0 oder mehr Wörter

Grafische Darstellung des Nachrichtenflusses:

RabbitMQ. Teil 2. Austausch verstehen

Ab Version RabbitMQ 2.4.0 Routing-Algorithmus für topic exchange begann zu arbeiten, bis 145 mal schneller. Dies gelang ihnen durch die Umsetzung des Ansatzes Implementierung ausprobieren, was die Darstellung von Vorlagen als Baumstruktur impliziert. Zum Beispiel Vorlagen a.b.c, a.*.b.c, a.#.c и b.b.c wird durch die folgende Struktur dargestellt:

RabbitMQ. Teil 2. Austausch verstehen

Die Suche nach Musterübereinstimmungen beginnt an der Wurzel und verläuft von oben nach unten.

Features:

  • Die Verwendung dieses Austauschers kann erfolgen eine gute Wahl für eine mögliche zukünftige App-Entwicklung, Weil Vorlagen können jederzeit angepasst werden, sodass die Nachricht auf ähnliche Weise veröffentlicht wird direct exchange oder fanout exchange
  • Vorlagen, die verwendet werden * viel schnellerals Vorlagen, die verwenden #.
  • topic exchange langsamer direct exchange

Fanout-Austausch

Fanout exchange - Alle Nachrichten werden an alle Warteschlangen zugestellt auch wenn in der Nachricht ein Routing-Schlüssel angegeben ist.

Features:

  • RabbitMQ funktioniert nicht mit Routingschlüsseln und Vorlagen was sich positiv auf die Leistung auswirkt. Das ist am schnellsten exchange;
  • alle Verbraucher müssen in der Lage sein, alle Nachrichten zu verarbeiten;

Grafische Darstellung des Nachrichtenflusses:

RabbitMQ. Teil 2. Austausch verstehen

Header-Austausch

Headers exchange – leitet Nachrichten basierend auf einem Vergleich von Paaren von (Schlüssel-, Wert-)Eigenschaften an verwandte Warteschlangen weiter headers Bindung und ähnliche Nachrichteneigenschaften. headers Es stellt Dictionary<ключ, значение>.

Wenn Sie dem Wörterbuch einen Sonderschlüssel hinzufügen x-match mit Bedeutung any, dann wird die Nachricht weitergeleitet, wenn die Paare (Schlüssel, Wert) teilweise übereinstimmen. Dieses Verhalten ähnelt dem des Operators or.

var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");

Standardschlüssel x-match enthält einen Wert all. Dies bedeutet, dass die Nachricht weitergeleitet wird, wenn die Paare (Schlüssel, Wert) vollständig übereinstimmen. Dieses Verhalten ähnelt dem des Operators and.

Grafische Darstellung des Nachrichtenflusses:

RabbitMQ. Teil 2. Austausch verstehen

Features:

  • zusätzliche Flexibilität
  • zusätzlicher Rechenaufwand. Alle Paare (Schlüssel, Wert) des Attributs headers müssen nach Schlüsselnamen sortiert werden, bevor die Nachrichtenroutingwerte berechnet werden. Langsamer als andere Austauscharten.

Konsistenter Hashing-Austausch

Dieser Austauscher ist Plugin и nicht eingebaut в RabbitMQ.

Consistent-hashing exchange (Hash-konsistenter Austausch) – wird verwendet, wenn es mehrere Warteschlangen gibt, die potenzielle Empfänger einer Nachricht sind, und wenn Sie einen Lastausgleich zwischen ihnen benötigen. Die Nachricht wird der Warteschlange nach Gewicht zugeordnet (ein bedingter Zeichenfolgenwert von). 0 - n).

Äquivalentes Gewicht der Warteschlangen – gibt an, dass jede Warteschlange erhält etwa die gleiche Menge Nachrichten (jede Nachricht wird nur in eine Warteschlange gestellt). Es gibt keine vollständige Garantie für die gleichmäßige Verteilung von Nachrichten.

Grafische Darstellung des Nachrichtenflusses:

RabbitMQ. Teil 2. Austausch verstehen

Hash wird basierend auf dem Routing-Schlüssel oder der Eigenschaft berechnet headers Mitteilungen. Wenn alle veröffentlichten Nachrichten unterschiedliche Routing-Schlüssel hatten, oder headers, dann erfolgt die Verteilung nach Gewicht. Andernfalls wird der Routing-Schlüssel verwendet, oder headers.

Sollte hilfreich sein, wenn der Verbraucherdurchsatz höher wachsen muss als eine Lösung, bei der mehrere Verbraucher dieselbe Warteschlange verwenden.

Kombination von Wärmetauschern (E2E)

Das Verhalten aller Austauscher kann durch Kommunikation kombiniert werden Von Börse zu Börse (Kombination von Wärmetauschern ist nicht in der Spezifikation enthalten AMQP. Dies ist eine Protokollerweiterung von der Seite RabbitMQ).

Grafische Darstellung des Nachrichtenflusses:

RabbitMQ. Teil 2. Austausch verstehen

Auf Kosten der E2E Wir finden die richtige skalierbare Konfiguration, die sowohl aktuellen als auch wachsenden Anforderungen gerecht wird.

Erstellen Sie eine Börse

Der Austauscher wird synchron erstellt RPC Anfrage an den Server. Die Anfrage erfolgt über die Methode Exchange.Declareaufgerufen mit Parametern:

  • Name des Tauschers
  • Wärmetauschertyp
  • andere Optionen

Schöpfungsbeispiel exchange mittels RabbitMQ.Client:

//...
channel.ExchangeDeclare(
    exchange: "my_exchange",
    type: "direct",
    durable: "false",
    autoDelete: "false",
    arguments: null
);
//...

  • exchange - der Name des Austauschers, den wir erstellen möchten. Der Name muss eindeutig sein
  • type - Art des Wärmetauschers
  • durable - falls installiert truedann exchange wird dauerhaft sein. Es wird auf der Festplatte gespeichert und kann einen Server-/Broker-Neustart überstehen. Wenn der Wert falsedann exchange ist temporär und wird entfernt, wenn der Server/Broker neu gestartet wird
  • autoDelete - Automatisches Löschen. Exchange wird gelöscht, wenn alle zugehörigen Warteschlangen gelöscht werden
  • arguments sind optionale Argumente. Meistens durch die festgelegten Argumente alternative exchange (alternativer Wärmetauscher). Wenn eine Nachricht nicht über die ursprüngliche Route weitergeleitet werden kann, kann sie an eine alternative Vermittlungsstelle gesendet werden, um über einen anderen Pfad weitergeleitet zu werden.

RabbitMQ. Teil 2. Austausch verstehen

Wenn Schöpfung exchange vielleicht, dann sendet der Server dem Client eine synchrone Nachricht RPC beantworten Exchange.DeclareOk. Wenn Schöpfung unmöglich (Der Antrag wurde abgelehnt Exchange.Declare), Das Der Kanal wird geschlossen Server mithilfe eines asynchronen Befehls Channel.Close und der Client erhält eine Ausnahme OperationInterruptedException, das den Fehlercode und seine Beschreibung enthält.

Vor dem Posten muss ein Exchanger erstellt werden. Wenn Sie eine Nachricht an einen nicht existierenden Austauscher veröffentlichen - RabbitMQ Entfernen Sie es stillschweigend.

Erstellen Sie eine Exchange-GUI

Gehen Sie zum Admin-Panel RabbitMQ unter Benutzer guest (Nutzername: guest und Passwort: guest). Bitte beachten Sie, dass der Benutzer guest kann nur von localhost aus eine Verbindung herstellen. Gehen wir nun zur Registerkarte Exchanges und klicken Sie auf Add a new exchange. Füllen Sie die Eigenschaften aus:

RabbitMQ. Teil 2. Austausch verstehen

Die meisten Eigenschaften wurden oben beschrieben. Hier stellen wir fest, dass wenn wir festlegen Internal, dann kann der Austausch nur für genutzt werden E2E. Producer wird nicht in der Lage sein, Nachrichten an eine solche Börse zu senden.

Abschluss

Bei der Entwicklung eines Systems ist es zweckmäßig, die Topologie zu beschreiben Routing mithilfe einer Grafik. Bevor Sie jedoch mit der Erstellung eines Diagramms beginnen, lohnt es sich, die Wege mit hohem Verkehrsaufkommen hervorzuheben, denn. Sie benötigen höherer Durchsatz (Leistung). Als nächstes können Sie den Verkehr klassifizieren. Und dann mit dem Bauen beginnen.

Wenn im konstruierten Diagramm vorhanden ist endliche Menge Es lohnt sich also, nach mehreren Routing-Schlüsseln zu suchen fanout exchange, die 1:1 auf den Routing-Schlüssel bezogen sind. Erinnere dich daran fanout exchange der schnellste.

Wenn die Anzahl der Routen tendiert zur Unendlichkeit, es lohnt sich, darauf zu achten topic exchange Wenn die Vorlage nicht benötigt wird, können Sie sie auch auswählen direct exchnge, Weil er ist schneller topic exchange.

Kombinationen verschiedener exchange soll Ihnen dabei helfen, das Richtige zu finden. skalierbare Konfiguration, das sowohl aktuelle als auch wachsende Systemanforderungen erfüllt.

Anzahl exchange und Warteschlangen sollten im Vergleich zur Anzahl der Routen minimal sein.

Im nächsten Artikel werden wir beginnen, mehr über Warteschlangen und Bindungen zu verstehen.

Referenzen

Source: habr.com

Kommentar hinzufügen