Kai Moritz [Sun, 17 Apr 2022 11:33:40 +0000 (13:33 +0200)]
Springify: Der Payload ist eine als JSON gerenderte Klasse
* Als Nachricht wird eine Instanz der Klasse `ClientMessage` erwartet
* Die Instanz wird mit Hilfe des `JsonDeserializer` von Spring Kafka
deserialisiert.
Kai Moritz [Mon, 18 Apr 2022 10:41:47 +0000 (12:41 +0200)]
Tests: Refaktorisiert - Durcheinander bei Assertions aufgeräumt
* Zuvor wurden die Assertions von JUnit Jupiter und AssertJ durcheinander
gewürfelt verwendet.
* Jetzt werden stringent nur noch die Assertions von AssertJ verwendet.
Kai Moritz [Sun, 17 Apr 2022 11:15:07 +0000 (13:15 +0200)]
Tests: Refaktorisiert - Serialisierung des Payloads konfigurierbar gemacht
Kai Moritz [Fri, 15 Apr 2022 11:14:19 +0000 (13:14 +0200)]
Tests: Tests prüfen den Status des Consumers
Kai Moritz [Fri, 15 Apr 2022 10:22:57 +0000 (12:22 +0200)]
Tests: Refaktorisiert - Nachrichten werden für alle Tests aufgezeichnet
Kai Moritz [Fri, 15 Apr 2022 10:17:23 +0000 (12:17 +0200)]
Tests: Fehlerfall-Test prüft, dass nicht alle Nachrichten gelesen wurden
Kai Moritz [Fri, 15 Apr 2022 10:08:50 +0000 (12:08 +0200)]
Tests: Assert-Beschreibungen korrigiert/ergänzt
Kai Moritz [Mon, 11 Apr 2022 14:19:44 +0000 (16:19 +0200)]
Tests: Geprüft, dass der Fehler nach einem Neustart neu vorliegt
Kai Moritz [Sun, 10 Apr 2022 12:50:50 +0000 (14:50 +0200)]
Tests: Umbau für einen Commit im Fehlerfall und Anpassung des Tests
Kai Moritz [Mon, 11 Apr 2022 08:04:53 +0000 (10:04 +0200)]
Tests: Refaktorisiert - Methoden-Reihenfolge aufgeräumt und kommentiert
Kai Moritz [Mon, 11 Apr 2022 07:41:40 +0000 (09:41 +0200)]
Tests: Der Test wartet, bis die Offsets regulär committed wurden
* Zuvor wurde der Offset-Commit erzwungen, indem der EndlessConsumer
über den Aufruf von `stop()` beendet wurde.
* Jetzt wird die Überprüfung der Erwartungen über awaitility aufgeschoben,
bis die Erwartungen beobachtet werden können - oder eine Zeitschranke
gerissen wird.
Kai Moritz [Sun, 10 Apr 2022 20:50:44 +0000 (22:50 +0200)]
Tests: Der EndlessConsumer wird jetzt doch asynchron ausgeführt
* Der Test-Code wird verständlicher, wenn der Consumer asynchron läuft
* Für die Überprüfung der Erwartungen wird dann awaitility benötigt
** Da der Consumer in einem separaten Thread läuft, muss auf diesen
gezielt gewartet werden
** Dafür wird es deutlicher/verständlicher, auf welche der auch aus dem
regulären Betrieb des EndlessConsumer bekannten Zustandsänderungen
der Test wartet
* Da die Offsets für die Controlle (ggf.) abgefragt werden, während der
EndlessConsumer noch läuft, wird ein separater KafkaConsumer benötigt,
um die Offsets abzurufen.
BEACHTE: Um die Änderungen in dem Offsets-Topic zu greifen zu bekommen,
muss dieser KafkaConsumer für jede Abfrage ein `assign()` durchführen,
damit er gezwungen ist, die Offsets neu vom Broker zu erfragen.
Kai Moritz [Sun, 10 Apr 2022 13:54:26 +0000 (15:54 +0200)]
Tests: Refaktorisiert - DRY für Test auf Offset-Fortschritt
Kai Moritz [Sun, 10 Apr 2022 13:25:58 +0000 (15:25 +0200)]
Tests: Überprüft, ob überhaupt ein Offset-Fortschritt vorliegt
Kai Moritz [Sun, 10 Apr 2022 13:25:57 +0000 (15:25 +0200)]
Tests: Offsets werden unter TopicPartition abgelegt
Kai Moritz [Sun, 10 Apr 2022 14:02:07 +0000 (16:02 +0200)]
Tests: Test-Reihenfolge definiert, da das Topic nicht geleert wird
Kai Moritz [Sat, 9 Apr 2022 14:14:47 +0000 (16:14 +0200)]
Tests: Erste Version eines synchronen Integration-Test implementiert
Kai Moritz [Sat, 9 Apr 2022 16:30:22 +0000 (18:30 +0200)]
Demonstration der RecordDeserializationException
* EndlessConsumer wird mit dem Value-Type `Long` anstatt `String` erzeugt
* Setup für die Demonstration der DeserializationException überarbeitet
Kai Moritz [Sat, 9 Apr 2022 14:04:02 +0000 (16:04 +0200)]
Refaktorisierung für Tests - EndlessConsumer typisiert
Kai Moritz [Sat, 9 Apr 2022 11:40:47 +0000 (13:40 +0200)]
Refaktorisierung für Tests - Record-Handler als Bean konfigurierbar
* Ein Handler für die Verarbeitung der einzelnen ConsumerRecord's kann
jetzt ein `java.util.function.Consumer` als Bean definiert werden
* Die Nachricht wird erst nach dem Aufruf des Handlers als konsumiert
gezählt, damit der Handler die Nachricht über eine Exception ablehnen
kann.
Kai Moritz [Mon, 11 Apr 2022 08:51:01 +0000 (10:51 +0200)]
Die Spring-Boot App wird nun sauber herunter gefahren
* Zuvor wurde die App nicht richtig beendet, weil der ExecutorService nicht
beendet wurde und sich die JVM deswegen nicht beenden konnte.
* Dies ist erst durch die Aktivierung des shutdown-Endpoints aufgefallen.
* Jetzt wurde in `Application` eine `@PreDestroy`-Methode ergänzt, die
den ExecutorService nach allen Regeln der Kunst ordentlich beendet.
Kai Moritz [Sat, 9 Apr 2022 11:21:43 +0000 (13:21 +0200)]
Refaktorisierung für Tests - ExecutorService als separate Bean erzeugt
Kai Moritz [Sat, 9 Apr 2022 09:36:29 +0000 (11:36 +0200)]
Refaktorisierung für Tests - Start des EndlessConsumer in ApplicationRunner
* Bisher wurde der EndlessConsumer beim erzeugen der Bean gestartet
* Dies ist für das Aufsetzen von Tests ungünstig, da die erzeugte Bean
dort nicht unbedingt direkt gestartet werden soll
* Daher wurde der Start des EndlessConsumer in einen ApplicationRunner
ausgelagert
Kai Moritz [Sat, 9 Apr 2022 09:46:51 +0000 (11:46 +0200)]
Refaktorisierung für Tests - Bean-Definition in Config-Klasse verschoben
Kai Moritz [Sat, 9 Apr 2022 09:21:43 +0000 (11:21 +0200)]
Refaktorisierung für Tests - KafkaConsumer als eigenständige Bean
* Der KafakConsumer wird als eigenständige Bean erzeugt
* Die Bean wird dem EndlessConsumer im Konstruktor übergeben
* Dafür muss der Lebenszyklus der KafkaConsumer-Bean von dem der
EndlessConsumer-Bean getrennt werden:
** close() darf nicht mehr im finally-Block im EndlessConsumer aufgerufen
werden
** Stattdessen muss close() als Destry-Methode der Bean definiert werden
** Für start/stop muss stattdessen unsubscribe() im finally-Block aufgerufen
werden
** Da unsubscribe() die Offset-Position nicht commited, muss explizit
ein Offsset-Commit beauftragt werden, wenn der Consumer regulär
gestoppt wird (WakeupException)
Kai Moritz [Sat, 9 Apr 2022 16:29:44 +0000 (18:29 +0200)]
Die Offsets werden ausgegeben, wenn eine Partition zugeteilt/entzogen wird
Kai Moritz [Sat, 9 Apr 2022 16:00:48 +0000 (18:00 +0200)]
Gesehene Schlüssel sollten als long gezählt werden
Kai Moritz [Sun, 10 Apr 2022 20:15:34 +0000 (22:15 +0200)]
Merge branch 'endless-stream-consumer' into rebalance-listener
Kai Moritz [Sun, 10 Apr 2022 19:56:37 +0000 (21:56 +0200)]
HealthIndicator implementiert
Kai Moritz [Sun, 10 Apr 2022 18:55:56 +0000 (20:55 +0200)]
shutdown-Endpoint aktiviert
Kai Moritz [Sun, 10 Apr 2022 18:55:42 +0000 (20:55 +0200)]
Informationen zur Kafka-Konfiguration im info-Endpoint sichtbar gemacht
Kai Moritz [Sun, 10 Apr 2022 18:55:13 +0000 (20:55 +0200)]
Informationen zur Java-Umgebung im info-Endpoint aktiviert
Kai Moritz [Sun, 10 Apr 2022 18:27:49 +0000 (20:27 +0200)]
Das Git-Commit-Id-Plugin generiert eine git.properties
Kai Moritz [Sun, 10 Apr 2022 18:25:28 +0000 (20:25 +0200)]
Das Spring-Boot-Maven-Plugin generiert Build-Info
Kai Moritz [Sun, 10 Apr 2022 17:52:09 +0000 (19:52 +0200)]
Default-Konfiguration überarbeitet
* Eine über die IDE bzw. Maven gestartete Instanz soll klar als solche
erkennbar sein (`client.id` = DEV), darf dafür aber im Compose-Setup
mitspielen (`group.id` = my-group).
* Bisher gab es häufig Port-Konflikte, wenn über die IDE bzw. über Maven
parallel zu einem Compose-Setup eine Instanz gestartet wurde. Daher wird
jetzt hier explizit auf einen abweichenden Port (8881) ausgewichen.
* Im Compose-Setup auch den neuen Port für den Producer übernommen
Kai Moritz [Sun, 10 Apr 2022 17:49:44 +0000 (19:49 +0200)]
Falschen Status-Code bei start/stop-Fehler korrigiert
Kai Moritz [Fri, 25 Mar 2022 14:20:00 +0000 (15:20 +0100)]
Verständliche Fehlermeldungen für DriverController
Kai Moritz [Sun, 10 Apr 2022 17:03:38 +0000 (19:03 +0200)]
Merge branch 'endless-stream-consumer' into rebalance-listener
Kai Moritz [Sun, 10 Apr 2022 16:58:16 +0000 (18:58 +0200)]
Thread-Synchronisation bei start/stop überarbeitet
Kai Moritz [Sat, 9 Apr 2022 16:50:43 +0000 (18:50 +0200)]
Fehlerbehandlung in EndlessConsumer.destroy() korrigiert
Kai Moritz [Sat, 9 Apr 2022 07:52:59 +0000 (09:52 +0200)]
Validierung erfolgt über spring-boot-starter-validation
Kai Moritz [Fri, 8 Apr 2022 10:44:37 +0000 (12:44 +0200)]
Merge branch rebalance-listener into counting-consumer
* Nur wegen der Rück-Umbenennung des counting-consumer in endless-consumer
* Die anderen Änderungen aus dem Branch wurden entfernt
Kai Moritz [Thu, 7 Apr 2022 23:19:01 +0000 (01:19 +0200)]
Merge branch 'stored-state' into stored-offsets
Kai Moritz [Thu, 7 Apr 2022 19:40:52 +0000 (21:40 +0200)]
MongoDB Express zum Compose-Setup hinzugefügt
Kai Moritz [Thu, 7 Apr 2022 10:49:09 +0000 (12:49 +0200)]
Consumer aus der IDE spielt mit
* Sonst läuft bei Experimenten die MongoDB auseinander
* Denn in die schreiben die Docker-Instanzen und die IDE-Instanz
* Deswegen gehört jetzt auch die IDE-Instanz zu der Consumer-Group, die
in Docker-Compose verwendet wird.
* *ANMERKUNG:*
** Da die gezählten Keys jetzt in der MongoDB gespeichert werden, wird
jetzt die Störung der Partitionierung durch die Änderung der Anzahl
der Partitionen wieder sichtbar, _obwohl_ zwischendurch ein Wechsel
der zuständigen Consumer-Instanz erfolgt
** D.h., es wird deutlich, wie sehr Zustand, der aus einer Partition
aufgebaut wird, unter einer Änderung der Partitions-Anzahl leidet!
Kai Moritz [Thu, 7 Apr 2022 23:13:01 +0000 (01:13 +0200)]
Merge branch 'rebalance-listener' into stored-state
Kai Moritz [Thu, 7 Apr 2022 07:25:41 +0000 (09:25 +0200)]
Rückbau auf verschachtelte Maps
* Die zuvor erfundenen fachlichen Klassen passen nicht zu dazu, dass man
sie - wie gedacht - direkt in MongoDB stopfen könnte.
* Daher hier erst mal der Rückbau auf Maps, da das dan für die Übungen
einfacher ist.
Kai Moritz [Wed, 6 Apr 2022 22:00:57 +0000 (00:00 +0200)]
Offset-Position in der MongoDB wird vor jedem `poll()` aktualisiert
Kai Moritz [Wed, 6 Apr 2022 21:45:17 +0000 (23:45 +0200)]
Setup für die Übung "Offsets" überarbeitet
Kai Moritz [Wed, 6 Apr 2022 21:35:27 +0000 (23:35 +0200)]
Offset-Position wird in der MongoDB gespeichert
Kai Moritz [Wed, 6 Apr 2022 18:54:37 +0000 (20:54 +0200)]
Die Key-Statistiken werden in einer MongoDB gespeichert
Kai Moritz [Wed, 6 Apr 2022 17:51:35 +0000 (19:51 +0200)]
counting-consumer ist eine Verbesserung von endless-consumer
Kai Moritz [Wed, 6 Apr 2022 06:45:57 +0000 (08:45 +0200)]
Benennung der neuen fachlichen Klassen verbessert
Kai Moritz [Wed, 6 Apr 2022 06:34:18 +0000 (08:34 +0200)]
Verschachtelte Map gegen fachliche Datenstruktur ausgetauscht
Kai Moritz [Tue, 5 Apr 2022 20:37:55 +0000 (22:37 +0200)]
Report über gesehene Schlüssel wiederbelebt
* An der alten Stelle war die Map ja jetzt nur noch leer, da dem Consumer
zu dem Zeitpunkt, an dem die gesehen Schlüssel ausgegeben wurden, bereits
alle Partitionen entzogen worden sind.
* Daher werden die gesehenen Schlüssel jetzt ausgegeben, wenn eine
Partition entzogen wird.
Kai Moritz [Tue, 5 Apr 2022 20:25:47 +0000 (22:25 +0200)]
Rebalance-Listener anstatt Wegwerfen der Map
Kai Moritz [Sun, 3 Apr 2022 10:19:47 +0000 (12:19 +0200)]
HTTPie gibt nicht nur den Response, sondern auch den Request aus
Kai Moritz [Sun, 3 Apr 2022 06:19:26 +0000 (08:19 +0200)]
Merge des Upgrades der Confluent-Images auf 7.0.2
Kai Moritz [Sun, 3 Apr 2022 06:18:08 +0000 (08:18 +0200)]
Merge des Upgrades der Confluent-Images auf 7.0.2
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 [Sat, 2 Apr 2022 15:18:06 +0000 (17:18 +0200)]
Der Consumer erkennt die Änderung der Partitionierung schneller
* `metadata.max.age.ms` auf 1000 heruntergesetzt (Default 5 min)
* Dadurch wird die Änderung der Anzahl an Partitionen zeitnah erkannt
Kai Moritz [Sat, 2 Apr 2022 13:11:40 +0000 (15:11 +0200)]
Für null-Keys wird der String NULL gezählt
Kai Moritz [Sat, 2 Apr 2022 08:42:05 +0000 (10:42 +0200)]
README.sh zeigt die Auswirkung einer geänderten Partitions-Anzahl
Kai Moritz [Fri, 1 Apr 2022 20:02:28 +0000 (22:02 +0200)]
Der Consumer zählt jetzt die Nachrichten pro Key für jedes Topic
* Die Ergebnisse werden beim Beenden des Consumer ausgegeben
* Wenn der Consumer neu gestartet wird, werden die Ergebnisse zurückgesetzt
* Über /seen können Zwischenstände abgefragt werden
Kai Moritz [Fri, 1 Apr 2022 09:44:22 +0000 (11:44 +0200)]
`auto.offset.reset` konfigurierbar gemacht
Kai Moritz [Fri, 1 Apr 2022 09:40:14 +0000 (11:40 +0200)]
Fehler bei der Erzeugung des KafkaConsumer werden nicht mehr verschluckt
* Beim Erzeugen der Properties-Instanz können Exceptions fliegen
* Beim Erzeugen der KafkaConsumer-Instanz können Exception fliegen
* Daher wurden diese Schritte in den try/catch-Block verlegt
* Neben der Nachricht wird jetzt auch der ganze Stack-Trace gelogged
* Da die Erzeugung des KafkaConsumer jetzt im try/catch-Block geschieht,
wird der EndlessConsumer im Fehlerfall korrekt als beendet markiert
Kai Moritz [Thu, 31 Mar 2022 17:49:28 +0000 (19:49 +0200)]
Endless Consumer: a simple consumer, implemented as Spring-Boot-App
Kai Moritz [Fri, 1 Apr 2022 08:10:42 +0000 (10:10 +0200)]
SimpleConsumer in EndlessConsumer umbenannt
* Ohne die Umbenennung _vor_ der Veränderung würde die Versions-Historie
der Klasse verloren gehen!
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