06. April 2020
3 Min.

MQTT und Kafka - Stärken beider gemeinsam nutzen

Schon in vielen IoT-Anwendungen wird ein MQTT-Broker als zentraler Vermittler für M2M (Machine-to-Machine) Nachrichten genutzt. Die Gründe, MQTT für die Verbindung von Maschinen zu verwenden, sind vielseitig. Es existieren für nahezu jede Plattform Clients. Durch die QoS-Level kann die Zustellung garantiert werden, auch wenn ein Client oder die Verbindung für eine Zeit lang ausfällt. Über hierarchische Topics lassen sich Berechtigungsmanagement und über Wildcards das Registrieren auf Nachrichten vereinfachen. Dabei unterstützen Broker wie HiveMQ mehrere tausende simultane Verbindungen.

Wenn es jedoch um die Kommunikation unter Clouddiensten/Microservices geht, sind die Anforderungen für Messagingtechnologien andere. So ist oft wichtig Nachrichten persistent zu halten oder Nachrichtenströme zwischen Consumer aufzuteilen (partitioning/sharding). Kafka ist eine Plattform, welche diese und viele weitere Anforderungen umsetzt und eine Reihe an Diensten mit sich bringt, um Nachrichtenströme zu verarbeiten. Jedoch ist Kafka nicht dazu geeignet, direkt mit der Menge an Devices/Maschinen zu kommunizieren. Die Gründe sind zum einen der Mangel an Clients für z.B. Embedded-Plattformen und die fehlenden QoS-Levels. Außerdem ist keine so fein granulare Topicstruktur wie bei MQTT möglich – und Kafka ist eben nicht für eine hohe Zahl an simultanen Verbindungen ausgelegt.

Um jetzt jedoch nicht nur an eine Technologie gebunden zu sein, besteht die Möglichkeit MQTT und Kafka zu verbinden. Somit wird MQTT als „Gateway“ für Devices und Maschinen genutzt und Kafka als Streaming-Plattform für die weitergehende Analyse der Daten. Um nun beide Technologien zu verbinden existieren mehrere Möglichkeiten:

  • Soll von Anfang an ein HiveMQ-Broker verwendet werden empfiehlt sich die HiveMQ Enterprise Extension for Kafka. Sie wird als Erweiterung direkt auf den Broker installiert, ist clusteringfähig und leitet Nachrichten direkt aus dem Broker heraus an Kafka weiter.
  • Der Confluent MQTT Proxy stellt direkt einen Endpoint für MQTT zur Verfügung, welcher die Nachrichten direkt an Kafka weitergibt. Der Proxy ist jedoch kein vollumfänglicher MQTT-Broker
  • Über den MQTT Connector für Kafka Connect lässt sich ein beliebiger MQTT-Broker an Kafka anbinden. Somit ist das optimal, falls von einem externen MQTT-Broker Daten abgegriffen werden sollen.

Anbindung über Kafka Connect

Anbindung eines MQTT-Brokeres über Kafka Connect MQTT an Kafka

Wir entwickeln in unserem Team einen Desksharing-Showcase (Blogpost). Devices senden dabei über LoRaWAN Statusänderungen an TheThingsNetwork(TTN). Um diese Nachrichten für die Analyse „abzuholen“ kann man sich am TTN-internen MQTT-Broker registrieren. Vor unserem Umstieg auf Kafka musste sich jeder Microservice selbstständig mit diesem MQTT-Broker verbinden um die Statusänderungen zu bekommen. Diese Lösung machte es jedoch nicht möglich die Microservices horizontal zu skalieren oder auf historische Daten zuzugreifen. Daher setzen wir Kafka zusammen mit dem MQTT Source Connector ein. Der Connector läuft dabei als eigener Prozess, registriert sich am MQTT-Broker von TTN und leitet sämtliche Nachrichten an Kafka weiter. Als Partitioning-Key verwendet Kafka das MQTT-Topic. Dadurch ist es direkt möglich verschiedene Devices auf verschiedene Consumer zu partitionieren (verteilen).


Um auch Nachrichten in die Gegenrichtung, also von Kafka nach MQTT, existiert zusätzlich noch der MQTT Sink Connector.

MQTT und Kafka sind über diese Erweiterungen keine getrennte Inseln mehr. Wenn sie also über MQTT ihre Geräte und über Kafka ihre Microservices kommunizieren lassen wollen, sollte die Verbindung beider Technologien kein Hindernis mehr darstellen.

Artikel kommentieren