summary |
shortlog | log |
commit |
commitdiff |
tree
first ⋅ prev ⋅ next
Kai Moritz [Fri, 21 Feb 2025 10:41:54 +0000 (11:41 +0100)]
Log-Compaction: Der Zustand wird in einem Topic gespeichert
* Die Counter werden mit dem ``String``-Key indiziert
** Vorbereitung auf eine Poison-Pill Übung ist hier noch out-of-scope...
* GET-Endpoint zum Abfragen der Schlüssel-Zählungen ergänzt
** Zugriff auf die `counterMap` in `ExampleConsumer` synchronisiert.
** `CounterStateController` kopiert die Map, um mögliche konkurierende
Zugriffe während des Erzeugens der Ausgabe zu vermeiden.
* Der Zustand des Zählers wird in einem compacted Topic abgelegt
** Der Consumer zählt, welche Nachrichten gesendet und welche bestätigt
wurden.
** Über einen `Phaser` wird sichergestellt, dass alle Nachrichten von den
zuständigen Brokern bestätigt wurden, bevor der nächste ``poll()``-Aufruf
erfolgt.
* Der Value-Typ in dem Topic `state` ist jetzt auch vom Typ `String`
** Dadurch wird die Kontrolle der Ergebnisse einfacher, da alle Nachrichten
auch einfach mit `kafkacat` gelesen werden können.
* Fix: Fehler müssen wie bestätigte Nachrichten behandelt werden
** Ohne explizite Fehlerbehandlung müssen auch die nicht bestätigten
Nachrichten als `acked` gezählt werden.
** Ansonsten würde die Verarbeitung in einem ``poll()``-Durchlauf mit Fehler
hängen bleiben, da niemals alles "gesehenen" Nachrichten auch als
"bestätigt" gezählt würden.
** Dabei: Producer-Code an den aus `producer/spring-producer` angeglichen.
* Log-Meldungen zum Fortschritt beim Versenden des Zähler-Status ergänzt
* Log-Meldungen für das Senden des Zählerstands ergänzt
* Fix: Der Rebalance-Listener wurde nie registriert
* Fehler im Logging der aktiven Phase korrigiert und Meldungen verbessert
* Fix: Nachrichten wurden ggf. doppelt verarbeitet
** Wenn man in einer Schliefe die Nachrichten pro Partition separat
verarbeitet...
** ...dann sollte man in jedem Schleifendurchlauf auch nur die Nachrichten
* der gerade zu verarbeitenden Partition abrufen!
* Fix: `poll()` liefert nicht immer Nachrichten zu _allen_ Partitionen
** Ein Aufruf von `poll()` liefert _nicht unbedingt_ Nachrichten zu _jeder_
Partition, die der Instanz gerade zugeteilt ist.
** Daher konnte es auftreten, dass eine Phase nie beendet wurde, wenn
`poll()` nur Nachrichten zu einer Untermenge der aktiven Partitionen
geliefert hat.
* Der Zustand wird aus dem ``state``-Topic wiederhergestellt
* Refactor: Logik für Counter in Klasse `CounterState` extrahiert
* Refactor: DRY für state-change zu ASSIGNED
* Refactor: DRY für state-change zu UNASSIGNED
* Refactor: Neue, klarere ``switch``-Syntax
* DRY für state-change zu RESTORING
* Refactor: Handling von pause/resume vollständig in State-Change-Methoden
* Fix & Refactor: Restore-Behandlung wurde _allen_ aktiven Partitionen zuteil
** Durch das vorausgehende Refactoring wurde deutlich, dass die Behandlung,
die den _neu_ hinzugefügten Partitionen zugedacht war, allen in
`assignedPartitions` vermerkten Partitionen wiederfahren ist.
** Dies ist für den aktuellen Entwicklungsstand ggf. egal, da der wegen dem
Co-Partitioning (noch!) benötigte `RangeAssignor` eh _zuerst alle_
Partitionen entzieht, bevor er _dann alle_ neu zuteilt.
** Da der Code aber auch mit dem neuen Consumer-Rebalance Protokoll
funktionieren muss, wurde das Refactoring hier fortgeführt und so
vollendet, dass nun _alle_ Aktionenen _nur noch_ von den Callbacks
`onPartitionsAssigned()` und `onPartitionsRevoked()` ausgeht.
* Der Zählerzustand wird separat pro Partition verwaltet
** Dadurch ist es möglich, den Zustand für entzogene Partitionen zu löschen.
** D.h., bei der Ausgabe ist immer klar ersichtlich, über welchen Zustand
die angefragte Instanz gerade verfügt.
* Refactor: Zustand muss `CounterState` vollständig übergeben werden
* Refactor: Enum `PartitionState` in `State` umbenannt
* Effekte des Log-Compaction in dem Topic `state` sichtbar gemacht
* Setup mit ein bischen mehr Dampf (`README.sh` angepasst)
* TX-kompatibler Weg zur Prüfung auf eine abgeschlossene Wiederherstellung
** Der bisher verwendete Vergleich der Offset-Positionen schlägt fehl, wenn
die Implementierung um Transaktionen erweitert wird
** _Grund:_ Dann stimmt die Offset-Position nicht mehr überein, weil nach
der letzten Zustands-Nachricht noch eine, von der Transaktion erzeugte,
versteckte Nachricht folgt, die die Anwendung nie zu sehen bekommt!
* Mögliche Exception wegen konkurrierendem Zugriff auf Map verhindert
* Rückbau auf einfachen Consumer mit Statistiken zur Nachrichtenzählung,
um an dem Beispiel die Verwendung des Rebalance-Listeners vorführen zu
können. (D.h., das Speichern/Wiederherstellen des Zustands wurde
entfernt.)
* Umkehrung des Rückbaus, so dass der Zustand wieder in einem Topic mit
Log-Compaction gespeichert und aus diesem Wiederhergestellt wird.
* Die bisherige Implementierung notdürftig an die Typisierung angeapsst.
Kai Moritz [Sun, 27 Oct 2024 11:03:06 +0000 (12:03 +0100)]
Rebalance-Listener: Consumer zählt die gesehenen Schlüssel
* Die Counter werden mit dem ``String``-Key indiziert
** Vorbereitung auf eine Poison-Pill Übung ist hier noch out-of-scope...
* GET-Endpoint zum Abfragen der Schlüssel-Zählungen ergänzt
** Zugriff auf die `counterMap` in `ExampleConsumer` synchronisiert.
** `CounterStateController` kopiert die Map, um mögliche konkurierende
Zugriffe während des Erzeugens der Ausgabe zu vermeiden.
* Der Zustand des Zählers wird in einem compacted Topic abgelegt
** Der Consumer zählt, welche Nachrichten gesendet und welche bestätigt
wurden.
** Über einen `Phaser` wird sichergestellt, dass alle Nachrichten von den
zuständigen Brokern bestätigt wurden, bevor der nächste ``poll()``-Aufruf
erfolgt.
* Der Value-Typ in dem Topic `state` ist jetzt auch vom Typ `String`
** Dadurch wird die Kontrolle der Ergebnisse einfacher, da alle Nachrichten
auch einfach mit `kafkacat` gelesen werden können.
* Fix: Fehler müssen wie bestätigte Nachrichten behandelt werden
** Ohne explizite Fehlerbehandlung müssen auch die nicht bestätigten
Nachrichten als `acked` gezählt werden.
** Ansonsten würde die Verarbeitung in einem ``poll()``-Durchlauf mit Fehler
hängen bleiben, da niemals alles "gesehenen" Nachrichten auch als
"bestätigt" gezählt würden.
** Dabei: Producer-Code an den aus `producer/spring-producer` angeglichen.
* Log-Meldungen zum Fortschritt beim Versenden des Zähler-Status ergänzt
* Log-Meldungen für das Senden des Zählerstands ergänzt
* Fix: Der Rebalance-Listener wurde nie registriert
* Fehler im Logging der aktiven Phase korrigiert und Meldungen verbessert
* Fix: Nachrichten wurden ggf. doppelt verarbeitet
** Wenn man in einer Schliefe die Nachrichten pro Partition separat
verarbeitet...
** ...dann sollte man in jedem Schleifendurchlauf auch nur die Nachrichten
* der gerade zu verarbeitenden Partition abrufen!
* Fix: `poll()` liefert nicht immer Nachrichten zu _allen_ Partitionen
** Ein Aufruf von `poll()` liefert _nicht unbedingt_ Nachrichten zu _jeder_
Partition, die der Instanz gerade zugeteilt ist.
** Daher konnte es auftreten, dass eine Phase nie beendet wurde, wenn
`poll()` nur Nachrichten zu einer Untermenge der aktiven Partitionen
geliefert hat.
* Der Zustand wird aus dem ``state``-Topic wiederhergestellt
* Refactor: Logik für Counter in Klasse `CounterState` extrahiert
* Refactor: DRY für state-change zu ASSIGNED
* Refactor: DRY für state-change zu UNASSIGNED
* Refactor: Neue, klarere ``switch``-Syntax
* DRY für state-change zu RESTORING
* Refactor: Handling von pause/resume vollständig in State-Change-Methoden
* Fix & Refactor: Restore-Behandlung wurde _allen_ aktiven Partitionen zuteil
** Durch das vorausgehende Refactoring wurde deutlich, dass die Behandlung,
die den _neu_ hinzugefügten Partitionen zugedacht war, allen in
`assignedPartitions` vermerkten Partitionen wiederfahren ist.
** Dies ist für den aktuellen Entwicklungsstand ggf. egal, da der wegen dem
Co-Partitioning (noch!) benötigte `RangeAssignor` eh _zuerst alle_
Partitionen entzieht, bevor er _dann alle_ neu zuteilt.
** Da der Code aber auch mit dem neuen Consumer-Rebalance Protokoll
funktionieren muss, wurde das Refactoring hier fortgeführt und so
vollendet, dass nun _alle_ Aktionenen _nur noch_ von den Callbacks
`onPartitionsAssigned()` und `onPartitionsRevoked()` ausgeht.
* Der Zählerzustand wird separat pro Partition verwaltet
** Dadurch ist es möglich, den Zustand für entzogene Partitionen zu löschen.
** D.h., bei der Ausgabe ist immer klar ersichtlich, über welchen Zustand
die angefragte Instanz gerade verfügt.
* Refactor: Zustand muss `CounterState` vollständig übergeben werden
* Refactor: Enum `PartitionState` in `State` umbenannt
* Effekte des Log-Compaction in dem Topic `state` sichtbar gemacht
* Setup mit ein bischen mehr Dampf (`README.sh` angepasst)
* TX-kompatibler Weg zur Prüfung auf eine abgeschlossene Wiederherstellung
** Der bisher verwendete Vergleich der Offset-Positionen schlägt fehl, wenn
die Implementierung um Transaktionen erweitert wird
** _Grund:_ Dann stimmt die Offset-Position nicht mehr überein, weil nach
der letzten Zustands-Nachricht noch eine, von der Transaktion erzeugte,
versteckte Nachricht folgt, die die Anwendung nie zu sehen bekommt!
* Mögliche Exception wegen konkurrierendem Zugriff auf Map verhindert
* Rückbau auf einfachen Consumer mit Statistiken zur Nachrichtenzählung
Kai Moritz [Thu, 20 Feb 2025 17:36:13 +0000 (18:36 +0100)]
`ExampleConsumer` über Generics typisiert
Kai Moritz [Sat, 15 Mar 2025 18:12:05 +0000 (19:12 +0100)]
Das `running`-Flag wird nicht mehr benötigt
Kai Moritz [Sun, 27 Oct 2024 21:08:53 +0000 (22:08 +0100)]
`ExampleConsumer` in eine Spring-Boot App umgebaut (ohne Spring Kafka)
* Consumerspezifische Properties werden in eigener nested Class verwaltet
** Dadurch wird der Code übersichtlicher, wenn spätere Implementierungen
* _sowohl_ als Consumer, _als auch_ als Producer agieren!
* Fix: `close()` muss noch vom `ExampleConsumer` aufgerufen werden
** Der Aufruf von `close()` löst die Abmeldung der Instanz bei dem
* GroupCoordinator aus.
** Dieser Vorgang sollte noch unter der Kontrolle des Anwendungscodes
* erfolgen!
** Wenn die Methode erst von Spring aufgerufen wird, werden dann ggf. noch
* Seiteneffekte ausgelöst, die dann noch im Kontext der Instanz laufen,
* obwohl diese eigentlich schon beendet wurde!
* Ungefangene Exceptions im `ExampleConsumer` lösen das Beenden der App aus
* Das Docker-Setup verwendet den `spring-producer`
** Die Konfiguration wurde außerdem so überarbeitet, dass der Producer
mehr Nachrichten verschickt (ca. 10 Nachrichten pro Sekunde) und diese
in Batches à ca. 6 Nachrichten verpackt.
Kai Moritz [Wed, 12 Mar 2025 05:45:10 +0000 (06:45 +0100)]
RÜCKBAU für Rebase der Folge-Branches
Kai Moritz [Wed, 12 Mar 2025 05:44:27 +0000 (06:44 +0100)]
Fehlermeldung & Abbruch anstatt hartkodierter Standard-Konfig
Kai Moritz [Thu, 6 Feb 2025 16:45:45 +0000 (17:45 +0100)]
Spezial-Einstellungen entfernt, die die TN nicht haben
Kai Moritz [Mon, 20 Jan 2025 16:03:17 +0000 (17:03 +0100)]
Partition & Offset stehen eindeutig in der Log-Meldung
Kai Moritz [Sun, 29 Sep 2024 12:30:42 +0000 (14:30 +0200)]
Handling der Records wie in abgeleiteten Versionen in eigener Methode
Kai Moritz [Sat, 28 Sep 2024 10:00:20 +0000 (12:00 +0200)]
`metadata.maxage.ms` auf 5 Sekunden heruntergesetzt
Kai Moritz [Thu, 26 Sep 2024 13:21:01 +0000 (15:21 +0200)]
`simple-producer` in `simple-consumer` verwandelt -- ALIGN
Kai Moritz [Mon, 28 Oct 2024 13:14:51 +0000 (14:14 +0100)]
`simple-producer` in `simple-consumer` verwandelt -- COPY
Kai Moritz [Sat, 28 Sep 2024 09:58:11 +0000 (11:58 +0200)]
`metadata.maxage.ms` auf 5 Sekunden heruntergesetzt
Kai Moritz [Wed, 12 Mar 2025 05:53:08 +0000 (06:53 +0100)]
RÜCKBAU für Rebase der Folge-Branches
Kai Moritz [Fri, 14 Mar 2025 15:50:09 +0000 (16:50 +0100)]
RÜCKBAU für Rebase der Folge-Branches
Kai Moritz [Fri, 14 Mar 2025 15:49:04 +0000 (16:49 +0100)]
Der Producer zählt statt der gesendeten Nachrichten die in der Queue
Kai Moritz [Wed, 12 Mar 2025 05:52:43 +0000 (06:52 +0100)]
Fehlermeldung & Abbruch anstatt hartkodierter Standard-Konfig
Kai Moritz [Thu, 20 Feb 2025 17:59:22 +0000 (18:59 +0100)]
Einrückung so, wie es IntelliJ will...
Kai Moritz [Wed, 22 Jan 2025 18:33:54 +0000 (19:33 +0100)]
`build.gradle` so erweitert, dass das Image gebaut werden kann
Kai Moritz [Wed, 22 Jan 2025 18:02:36 +0000 (19:02 +0100)]
Gradle-Wrapper entfernt
Kai Moritz [Wed, 22 Jan 2025 18:01:14 +0000 (19:01 +0100)]
Gradle-Konfiguration für Version 8.11.1 hinzugefügt (mit Wrapper!)
Kai Moritz [Wed, 22 Jan 2025 17:49:47 +0000 (18:49 +0100)]
Lombok benötigt nur den Scope `compile`
Kai Moritz [Wed, 22 Jan 2025 17:27:59 +0000 (18:27 +0100)]
Maven-Wrapper wieder entfernt - Stört Firewalls beim verschicken
Kai Moritz [Mon, 20 Jan 2025 16:00:46 +0000 (17:00 +0100)]
Partition & Offset stehen eindeutig in der Log-Meldung
Kai Moritz [Sun, 19 Jan 2025 09:56:05 +0000 (10:56 +0100)]
Logmeldungen verwenden Methodenparameter, wo möglich
Kai Moritz [Fri, 17 Jan 2025 17:36:41 +0000 (18:36 +0100)]
Maven-Wrapper von Spring-Boot ergänzt und `README.sh` angepasst
Kai Moritz [Fri, 17 Jan 2025 17:36:23 +0000 (18:36 +0100)]
Spring-Boot auf 3.4.1 aktualisiert
Kai Moritz [Fri, 1 Nov 2024 14:53:17 +0000 (15:53 +0100)]
Bei einem unerwarteten Fehler wird auch der Stacktrace mit ausgegeben
Kai Moritz [Thu, 31 Oct 2024 23:52:44 +0000 (00:52 +0100)]
Der Nachrichten-Wert wird in allen Log-Meldungen mit ausgegeben
Kai Moritz [Mon, 28 Oct 2024 11:03:50 +0000 (12:03 +0100)]
Logging-Pattern überarbeitet
Kai Moritz [Sun, 29 Sep 2024 07:44:09 +0000 (09:44 +0200)]
Unnötige Kommandos aus der `README.sh` entfernt
Kai Moritz [Sat, 28 Sep 2024 05:49:04 +0000 (07:49 +0200)]
`docker` in `simple-producer` verwandelt`
Kai Moritz [Sat, 18 Jan 2025 08:53:21 +0000 (09:53 +0100)]
Schema-Registry & Connect aus dem Setup für die Grundlagen entfernt
Kai Moritz [Sat, 18 Jan 2025 08:52:57 +0000 (09:52 +0100)]
Zoonavigator aus dem Docker-Setup entfernt
Kai Moritz [Sat, 18 Jan 2025 08:51:52 +0000 (09:51 +0100)]
Kafka-Images auf 7.8.0 aktualisiert
Kai Moritz [Sat, 26 Oct 2024 17:42:02 +0000 (19:42 +0200)]
`log.retention.check.interval.ms` auf 10 Sekunden gesetzt
Kai Moritz [Sat, 28 Sep 2024 09:08:51 +0000 (11:08 +0200)]
``version``-Eintrag in `docker-compose.yml` entfernt
Kai Moritz [Sat, 28 Sep 2024 07:42:36 +0000 (09:42 +0200)]
"Final Newline" in `.editorconfig` gefordert (scheint vim zu entsprechen)
Kai Moritz [Sat, 28 Sep 2024 06:35:51 +0000 (08:35 +0200)]
`.gitignore` und `.editorconfig` hinzugefügt
Kai Moritz [Sat, 28 Sep 2024 05:43:48 +0000 (07:43 +0200)]
Schreibweise des CLI-Kommandos für Docker-Compose korrigiert
Kai Moritz [Wed, 25 Sep 2024 12:26:14 +0000 (14:26 +0200)]
Upgrade der verwendeten Kafka-Images auf 7.7.1
Kai Moritz [Sun, 8 Oct 2023 13:23:57 +0000 (15:23 +0200)]
ZooNavigator in den Demo-Stack aufgenommen
Kai Moritz [Sat, 14 Oct 2023 17:25:10 +0000 (19:25 +0200)]
`README.sh` bricht ab, wenn `setup` nicht erfolgreich ist!
Kai Moritz [Fri, 13 Oct 2023 11:39:45 +0000 (13:39 +0200)]
Start von Service `setup` startet auch `cli`
Kai Moritz [Sat, 14 Oct 2023 16:44:10 +0000 (18:44 +0200)]
Der Service `setup` wartet bereits auf den Cluster
Kai Moritz [Fri, 13 Oct 2023 08:17:23 +0000 (10:17 +0200)]
Grace-Period für Broker und cli/setup gesetzt
Kai Moritz [Fri, 6 Oct 2023 17:13:41 +0000 (19:13 +0200)]
Schönere YAML-Syntax für `setup`-Service
Kai Moritz [Fri, 6 Oct 2023 14:28:46 +0000 (16:28 +0200)]
Services `schema-registry` und `connect` hinzugefügt
Kai Moritz [Fri, 6 Oct 2023 13:12:37 +0000 (15:12 +0200)]
Hilfs-Services `setup` überarbeitet
Kai Moritz [Mon, 16 Oct 2023 19:13:52 +0000 (21:13 +0200)]
Volumes für die Log-/Config-Daten und Zookeeper hinzugefügt
Kai Moritz [Mon, 16 Oct 2023 19:05:08 +0000 (21:05 +0200)]
Setup zurück auf Confluent (Version 7.5.1) mit Zookeeper umestellt
Kai Moritz [Mon, 12 Jun 2023 19:21:06 +0000 (21:21 +0200)]
AKHQ auf einen eindeutigeren Port verlegt
Kai Moritz [Sun, 11 Jun 2023 21:14:51 +0000 (23:14 +0200)]
Automatisches entfernen von Orphans beim Start
Kai Moritz [Sun, 11 Jun 2023 12:46:07 +0000 (14:46 +0200)]
Docker-Setup in das Unterverzeichnis `docker` verschoben
Kai Moritz [Sun, 11 Jun 2023 11:55:20 +0000 (13:55 +0200)]
Docker-Setup auf `bitnami/kafka:3.4` aktualisiert und vereinfacht
* Die Konfiguration musste an (undokumentierte?!) Änderungen in der
version 3.4 von `bitnami/kafka` angepasst werden.
* Die drei Broker spielen jetzt gleichzeitig Controller. D.h., der
Service `kafka-0`, der explizit Controller gespielt hat, fällt weg.
Kai Moritz [Thu, 8 Jun 2023 08:35:41 +0000 (10:35 +0200)]
Bedienbarkeit des Setups verbessert
* Setup starten mit `docker-compose up -t0 -d cli`
** Dabei wird _nicht_ automatisch das Topic `test` neu angelegt
** D.h., die Daten gehen nicht unbeabsichtigt verloren, wenn man mit
`up -d` prüft, ob noc alles läuft!
* Das Topic `test` kan mit `docker-compose restart -t0 setup` explizit
gelöscht und neu angelegt (aka geleert) werden.
Kai Moritz [Thu, 8 Dec 2022 17:38:43 +0000 (18:38 +0100)]
`docker-compose up setup` startet auch die cli
Kai Moritz [Thu, 8 Dec 2022 17:37:08 +0000 (18:37 +0100)]
AKHQ zu dem Basis-Setup hinzugefügt
Kai Moritz [Mon, 21 Nov 2022 21:58:22 +0000 (22:58 +0100)]
Compose-Setup auf bitnami mit KRAFT umgestellt
* Setup aus Unterschied zu `spring-consumer--json--adder` übernommen.
* Auch das `README.sh` entsprechend angepasst.
Kai Moritz [Tue, 26 Jul 2022 17:58:49 +0000 (19:58 +0200)]
Für ordering-Übung werden zwei Partitionen benötigt!
Kai Moritz [Tue, 26 Jul 2022 17:52:28 +0000 (19:52 +0200)]
Setup mit 3 Broker und Topic-Erzeugung mit Setup für acks-Übung
Kai Moritz [Fri, 22 Jul 2022 18:50:15 +0000 (20:50 +0200)]
Merge der Upgrades für Confluent/Spring-Boot (Branch 'first-contact')
Kai Moritz [Fri, 22 Jul 2022 18:04:07 +0000 (20:04 +0200)]
Upgrade von Spring Boot und den Confluent-Kafka-Images
* Upgrade der Kafk-Images von Confluent 7.0.2 auf 7.1.3
** Unterstützt Kafka 3.1.x (siehe https://docs.confluent.io/platform/current/installation/versions-interoperability.html[Versions-Matrix])
* Upgrade für Spring Boot von 2.6.5 auf 2.7.2
** Enthält Kafka: 3.1.1
** Enthält Spring Kafka: 2.8.8
Kai Moritz [Sun, 3 Apr 2022 07:26:56 +0000 (09:26 +0200)]
Setup aus der Intro-Übung übernommen
Kai Moritz [Sun, 3 Apr 2022 07:23:57 +0000 (09:23 +0200)]
Setup "entkernt": Implementierungen entfernt
Kai Moritz [Sun, 3 Apr 2022 06:15:30 +0000 (08:15 +0200)]
Upgrade der Images von Confluent 6.2.0 auf 7.0.2
Kai Moritz [Fri, 1 Apr 2022 09:56:34 +0000 (11:56 +0200)]
README.sh verwendet den cli-Service für Kommandos
Kai Moritz [Fri, 25 Mar 2022 14:27:50 +0000 (15:27 +0100)]
Fälschlich hartkodiertes Topic gegen Variable getauscht
Kai Moritz [Fri, 25 Mar 2022 10:19:03 +0000 (11:19 +0100)]
Code reorganisiert, um Änderungen vergleichbarer zu machen
Kai Moritz [Fri, 25 Mar 2022 08:25:54 +0000 (09:25 +0100)]
Upgrade für Spring Boot 2.6.0 -> 2.6.5
* Kafka: 3.0.1
* Spring Kafka: 2.8.4
Kai Moritz [Tue, 14 Dec 2021 17:55:02 +0000 (18:55 +0100)]
First Contact: Simple Producer & Consumer