Apache Kafka in der Praxis: synchronisierte Kommunikation zwischen Plattformen

Einführung

Wenn Sie in einem hybriden Online-/Offline-Geschäft tätig sind, das möglicherweise über mehrere Plattformen verteilt ist, dann ist eine Ihrer größten Herausforderungen wahrscheinlich die Komplexität Ihres Software-Ökosystems. Die Verwaltung mehrerer Software-Lösungen, die von verschiedenen Anbietern stammen und unabhängige Lebenszyklen haben, kann sich erheblich darauf auswirken, wie (und ob) Ihr Unternehmen funktioniert.

In diesem Fall benötigen Sie möglicherweise Lösungen zur Vereinfachung Ihres Ökosystems, entweder durch die Verringerung der Anzahl seiner Komponenten oder durch eine bessere Integration/Synchronisation dieser Komponenten.

In diesem Artikel beschreiben wir, wie wir Online-/Offline-Datenflüsse und -Prozesse mit Apache Kafka optimiert haben.

Grundlegende Einführung in Kafka

Kafka ist ein Datenspeicher, der für die Aufnahme und Verarbeitung von Streaming-Daten in Echtzeit optimiert ist. Bei Daten, die von Tausenden von Datenquellen gleichzeitig erzeugt und gesendet werden, kann Kafka den Zustrom bewältigen und die Daten sequentiell sowie inkrementell verarbeiten.

Es kann verteilt werden, ist hochgradig skalierbar und kann Billionen von Nachrichten pro Tag verarbeiten.

Ganz wichtig: Kafka ist quelloffen und wird von der Community betrieben. Es kann also kostenlos installiert werden.

(Haftungsausschluss: Es gibt sehr viele Kafka-Anwendungen und wir behandeln hier nur ein schnelles praktisches Beispiel, das für eine Kafka-Einführung und schnelle praktische Lösung für ein relativ einfaches Geschäftsszenario geeignet ist).

Die Geschäftslage

Der Kunde ist ein gemischtes Unternehmen in der Modebranche, das sowohl über einen Online-Shop als auch über ein ausgedehntes Netz an Ladengeschäften verfügt. Das Online-Geschäft wurde durch eine eigene Software-Infrastruktur (eine maßgeschneiderte E-Shop-Plattform) betrieben, während in den stationären Geschäften eine maßgeschneiderte Cashbox-Software eingesetzt wurde.

Natürlich mussten die beiden Systeme synchronisiert werden. Zum Beispiel müssen die Wertgutscheine im gesamten Unternehmen erkannt/akzeptiert werden, unabhängig davon, wo sie gekauft werden.

Die Verwendung einer direkten Kommunikation zwischen den beiden Systemen/Diensten ist nicht die optimale Lösung, da beide Dienste immer zur gleichen Zeit verfügbar sein müssen ─ was nicht garantiert werden kann.

Hier kommt Apache Kafka ins Spiel: Es hilft uns beim Aufbau eines nachrichtenbasierten Kommunikationssystems zwischen den beiden Plattformen, das auch dann läuft, wenn eine der Plattformen vorübergehend nicht verfügbar/unerreichbar ist.

Installation von Kafka, praktische Anwendung

Für einen schnellen Start ist Kafka auf drei Arten verfügbar:

  • eine lokale Installation
  • eine lokale Installation mit Docker
  • Kafka als Dienst in der Cloud

Da wir alle Möglichkeiten durchgespielt haben gibt es hier unsere Meinung dazu.

(Bitte beachten Sie: Wenn Sie Kafka für einen schweren Einsatz benötigen und über das nötige technische Know-how verfügen, gibt es auch andere Optionen ─ schauen Sie sich einfach die verwalteten Kafka-Instanzen an, die bei allen großen Cloud-Anbietern erhältlich sind.)

Lokale Installation von Kafka

Die Installationsschritte sind recht einfach:

  • Stellen Sie sicher, dass Sie Java (mindestens Version 8) auf Ihrem System haben.
  • Laden Sie zwei Anwendungen/Pakete herunter: Kafka ist ein Paket aus zwei Anwendungen (dem Broker und Zookeeper).
  • Starten Sie die Anwendungen einzeln über die mitgelieferten Skripte.
  • Verwenden Sie weitere mitgelieferte Skripte, um Kafka zu verwalten, aber auch um die Installation zu testen, indem Sie ein Test-Topic erstellen und Testnachrichten erzeugen und empfangen.

Hier ist die detaillierte Beschreibung des Prozesses: https://kafka.apache.org/quickstart.

Die Infrastruktur unseres Kunden basiert auf einer Gruppe von Windows-2012-Servern vor Ort. Deshalb haben wir beschlossen, Kafka auf einem dieser Servern zu installieren. Wir haben zwar einige frühe Warnungen über Kafka unter Windows erhalten, aber da der Installationsprozess recht einfach aussah, haben wir uns einfach darauf eingelassen und es ausprobiert.

Alles verlief reibungslos und schon nach wenigen Minuten konnten wir Kafka in Aktion erleben. Bald darauf begannen wir mit der Implementierung unserer speziellen Producers und Consumers. Es war fast zu schön, um wahr zu sein.

Doch 24 Stunden später stürzte der Kafka-Broker ab und beschwerte sich über einige gesperrte Dateien. Durch einen Neustart des Brokers wurde das Problem „behoben“, aber einige Stunden später trat derselbe Fehler wieder auf.

Nach einigen Recherchen und Versuchen, eine geeignete Lösung zu finden (mehr über den Fehler hier: https://github.com/apache/kafka/pull/6329), beschlossen wir, eine andere Option zu wählen.

Cloud Kafka

Dann haben wir nach einem Kafka-Dienst in der Cloud gesucht. Wir haben uns aus zwei Gründen für Cloudkarafka entschieden: Es gibt eine kostenlose Test- und Entwicklungsversion sowie zugängliche kommerzielle Pläne, wenn man damit weitermachen möchte.

Wir haben uns einfach für eine Testversion registriert und sofort alle Verbindungsdaten erhalten, die wir für die Nutzung benötigen.

Die Migration des Codes von einem (lokal installierten) Kafka zu einem anderen (in der Cloud) war nur eine Frage der Änderung von Konfigurationen, da wir noch keine tatsächlichen Ereignisse zum Migrieren hatten.

Hier sind die Vorteile von Kafka als Cloud-Dienst:

  • keine Installationszeit und kein Aufwand, daher sofort verfügbar
  • keine Sorgen um Wartung und Konfiguration
  • Die Sicherheit ist standardmäßig konfiguriert.

… und die Nachteile:

  • Es fällt eine monatliche Gebühr an, die von der Geschwindigkeit und dem Volumen der über Kafka verarbeiteten Daten abhängt.
  • Für europäische Unternehmen müssen die Daten innerhalb der EU gespeichert werden und nicht alle Cloud-Anbieter können dies garantieren. (Cloudkarafka allerdings schon.) (Cloudkarafka does, though.)

Linux-Installation von Kafka mit Docker

Obwohl die Kafka-Cloud-Lösung für unsere Geschäftszwecke gut genug war, wollten wir Kafka dennoch als lokale Installation haben.

Da der Windows-Server nicht mehr in Frage kam, haben wir einen neuen Ubuntu-Server für diesen Zweck vorbereitet. Hier sind die notwendigen Schritte, um Kafka darauf zu installieren:

  • Stellen Sie sicher, dass Sie Docker und docker-compose auf dem System verfügbar haben
  • Bereiten Sie eine Datei docker-compose.yml vor (es gibt viele Standardkonfigurationen dafür).
  • Starten Sie die Docker-Images mit den üblichen docker-compose-Befehlen.
  • Sie werden immer noch die Admin-Skripte haben, um Ihre Installation zu testen, aber da alles in einem Docker läuft, müssen Sie diese starten:
docker exec -it <container-name> <command>

(Hinweis: Eine ausführliche Beschreibung eines solchen Prozesses finden Sie im Abschnitt „Single Node setup“ auf https://www.baeldung.com/ops/kafka-docker-setup).

Dieses Mal war die Installation so stabil wie nur möglich und wir haben sie schließlich als unsere endgültige Lösung verwendet, die in Produktion ging.

Verwendung von Kafka ─ das absolute Minimum

Wenn es darum geht, Kafka tatsächlich zu benutzen, sind die drei wichtigsten Begriffe:

  • Topic: eine Kategorie, die zur Organisation von Nachrichten verwendet wird; jedes Topic hat seine eigene Nachrichtenwarteschlange
  • Producer: eine Client-Anwendung, die Nachrichten für ein bestimmtes Topic produziert
  • Consumer: eine Client-Anwendung, die Nachrichten aus einem bestimmten Topic abonniert

Topics

Die Erstellung von Topics kann über die oben erwähnten Admin-Skripte erfolgen. Für unser erstes spezielles Geschäftsszenario haben wir zwei Themen mit den Namen test.voucher und prod.voucher erstellt.

Wir haben die Konvention, die Themen nach der jeweiligen Umgebung (Präfix), gefolgt vom Geschäftsereignis (Suffix) zu benennen. Hier ist der Befehl zum Erstellen eines Topics:

kafka-topics.sh --create --topic test.voucher --bootstrap-server localhost:9092

Producer und Consumer

Die Kafka-Community bietet Unterstützung für das Schreiben von Producern und Consumern in allen wichtigen Sprachen. Die genauen Angaben und eindeutige Code-Schnipsel finden Sie hier: https://docs.confluent.io/clients-confluent-kafka-dotnet/current/overview.html

Um dies auf unser einfaches Geschäftsszenario abzubilden, würde ein Workflow wie folgt aussehen:

  1. Ein Gutschein wird in einem Geschäft gekauft.
  2. Ein spezieller Producer wird aktiviert, um eine Nachricht mit allen Details über den Gutscheinkauf zu erstellen, die dann an ein bestimmtes Topic gesendet wird.
  3. Ein spezieller Consumer, der im Namen des Webshops handelt und dieses Topic abhört, „fängt“ diese Nachricht ab und benachrichtigt den Webshop, um den Gutschein in seinem eigenen System zu registrieren.

Bewährte Praktiken, die wir verwendet haben

Kafka-REST-Proxy

Der Code, der die Producers und Consumers implementiert, sollte am besten als separater Microservice aufbewahrt werden, der wie ein Kafka-REST-Proxy funktioniert. Dieser Proxy wird zwischen Ihren Geschäftsdiensten und der Kafka-Instanz stehen.

  • Wenn das Unternehmen beschließt, eine Nachricht zu senden, wird es einfach einen REST-Aufruf an den Kafka-Proxy senden, der dann den dedizierten Producer für diese Aufgaben verwendet.
  • Wenn das Unternehmen entscheidet, dass es an einer bestimmten Nachricht interessiert ist, registriert es sich dafür bei einem REST-Endpunkt am Kafka-Proxy, der dann einen Consumer anweist, diesen Endpunkt aufzurufen, wenn eine Nachricht von Interesse eintrifft.

Wiederholungs- und Notfallstrategie

  • Verwenden Sie den Commit-Mechanismus, um sicherzustellen, dass die Nachrichten ordnungsgemäß verarbeitet werden. Wenn die Verarbeitung fehlschlägt, wird die Nachricht auch nicht bestätigt und verbleibt in der Warteschlange.
  • Eine Alternative zur obigen Technik ist die Verwendung eines speziellen Topics für Nachrichten, die nicht verarbeitet werden konnten. Sie werden in dieses Topic eingefügt und von einem anderen Consumer verarbeitet.

Überwachung

  • Kafka wird ohne grafische Benutzeroberfläche ausgeliefert. Sie benötigen einige Anzeige- und Verwaltungstools, die über die bloße Befehlsschnittstelle hinausgehen.
  • Verwenden Sie Überwachungstools wie: Confluent Control Center, Prometheus & Grafana oder Conduktor, um einen klaren, sofortigen Überblick über Ihre Kafka-Instanz zu erhalten.

Fazit

Mit dem Einsatz von Apache Kafka konnten wir das Hauptproblem lösen, nämlich die Synchronisierung verschiedener, nicht direkt miteinander verbundener Teile des Software-Ökosystems des Kunden.

Aber dann erreichten wir andere, ebenso wichtige Vorteile, wie z. B.:

  • Ausfallsicherheit des Ökosystems
  • Flexibilität
  • Erhaltung aller wichtigen Daten
  • Selbst wenn ein Teil des Systems ausfällt, funktioniert die Kommunikation weiter.

Bei Berg Software setzen wir Geschäftsideen in Software um ─ und dieser Apache-Kafka-Fall ist ein einfaches Beispiel dafür, wie wir Software-Lösungen zur Unterstützung und Rationalisierung der Geschäfte unserer Kunden einsetzen.

29 Jahre im Geschäft | 2700 Software-Projekte | 760 Kunden | 24 Länder

Wir verwandeln Ideen in Software. Wie lautet Ihre Idee?

Kontakt aufnehmen

15 + 1 =