13. Dezember 2022
RabbitMQ für Shopware 6
Die Kommunikation ist eine der größten Herausforderungen der IT.
Verschiedene Dienste müssen untereinander kommunizieren, Informationen
austauschen und Daten übermitteln.
Dabei ist die Art und Weise der Kommunikation zwischen den Anwendungen eine
Problemstellung, die nicht zu unterschätzen ist. Sprachbarrieren sind
beispielsweise auch in der IT ein Thema, sobald die kommunizierenden
Anwendungen in verschiedenen Programmiersprachen geschrieben sind.
Außerdem muss der Informationsaustausch kontrolliert ablaufen, da sich sonst
die Nachrichten gegenseitig blockieren. Dadurch entsteht ein Stau und
Prozesse können nicht mehr optimal ablaufen.
Den Begriff “Nachricht” verwenden wir in diesem Kontext sehr offen. Damit
werden sowohl Anweisungen an andere Programme als auch tatsächliche
Textnachrichten bezeichnet und demzufolge die gesamte
Informationsvermittlung erfasst.
Um eine gemeinsame Kommunikationsinfrastruktur zu erreichen, die wächst und
skaliert und dadurch auch anspruchsvolle Bedingungen erfüllt, kann eine Art
Mittelsmann eingeschaltet werden. Dieser Dienst übernimmt die Verteilung der
Nachrichten und wird Messaging Broker genannt.
Was ist RabbitMQ?
RabbitMQ ist einer der bekanntesten Messaging Broker (auch
Nachrichten-Broker), in der Programmiersprache Erlang geschrieben und für
Linux, BSD, Unix, Windows sowie macOS lauffähig. Es basiert auf der Idee des
Advanced Message Queuing Protocols (AMQP).
Der große Vorteil von diesem Protokoll: Sender und Empfänger müssen nicht
die gleiche Programmiersprache verstehen. Außerdem sorgt AMQP in
Zusammenarbeit mit einem Nachrichten-Broker für eine robuste
Datenübertragung und lässt es zu, dass Nachrichten in einer Warteschlange
gelagert werden. Dadurch kann die Kommunikation asynchron erfolgen. Die
Information muss vom Empfänger (Consumer) nicht direkt angenommen,
verarbeitet und der Empfang bestätigt werden. Stattdessen kann dieser sich
die Nachricht aus der Warteschlange holen, sobald er freie Kapazitäten hat.
Der Sender (Producer) kann in der Zwischenzeit schon weiterarbeiten.
Ähnlich wie andere Netzwerkprotokolle legt AMQP ein Regelwerk und eine
Syntax für die Kommunikation von zwei oder mehr Teilnehmern fest. Zur
Nachrichtenübermittlung setzt das Protokoll auf Messaging Broker – wie eben
RabbitMQ.
Inzwischen hat sich RabbitMQ etwas von AMQP gelöst und funktioniert dank
Plugins auch mit anderen Protokollen wie STOMP oder MQTT. Grundsätzlich
bleibt die Idee aber gleich: Zwischen Sender und Empfänger einer Nachricht
liegt eine Warteschlange.
Exkurs: Nachrichten-Broker sind Softwaremodule in
sogenannten Messaging-Middleware-Lösungen. Als eigenständige Services
ermöglichen sie Anwendungen, Systemen und Services miteinander zu
kommunizieren und Informationen auszutauschen.
Als Vermittler validieren, speichern und leiten sie Nachrichten weiter, um
diese an ihre entsprechenden Ziele zu übergeben. Mit ihrer Hilfe können
Sender Nachrichten ausgeben, ohne zu wissen, wo die Empfänger sind, ob sie
aktiv sind oder wie viele es von ihnen gibt.
Um dies zu bewerkstelligen übersetzt der Nachrichten-Broker die Nachricht
zwischen formalen Messaging-Protokollen. Selbst wenn die voneinander
abhängigen Dienste in verschiedenen Sprachen geschrieben oder auf
unterschiedlichen Plattformen implementiert sind, können sie so direkt
miteinander kommunizieren.
Der Aufgabenbereich eines Nachrichten-Brokers beinhaltet
Warteschlangenmanagement zur Verarbeitung der Interaktionen zwischen
mehreren Nachrichtenwarteschlangen sowie Services, die von der
Datenweiterleitung über Nachrichtenübersetzung und Persistenz bis hin zur
Clientstatusverwaltung reichen.
Nachrichten-Broker lassen sich in vielen verschiedenen Branchen für die
unterschiedlichsten Geschäftsanforderungen in verschiedenen
Unternehmensumgebungen einsetzen. Sie sind vor allem dort nützlich, wo eine
zuverlässige Kommunikation zwischen Anwendungen und eine sichere
Nachrichtenübermittlung notwendig sind. So werden sie beispielsweise für
Finanztransaktionen und Zahlungsabwicklungen oder in der Auftragsbearbeitung
und -erfüllung im E-Commerce eingesetzt. Da sie die Fehlertoleranz erhöhen
und garantieren, dass Nachrichten nur einmal abgerufen werden, sind
Nachrichten-Broker eine schlüssige Wahl für die Verarbeitung von
Online-Bestellungen.
Wie funktioniert RabbitMQ?
Dienste und Anwendungen wie z.B. Shopware erzeugen für alle möglichen
Vorgänge Nachrichten, die in Queues gesammelt und dann nach und nach
abgearbeitet werden. RabbitMQ ist als Message Broker für die Verarbeitung
solcher Messages optimiert und performanter als die Anwendungen selbst.
Die Nachrichtenübermittlung läuft über vier Stationen:
- Producer: Hier werden die Nachrichten erzeugt.
-
Exchange: Dieser ist für die Weiterleitung der
Nachrichten zuständig.
-
Queue: An dieser Stelle werden die Nachrichten
gelagert.
- Consumer: Hier werden die Nachrichten verarbeitet.
Der Producer erstellt eine Nachricht und versendet diese. Allerdings nicht
direkt an den Consumer, sondern zunächst an die Exchange. Diese verteilt die
Nachrichten auf verschiedene Warteschlangen. Von der
Nachrichtenwarteschlange haben wir schon weiter oben gesprochen. Dabei
handelt es sich um eine Unterstruktur oder Komponente, die von
Nachrichten-Brokern eingesetzt wird, um einen zuverlässigen
Nachrichtenspeicher und die garantierte Zustellung zu gewährleisten. Hier
werden die Nachrichten gespeichert und geordnet, bis der Empfänger diese
verarbeiten kann. Es ist möglich, dass in einer Queue Nachrichten von mehr
als einem Producer landen. Die Nachrichten werden in exakt derselben
Reihenfolge gespeichert, in der sie übertragen wurden und verbleiben in der
Warteschlange, bis der Konsument den Empfang bestätigt. Exchange und Queues
sind Teil von RabbitMQ und werden von der Software verwaltet.
Um zu gewährleisten, dass die Nachrichten den richtigen Adressaten
erreichen, gibt der Producer der Nachricht einen Routing Key mit. Dieser
funktioniert wie eine Adresse. Die Exchange erkennt anhand des Keys, wie die
Nachricht geroutet werden muss.
Über ein sogenanntes Binding ist die Exchange mit jeder einzelnen
Warteschlange verbunden. Außerdem definiert das Binding, nach welchen
Kriterien eine Nachricht weitergeleitet werden soll.
Nachrichten können grundlegend nach vier verschiedenen Grundarten verteilt
werden:
-
Bei einer Direct Exchange besteht eine direkte
Verbindung zwischen Sender und Empfänger. Die Nachricht wird vom
Producer mit einem Routing Key ausgestattet, der einen entsprechenden
Binding Key der Queue als Gegenstück hat. Dadurch kommt nur eine
Warteschlange in Frage, an der in der Regel nur ein Consumer hängt.
-
Das Konzept der Direct Exchange wird bei einer
Topic Exchange erweitert. Über Platzhalter in den Keys
können mehrere Queses angesprochen werden. Bestimmte Binding Keys können
so akzeptiert werden, während andere ausgeschlossen werden.
-
Eine Fanout Exchange verteilt eine Nachricht an alle
verfügbaren Warteschlangen – ohne Sortierung. Der Routing Key wird
ignoriert.
-
Bei einer Header Exchange wird ebenfalls der Routing
Key ignoriert und stattdessen Wert auf den Header der Nachricht gelegt.
Dort findet die Exchange Attribute, die es ermöglichen, die korrekten
Queues anzusteuern. Ähnlich wie bei Topic Exchanges können dadurch
mehrere, aber nicht alle Queues angesprochen werden.
Consumer registrieren sich auf bestimmte Queues und ziehen sich die
Nachrichten aus der Warteschlange. Pro Queue ist nur ein Consumer
vorgesehen, da die korrekte Verteilung nicht garantiert werden kann, wenn
sich mehrere Consumer Nachrichten aus der Warteschlange ziehen. Für jede
Nachricht wird optional entschieden, ob der Consumer den Empfang bestätigen
muss.
Es kann passieren, dass ein Consumer die Nachricht in der Warteschlange
nicht abrufen kann, weil z.B. die Verbindung zusammengebrochen ist. Was
passiert dann?
Man kann entscheiden, ob der Consumer ordentlich bestätigen muss, dass er
die Nachricht erhalten hat oder ob die reine Auslieferung ausreicht. Sollte
der Sender eine Empfangsbestätigung erwarten und keine Antwort vom Consumer
erhalten, versucht der Broker entweder, die Nachricht an einen anderen
Empfänger oder erneut an den eigentlichen Empfänger zu senden. Erwartet der
Sender allerdings keine Bestätigung, ist die Nachrichtenübermittlung aus
seiner Sicht mit der Auslieferung abgeschlossen. In diesem Fall geht die
Nachricht verloren, wenn sie nicht vom Empfänger abgerufen wird.
Allerdings kann ein Client die Annahme einer Nachricht bewusst ablehnen,
wenn beispielsweise die Verarbeitung der Nachricht nicht funktioniert. Das
veranlasst den Broker entweder dazu, die Nachricht komplett zu löschen, oder
sie erneut in die Warteschlange einzugliedern.
Was sind die Vorteile von RabbitMQ?
Die Verwendung eines Nachrichten-Brokers optimiert die Kommunikation
zwischen Anwendungen. Dies stellt sicher, dass die Daten sicher, zuverlässig
und effizient zwischen den Komponenten eines Systems gesendet werden. Dabei
überzeugt RabbitMQ vor allem durch seine schlanke Konstruktion.
Der Einsatz von RabbitMQ ermöglicht asynchrones Messaging. Sender und
Empfänger müssen nicht zur selben Zeit erreichbar sein und können trotzdem
miteinander kommunizieren. Diese Art der Kommunikation verhindert den
Verlust wertvoller Daten und stellt sicher, dass Systeme auch bei
unterbrochener Konnektivität oder Latenzproblemen weiter funktionieren. So
steigt die Ausfallsicherheit und die Fehlertoleranz wird verbessert.
Außerdem wird so garantiert, dass Nachrichten einmal und in der richtigen
Reihenfolge zugestellt werden.
Von Vorteil ist, dass der Producer den Versand der Nachricht nicht selbst übernehmen muss. RabbitMQ nimmt dem Sender die Nachricht ab, sodass dieser eine neue Aufgabe beginnen kann.
Als Kunde von Timme Hosting haben Sie die Möglichkeit, RabbitMQ an Shopware 6 und andere kompatible Systeme anzubinden. Unsere erfahrenen Sysadmins stehen Ihnen für Fragen wie gewohnt zur Verfügung.