Dieser Post ist Teil der Serie Stream Processing Entwicklungsumgebung, und das ist der 1. Artikel in der Serie. Einen Überblick über alle Artikel der Serie findest du hier.
Kafka stellt neuerdings ein Docker Image bereit, also kann ich meinen eigenen Server auch in Containern betreiben. Das gefällt mir!
Ich habe ein Dev-Setup das ich recht oft nutze, also möchte ich das aufschreiben.
Motivation
Hauptsächlich in der Arbeit nutze ich Kafka viel. Für schnelle Tests oder ähnliches benötige ich ein System das sich selbst genügt, das ich schnell aufstellen und dann auch wieder einstampfen kann. Im Wesentlichen möchte ich ein System haben, das einfach geht™.
Ich habe in diesem Zusammenhang einige Entscheidungen getroffen, die in einem Dev-Setup Sinn machen:
- Ich habe nur einen Broker. In einem typischen Setup sind drei oder mehr empfohlen um Redundanzen und hohe Verfügbarkeit zu gewährleisten. Für meinen Anwendungsfall genügt aber einer.
- Ich interessiere mich auch nicht für separate Controller, da ich in einem Development-Setup unterwegs bin.
- Ich benötige keine Daten-Persistenz. Meine Idee ist, dass ich mit
docker compose up -d
einen Cluster für Entwicklungszwecke aufsetze, und mitdocker compose down
das System wieder schließe. Ich möchte keine Artefakte in die nächste Entwicklungs-Session mitnehmen.
Mein Compose File
So schaut mein Docker Compose File aus:
|
|
Und damit bekomme ich:
- Einen Kafka Broker der als kombinierter Controller und Broker arbeitet und keine weiteren Abhängigkeiten hat.
Die meisten Konfigurationen sollten verständlich sein, wenn Kafka grundsätzlich bekannt ist; daher möchte ich nicht allzu sehr ins Detail gehen. Nur einige Kleinigkeiten die das Docker-Setup betreffen möchte ich besprechen:- Listeners und advertised Listeners: Der
CONTROLLER
Listener ist uninteressant.- Der
PLAINTEXT
Listener ist für Applikationen, die im gleichen Docker Netzwerk laufen (heißt im Wesentlichen: Die im gleichen Compose File definiert sind). Diese erreichen Kafka über den Port29092
. Entsprechend sollte in diesen Applikationen gesetzt werdenbootstrap.servers = broker:29092
. - Eine Applikation die außerhalb von Docker läuft, kann per
bootstrap.servers = localhost:9092
den Broker immer noch erreichen und alles klappt so wie erwartet.
- Der
- Die Standard-Anzahl an Partitionen für ein Topic ist $3$. Mache daraus was du möchtest.
- Der Topic Replication Factor wird auf $1$ gesetzt - das ist der Abwesenheit von mehreren Brokern geschulded.
- Listeners und advertised Listeners: Der
- Die Schema Registry macht eigentlich nicht viel.
- Kommunikation ist über
http://localhost:8081
möglich, bzw. überhttp://schema-registry:8081
aus Containern heraus. - Der Broker wird für Daten-Persistenz genutzt.
- Kommunikation ist über
Achtung!
- Wie bereits diskutiert, gibt es nur einen Broker - das ist kein Fehler, sondern ein Feature.
- Die Schema Registry von Confluent steht unter der Confluent Community Lizenz, die keine anerkannte FOSS-Lizenz ist. Ich arbeite an einer Alternative, die existiert aber noch nicht. Vorerst ist das für mich gut genug.
- Wiederum ein Feature: Es gibt keine Daten-Persistenz! Wenn der Broker neu gestartet oder auf eine neue Version aktualisiert wird, ist alles weg.
Erweiterungen
Dieses Setup ist bei weitem nicht vollständig, und es gibt eine Menge Erweiterungen, die ich mir vorstelle. Einige Gedanken:
- Ich denke darüber nach, meinen Cluster im Heimnetzwerk auf Docker umzustellen; das würde das Dependency Management sehr erleichtern. Mir ist klar dass die Images nicht für Produktion gedacht sind, aber fürs Heimnetzwerk könnte das genügen. Wenn ich das mache, werde ich sicher darüber bloggen.
- Ich habe auch mit drei Brokern auf einer Maschine herumgespielt, aber das bringt nicht viel Mehrwert für ein Dev-Setup. Trotzdem werde ich das vielleicht einmal publizieren.
- Es gibt noch eine ganze Menge Services, die ich noch hinzufügen möchte. Spontan fällt mir ein: Kafka Connect, Apache Flink oder ksql, eine UI, und einiges anderes. Ich werde voraussichtlich bloggen, wenn ich das gut genug formalisiert und korrekt aufgesetzt habe.
Trotzdem ist das ein gutes minimales Setup um auf einem Kafka Cluster zu entwickeln.
Fazit
Es ist wirklich cool, dass Kafka eigene Images baut! Ich freue mich darauf, das Container-Setup zu erweitern.