Wir werden uns heute ansehen, wie Sie die Ladezeiten Ihrer Webseiten verkürzen können, indem Sie rechenintensive Prozesse asynchron abwickeln. Dies ist dank RabbitMQ sehr einfach zu handhaben.
Die Stabilität und Performance einer Anwendung oder Website sind entscheidende Faktoren für die Benutzererfahrung. Wer hat nicht schon einmal eine Seite verlassen, bevor sie überhaupt geladen war, weil es einfach zu lange dauerte?
Was ist RabbitMQ?
RabbitMQ ist ein Open-Source-Nachrichtenbroker, der verteilt und skalierbar ist. Er fungiert als Vermittler für die effiziente Kommunikation zwischen Produzenten und Konsumenten von Nachrichten.
RabbitMQ setzt das AMQP-Protokoll (Advanced Message Queuing Protocol) ein, welches die asynchrone Übermittlung von Nachrichten mit einer Zustellgarantie fokussiert. Diese wird durch Empfangsbestätigungen der Nachrichten vom Broker an den Produzenten und von den Konsumenten an den Broker sichergestellt.
Wie funktioniert RabbitMQ?
Vereinfacht gesagt definiert RabbitMQ Warteschlangen, in denen Nachrichten von Produzenten gespeichert werden. Diese Nachrichten bleiben dort, bis konsumierende Anwendungen sie abrufen und verarbeiten. Das ermöglicht uns, verteilte Systeme zu entwerfen, in denen ein System in unabhängige Module aufgeteilt ist, die über Nachrichten miteinander kommunizieren.
Wie bei jeder Kommunikation benötigen wir einen Produzenten, eine Nachricht und einen Empfänger. RabbitMQ fungiert als zentraler Knotenpunkt, an dem die Nachricht auf den Empfänger wartet.
Um die Funktionsweise besser zu verstehen, betrachten wir die verschiedenen Austauschtypen, die den Nachrichtenaustausch repräsentieren.
Austauschtypen
Wenn wir über einen Exchange eine Nachricht mit RabbitMQ versenden, senden wir diese nicht direkt an eine Warteschlange. Stattdessen wird die Nachricht an eine Vermittlungsstelle übermittelt, die für die Weiterleitung an die verschiedenen Warteschlangen zuständig ist.
Bildquelle: CloudAQMP
Die Austauschtypen sind Direct, Fanout, Topic und Headers.
Direkter Austausch
Nehmen wir an, ein Produzent muss eine Kaufbestätigungsnachricht an drei Konsumenten senden. Das bedeutet, dass das System mit drei unterschiedlichen Systemen kommunizieren muss, um den Kauf abzuwickeln.
Da RabbitMQ die Nachricht separat an jede Warteschlange senden kann, besteht die Möglichkeit, diese anderen Systeme die Nachricht direkt empfangen zu lassen.
Normalerweise leitet die Vermittlungsstelle Nachrichten an alle Warteschlangen weiter, aber oft möchten wir nicht, dass Nachrichten an jede Warteschlange gesendet werden. Daher gibt es mehrere Bedingungen, die wir anwenden können, damit ein Austausch gezielt funktioniert.
Auf diese Weise können Sie Ihre Nachrichten an nur einen bestimmten Konsumenten senden lassen, anstatt an alle.
Bindungsschlüssel: Um eine Warteschlange mit einem Austausch zu verbinden, benötigen wir eine Bindung, also eine Beziehung zwischen einer Warteschlange und einem Exchange. Diese fungiert wie ein Konnektor.
Routing-Schlüssel: Innerhalb dieser Bindung können wir einen Routing-Schlüssel definieren, der als Schlüssel für die Weiterleitung unserer Nachrichten an eine bestimmte Warteschlange fungiert.
Wenn Sie beispielsweise die Routing-Schlüssel X, Y und Z haben, wird eine Nachricht mit dem Routing-Schlüssel Y über die Warteschlange Y an den Konsumenten geliefert, der für den Empfang dieser Nachrichten definiert ist.
Auf diese Weise können wir mehrere Warteschlangen mit einem Exchange verbinden, die über unterschiedliche Beziehungen zueinander stehen, indem sie Routing-Schlüssel verwenden.
Fanout-Austausch
Wird eine Nachricht an den Fanout Exchange gesendet, wird sie an alle damit verbundenen Warteschlangen weitergeleitet. Wenn Sie also 10 Warteschlangen mit einem Fanout Exchange verbunden haben, erhalten alle diese Warteschlangen die gesendete Nachricht.
Themenaustausch
Der Themenaustausch ist einer der flexibelsten Austauschtypen, da er uns ermöglicht, Nachrichten nach Thema zu versenden. Je nachdem, wie Sie die Routing-Schlüssel benennen, können komplexe Muster von Regeln und Beziehungen zwischen Systemen erstellt werden.
Beispielsweise können Routing-Schlüssel wie (x.*), (*.z) oder (*.y.*) verwendet werden.
Was ist AMQP in RabbitMQ?
AMQP (Advanced Message Queuing Protocol) ist ein offenes Messaging-Protokoll, das den Transport von Nachrichten zwischen verschiedenen Anwendungen standardisiert. Es ähnelt HTTP und TCP, ist jedoch ein Protokoll auf Leitungsebene mit asynchronem Transport.
RabbitMQ verwendet AMQP aus mehreren Gründen. Erstens ist AMQP ein Standard für Middleware, im Gegensatz zu JMS, das eine API definiert.
Diese AMQP-Spezifikation wurde von einem internationalen Konsortium von Unternehmen wie Red Hat, Cisco Systems und Microsoft erstellt. Zudem gewährleistet die Interoperabilität dieses Protokolls, dass jede Anwendung, die AMQP implementiert, mit einem AMQP-Broker kommunizieren kann.
AMQP ist nicht das einzige von RabbitMQ unterstützte Protokoll. Die folgende Abbildung zeigt alle Protokolle, Sprachen und APIs, die von RabbitMQ unterstützt werden.
Herausragende Eigenschaften von RabbitMQ
Neben der Möglichkeit, verschiedene Anwendungen asynchron und standortübergreifend über Nachrichten zu integrieren, bietet RabbitMQ eine Reihe weiterer Vorteile, die es in der Welt der Messaging Broker sehr beliebt gemacht haben:
Zuverlässige Speicherung
RabbitMQ verfügt über mehrere Mechanismen, die eine sichere Nachrichtenübermittlung garantieren. Dazu gehört die Speicherung von Nachrichten, wenn keine Konsumenten verfügbar sind. Die Konsumenten können die Zustellung der Nachricht bestätigen, um sicherzustellen, dass sie erfolgreich verarbeitet wurde.
Wenn die Verarbeitung fehlschlägt, ermöglicht RabbitMQ, dass die Nachricht erneut in die Warteschlange gestellt wird und von einer anderen Instanz des Konsumenten oder vom ursprünglich fehlerhaften Konsumenten, sobald dieser wieder verfügbar ist, verarbeitet wird.
RabbitMQ garantiert auch die Reihenfolge der Nachrichtenzustellung. Das bedeutet, dass Nachrichten in der Reihenfolge konsumiert werden, in der sie in den RabbitMQ Warteschlangen ankommen.
Clusterbildung
RabbitMQ bietet zwar schon hervorragende Leistung bei der Verarbeitung von Tausenden Nachrichten pro Sekunde, ist aber dennoch in der Lage, mit größeren Nachrichtenmengen umzugehen, ohne die Anwendungsleistung zu beeinträchtigen.
Dazu bietet RabbitMQ die Möglichkeit, Cluster zu bilden und die Lösung horizontal zu skalieren, was für Produzenten und Konsumenten transparent ist.
Hochverfügbare Warteschlangen
In RabbitMQ können Warteschlangen über mehrere Knoten in einem Cluster repliziert werden. Dadurch wird sichergestellt, dass der Broker auch bei einem Knoten- oder Systemausfall Nachrichten empfangen und an die entsprechenden Konsumenten weiterleiten kann.
Flexibles Routing
RabbitMQ ermöglicht die Definition von flexiblen Routing-Regeln, selbst nach einem bestimmten Muster, um Nachrichten mittels Bindungen zwischen Exchanges und Warteschlangen zu leiten.
Unterstützung für mehrere Protokolle
Neben AMQP unterstützt RabbitMQ auch STOMP, MQTT und HTTP über Plugins. Es bietet außerdem Mechanismen zur Authentifizierung und Zugangskontrolle für alle Broker-Komponenten.
Anwendungsfälle für RabbitMQ in der Praxis
Die wichtigsten Anwendungsfälle von RabbitMQ sind die Gewährleistung der Asynchronität zwischen Anwendungen, die Reduktion der Kopplung zwischen Anwendungen, die Verteilung von Warnungen und die Verwaltung von Hintergrundaufgaben.
Ein praktisches Beispiel ist der E-Commerce, wo RabbitMQ zur Verarbeitung von Bestellungen verwendet wird. Die Nachrichten werden an andere Systeme wie Logistik und Rechnungsstellung weitergeleitet.
Bei der Bestellabwicklung kann beispielsweise eine Nachricht an das Verteilzentrum und den Rechnungsbereich weitergeleitet werden. Hier ist der Informationsfluss asynchron und horizontal. Oft ist es auch notwendig, eine Aktion an mehrere Warteschlangen zu senden.
Das zuvor genannte Beispiel zeigt, wie nützlich dies ist, wenn ein Kunde eine Bestellung aufgibt und die Produkte für die Logistik, den Transport und die Rechnungsstellung vorbereitet werden müssen.
Da jeder dieser Bereiche ein anderes System nutzt, ist es die Aufgabe von RabbitMQ, alle Nachrichten an die jeweiligen Systeme weiterzuleiten.
Alternativen zu RabbitMQ:
RabbitMQ ist einfacher als es aussieht, und es gibt einige Alternativen dazu, darunter:
#1. IronMQ
IronMQ ist eine schnelle Message-Queuing-Software mit hoher Verfügbarkeit und einem robusten Design. Es ist am besten für einmalige Lieferungen geeignet und eine leistungsstarke Cloud-native Lösung für moderne Anwendungsarchitekturen.
Es unterstützt Push-Warteschlangen, Pull-Warteschlangen und lange Polling-Abfragen, was die Skalierbarkeit erleichtert. Es kann auch mehrere hochverfügbare Rechenzentren nutzen.
IronMQ kann in der Cloud, auf Shared- oder Dedicated-Hardware oder On-Premises eingesetzt werden. Es bietet Client-Bibliotheken mit leicht verständlicher Dokumentation.
#2. Apache Kafka
Kafka ist eine führende Plattform für verteiltes Event-Streaming, die als repliziertes, verteiltes und dauerhaftes Commit-Protokoll konzipiert ist.
Kafka eignet sich besonders gut für ereignisgesteuerte Microservices oder umfangreiche Stream-Verarbeitungsanwendungen. Events werden automatisch asynchron innerhalb des Clusters repliziert, um Fehlertoleranz und hohe Verfügbarkeit zu gewährleisten.
#3. Apache ActiveMQ
ActiveMQ ist ein Java-basierter Multiprotokoll-Nachrichtenbroker. Er ermöglicht die Integration von Anwendungen auf der Anwendungsebene mit AMQP.
Es implementiert mehrere Protokolle für die Integration, wie JMS (natives Java) und Stomp (das von PHP-Anwendungen verwendet werden kann).
Amazon bietet mit Amazon MQ eine „verwaltete“ Version, welche die Nutzung des Dienstes deutlich vereinfacht.
Abschließende Worte
Messaging Broker waren traditionell ein wichtiger Bestandteil von Unternehmensarchitekturen. Angesichts der wachsenden Anzahl von Nutzern, die über verschiedene Kanäle auf Unternehmenssysteme zugreifen, werden jedoch Produkte benötigt, die eine horizontale Skalierung bei geringen Kosten ermöglichen und große Mengen von Nachrichten pro Sekunde verarbeiten können.
Hier gewinnen Broker der neuen Generation wie RabbitMQ in modernen Anwendungen immer mehr an Bedeutung. Sie bieten unseren Kunden ein hohes Maß an Verfügbarkeit, Zuverlässigkeit, Interoperabilität und Performance.
Sie können auch verschiedene zuverlässige RabbitMQ Hosting-Plattformen für Ihre Anwendungen erkunden.