Neue Use Cases von RabbitMQ – Streams als Alternative zu Queues
Wenn es um verzögerungsfreie Nachrichtenübertragung zwischen verschiedenen Diensten geht, kann die Kommunikation eine Herausforderung darstellen. Vor allem bei der Verwendung von Microservices oder bei der Datenverarbeitung in Datenplattformen sind die kommunizierenden Dienste weitestgehend entkoppelt und nutzen häufig nicht das gleiche Nachrichtenprotokoll. An dieser Stelle kommen Nachrichtenbroker ins Spiel, welche als Vermittler und Übersetzer fungieren. In diesem Beitrag beschäftigen wir uns mit einem der wohl bekanntesten open-source Nachrichtenbroker – RabbitMQ. Durch die von RabbitMQ verwendete Datenstruktur der Queues können jedoch insbesondere Persistenz und Replayfähigkeit von Nachrichten nicht oder nur erschwert sichergestellt werden. Diese Lücke wird in Version 3.9 durch die neue Datenstruktur Streams geschlossen.
Grundprinzipien von RabbitMQ
RabbitMQ basiert auf dem Nachrichtenprotokoll AMQP (Advanced Message Queuing Protocol), durch Plug-Ins können jedoch auch weitere Protokolle wie STOMP oder MQTT verwendet werden. Unabhängig vom verwendeten Protokoll bleibt die Grundidee von RabbitMQ jedoch die Gleiche: Zwischen dem Sender (Publisher) und dem Empfänger (Consumer) einer Nachricht befindet sich eine Warteschlange (Queue), in welcher Nachrichten zwischengespeichert werden. Auf diese Weise muss der Publisher nicht darauf warten, dass die gesendete Nachricht gelesen wird und der Consumer kann Nachrichten zu einem beliebigen Zeitpunkt abholen. Die Nachrichtenübertragung findet also asynchron statt.
Wird eine Nachricht mit Hilfe von RabbitMQ verarbeitet, so durchläuft sie 4 Stationen, welche in Abbildung 1 dargestellt sind.
- Producer: Hier wird die Nachricht erzeugt. Zusätzlich werden verschiedene Nachrichtenattribute, wie zum Beispiel der Routing Key, festgelegt.
- Exchange: Die Nachricht wird nicht direkt an den Empfänger gesendet, sondern an den Exchange übergeben. Dieser leitet die Nachricht anhand ihres Routing Keys an eine oder mehrere Queues weiter.
- Queue: In der Queue werden Nachrichten gelagert, bis sie von einem Consumer abgeholt werden. Sobald eine Nachricht acknowledged wurde, wird sie aus der Queue gelöscht. Die Reihenfolge des Auslesens entspricht dem FIFO-Prinzip.
- Consumer: Dieser holt die Nachrichten ab und verarbeitet sie. Ein Consumer registriert sich auf eine Queue und bezieht von dieser Nachrichten. Wenn mehrere Consumer derselben Queue zugeordnet sind, so werden die Nachrichten im Round-Robin-Verfahren verteilt.