demos/kafka/training
2 years agoVerbesserungen und Fachlogik-Test aus 'sumup-adder' gemerged
Kai Moritz [Tue, 16 Aug 2022 16:58:10 +0000 (18:58 +0200)]
Verbesserungen und Fachlogik-Test aus 'sumup-adder' gemerged

2 years agotest: Überprüfung der Fachlogik ergänzt
Kai Moritz [Tue, 16 Aug 2022 16:31:45 +0000 (18:31 +0200)]
test: Überprüfung der Fachlogik ergänzt

* Überall, wo die Fachlogik geprüft wird, wird jetzt sichergestellt,
  dass die berechneten Ergebnisse den Erwartungen entsprechen.
* Überprüft, werden nur die zu dem Zeitpunkt tatsächlich vollständig
  berechneten Ergebnisse. Dadurch wird durch die Überprüfung kein Fehler
  ausgelöst, wenn wegen einem simulierten Fehler noch nicht alle durch
  die erzeugten Nachrichten angeforderten Berechnungen erfolgt sind.

2 years agorefactor: Inline-Klasse in `ApplicationTests` ist jetzt statische Klasse
Kai Moritz [Tue, 16 Aug 2022 15:48:27 +0000 (17:48 +0200)]
refactor: Inline-Klasse in `ApplicationTests` ist jetzt statische Klasse

* Diese Refaktorisierung ist nötig, damit dem `RecordGenerator`
  der Zugriff auf die Ergebnisse der Fachlogik in `AdderResults`
  ermöglicht werden kann.
* Grund: Wenn der `RecordGenerator` bereits im Konstruktor erzeugt wird,
  kann er nicht auf die `this`-Referenz von `ApplicationTests` zugreifen.

2 years agoDie Ergebnisse werden gespeichert und sind via REST abrufbar
Kai Moritz [Mon, 15 Aug 2022 20:15:17 +0000 (22:15 +0200)]
Die Ergebnisse werden gespeichert und sind via REST abrufbar

2 years agoGRÜN: Implementierung der Erwartungen inkl. Anpassungen an der Anwendung
Kai Moritz [Mon, 15 Aug 2022 17:54:49 +0000 (19:54 +0200)]
GRÜN: Implementierung der Erwartungen inkl. Anpassungen an der Anwendung

* Neue Erwartungen an `AdderBusinessLogic` implementiert.
* Die Implementierung hat sich über die nicht von den Unit-Tests
  abgedeckte Methode auch auf andere Teile der Anwendung ausgewirkt.
* `AdderBusinessLogic.getState()` liefert jetzt in der Map die neue
  Klasse `AdderResult` und benötigt diese auch als Konstruktor-Argument.
* Über die Integration-Tests ist sichergestellt, dass die Datenhaltung
  trotz der Umstellung von `Long` auf `AdderResult` funktioniert.

2 years agoROT: Zur Summe soll die Zahl ausgegeben werden - Logik + Test angepasst
Kai Moritz [Mon, 15 Aug 2022 17:23:56 +0000 (19:23 +0200)]
ROT: Zur Summe soll die Zahl ausgegeben werden - Logik + Test angepasst

* `AdderBusinessLogic` gibt jetzt ein `AdderResult` zurück, das die Summe
  zusammen mit der zugehörigen Zahl ausgibt.
* Anwendung (insbesondere die Signatur von `AdderBusinessLogic`!)
  entsprechend angepasst.
* Erwartungen an `AdderBusinessLogic` entsprechend überarbeitet.

2 years agoGRÜN: Neue Erwartungen umgesetzt
Kai Moritz [Mon, 15 Aug 2022 17:12:12 +0000 (19:12 +0200)]
GRÜN: Neue Erwartungen umgesetzt

2 years agoROT: Signatur für `AdderBusinessLogic` und neue Erwartungen formuliert
Kai Moritz [Mon, 15 Aug 2022 17:02:58 +0000 (19:02 +0200)]
ROT: Signatur für `AdderBusinessLogic` und neue Erwartungen formuliert

* Anwendung so überarbeitet, dass sie weniger motzig ist, dafür aber
  einfach Rechenfehler produziert - weil diese bei Experimenten leichter
  nachvollziehbar sind.
* Dafür eine neue Signatur für `AdderBusinessLogic` entwickelt, die
  Implementierung aber noch nicht angepasst.
* Die neuen Erwartungen an `AdderBusinessLogic` formuliert.

2 years agofix: Fehlerhafte Erwartung korrigiert
Kai Moritz [Mon, 15 Aug 2022 16:53:10 +0000 (18:53 +0200)]
fix: Fehlerhafte Erwartung korrigiert

2 years agoGRÜN: (ungewollt!) - Unabhängigkeit der Tests wieder hergestellt
Kai Moritz [Sun, 14 Aug 2022 20:40:13 +0000 (22:40 +0200)]
GRÜN: (ungewollt!) - Unabhängigkeit der Tests wieder hergestellt

* Die Mongo-DB wird jetzt zwischen den Tests gewaltsam mit `drop()`
  geleert.
* Dadurch wirkt sich der Test, bei dem die Verarbeitung durch einen
  Logik-Fehler unterbrochen wird, nicht mehr auf den/die anderen Tests aus.

2 years agoROT: Rückbau auf automatische Commits - Testfälle laufen nicht mehr
Kai Moritz [Sun, 14 Aug 2022 19:45:13 +0000 (21:45 +0200)]
ROT: Rückbau auf automatische Commits - Testfälle laufen nicht mehr

* Rückbau von sumup-adder auf automatische Commits, so wie in dem
  Branch stored-state - D.h., nur noch der Zustand wird in der Mongo-DB
  gespeichert.
* Durch den Umbau schlägt `ApplicationTests` fehl, obwohl sich eigentlich
  nichts an der Logik geändert hat.
* Dies ist so "gewollt": Es zeigt, dass bei automatischen Commits im
  Fehlerfall der gespeicherte Zustand und der Stand der verarbeiteten
  Nachrichten auseinander laufen.
* _Unschön:_ Die Tets sind nicht mehr unabhängig voneinander.
** Eigentlich war erwartet, dass der Test, der den Fehler erzeugt
   beim 2. Anlauf fehlschlägt, weil durch die doppelt gelesenen
   Nachrichten weitere Fehler auftreten - diese unterscheiden sich aus
   der Sicht des Test-Codes aber gar nicht von den vorherigen Fehlern.
** Als _ungewollter_ Seiteneffekt bleibt aber der Zustand in der Mongo-DB
   zurück, der zwischen den Tests nicht zurückgesetzt wird.
** Dadurch scheitert dann der folgende Test, der eigentlich durchlaufen
   sollte.
** Genauer: Ob und/oder Welche Tests fehlschlagen, hängt von der
   Ausführungs-Reihenfolge ab!
* *Idee:* `AdderBusinessLogic` weniger motzig implementieren, indem
  anstatt von getrennten START- und STOP-Nachrichten nur noch eine
  CALC-Nachricht verwendet wird, die die Summe der zuvor aufgelaufenen
  Zahlen ausgibt.
** Passt besser zu der ursprünglichen Idee, dass an den falchen Summen
   leicht gezeigt werden kann, dass Nachrichten doppelt verarbeitet wurden
** Die Idee mit den ungültigen Zuständen führt davon ab! Bei doppelt
   verarbeiteten Nachrichten ist dann nur noch der invalide Zustand
   sichtbar, zu den mit der Gauß-Summenformel leicht als falsch zu
   entlarvenden Summen kommt es dann gar nicht mehr...

2 years agoBenennung vereinheitlicht und projektunabhängig gemacht
Kai Moritz [Sun, 14 Aug 2022 17:04:47 +0000 (19:04 +0200)]
Benennung vereinheitlicht und projektunabhängig gemacht

2 years agofix: In `onPartitionsAssigned()` wurde der Kafka-Offset ausgegeben
Kai Moritz [Sun, 14 Aug 2022 16:25:54 +0000 (18:25 +0200)]
fix: In `onPartitionsAssigned()` wurde der Kafka-Offset ausgegeben

2 years agoGRÜN: Korrektur des über die verschärften Tests aufgedeckten Fehlers
Kai Moritz [Sun, 14 Aug 2022 16:16:34 +0000 (18:16 +0200)]
GRÜN: Korrektur des über die verschärften Tests aufgedeckten Fehlers

2 years agoROT: Verbesserungen aus 'deserialization' in 'sumup-adder' gemerged
Kai Moritz [Sun, 14 Aug 2022 16:09:17 +0000 (18:09 +0200)]
ROT: Verbesserungen aus 'deserialization' in 'sumup-adder' gemerged

* Dabei: Die Verbesserungen aus 'deserialization' genutzt, um in
  `ApplicationTests` einen angepassten `RecordGenerator` zu
  implementieren.
* Da der Service derzeit mit `String` für Schlüssel und Nachricht
  arbeitet, kann keine Poison-Pill erzeugt werden (null-Nachrichten
  führen nicht zu einer `DeserializationException` und alles andere
  lässt sich in einen - fachlich ggf. sinnfreien - String konvertieren).
* Der Test für Logik-Fehler schlägt fehl, weil er einen Fehler in der
  Implementierung aufdeckt!
* Alle bisherigen Versionen von `EndlessConsumer`, die ihre Offsets in
  der Mongo-DB mit speichern führen bei einer `DeserializationException`
  einen Offset-Commit durch, wenn ihnen durch das darauf folgende
  `unsubscribe()` die Partitionen entzogen werden.
* D.h., bisher wurden in dieser Situation Nachrichten verloren!

2 years agoMethode zu prüfen der Fachlogik in `RecordGenerator` ergänzt und angebunden
Kai Moritz [Sun, 14 Aug 2022 13:40:39 +0000 (15:40 +0200)]
Methode zu prüfen der Fachlogik in `RecordGenerator` ergänzt und angebunden

2 years agoSignatur und Handling des `RecordGenerator` vereinfacht/überarbeitet
Kai Moritz [Sun, 14 Aug 2022 13:35:28 +0000 (15:35 +0200)]
Signatur und Handling des `RecordGenerator` vereinfacht/überarbeitet

* Der `RecordGenerator` darf jetzt selbst bestimmen, wie viele Nachrichten
  er erzeugt und wo wieviele Poison-Pills oder Logik-Fehler erzeugt
  werden, wenn der Test dies anfordert.
* Dafür git der `RecordGenerator` jetzt die Anzahl der tatsächlich
  erzeugten Nachrichten zurück, damit die Tests richtig reagieren können.

2 years agoAnzahl der erzeugten Test-Nachrichten wird vom `RecordGenerator` bestimmt
Kai Moritz [Sun, 14 Aug 2022 13:26:26 +0000 (15:26 +0200)]
Anzahl der erzeugten Test-Nachrichten wird vom `RecordGenerator` bestimmt

2 years agoGRÜN: Erwartungen implementiert
Kai Moritz [Sat, 13 Aug 2022 15:58:22 +0000 (17:58 +0200)]
GRÜN: Erwartungen implementiert

2 years agoROT: Übersehene Erwartung an SumBusinesLogic.endSum(String) ergänzt
Kai Moritz [Sat, 13 Aug 2022 15:57:38 +0000 (17:57 +0200)]
ROT: Übersehene Erwartung an SumBusinesLogic.endSum(String) ergänzt

2 years agorefactor: Benennung der Fachlogik-Tests vereinheitlicht
Kai Moritz [Sat, 13 Aug 2022 15:56:41 +0000 (17:56 +0200)]
refactor: Benennung der Fachlogik-Tests vereinheitlicht

2 years agoImplementierung des Adders für SumUp
Kai Moritz [Sat, 13 Aug 2022 13:15:43 +0000 (15:15 +0200)]
Implementierung des Adders für SumUp

* `AdderRecordHandler` und `AdderRebalanceListener` implementiert, die
  die separat entwickelte Fachlogik anbinden.
* `StatisticsDocument` in `StateDocument` umbenannt und angepasst.
* Als Zustand wird zunächst nur der interne Zustand der Fachlogik
  ausgegeben.
* Später sollen statdessen die für die Benutzer durchgeführten
  Berechnungen ausgegeben werden, damit diese validiert werden können.

2 years agoNamen der Test-Klassen korrigiert
Kai Moritz [Sun, 14 Aug 2022 11:26:08 +0000 (13:26 +0200)]
Namen der Test-Klassen korrigiert

2 years ago`GenericApplicationTest` überspring Tests, wenn Fehler nicht verfügbar
Kai Moritz [Sun, 14 Aug 2022 10:59:20 +0000 (12:59 +0200)]
`GenericApplicationTest` überspring Tests, wenn Fehler nicht verfügbar

* Über eine Annotation wird für Tests, die einen bestimmten Fehler-Typ
  benötigen bei dem `RecordGenerator` nachgefragt, ob der Fehler-Typ
  erzeugt werden kann.
* Wenn der Fehler-Typ nicht zur Verfügung steht, wird der Test
  übersprungen.

2 years agoTests aus gemerged springified-consumer--serialization -> deserialization
Kai Moritz [Sun, 14 Aug 2022 10:06:01 +0000 (12:06 +0200)]
Tests aus gemerged springified-consumer--serialization -> deserialization

* Es wurde nur der hinzugefügte Test übernommen.
* Der hinzugefügte Test wurde an das von Spring-Kafka abweichende
  Verhalten bei einem Logik-Fehler angepasst: Kafka führt nicht automatisch
  Seeks oder einene Commit durch. Da `EndlessConsumer` bei einem
  Logik-Fehler explizit ein `unsubscribe()` durchführt, wird kein
  Offset-Commit durchgefürt, so dass die alten Offset-Positionen gültig
  bleiben.
* Der Test wurde entsprechend umbenannt.
* `RecordGenerator` wurde um einen weiteren Integer-Set erweitert, über
  den die Indizes der zu erzeugenden Logik-Fehler gesetzt werden können.
* Der hinzugefügte Test wurde auf die überarbeitete Methode zur Erzeugung
  der Test-Nachrichten umgestellt.
* `ApplicationTest` wurde so ergänzt, dass der für den hinzugefügten Test
  benötigte Logik-Fehler erzeugt wird.

2 years agoTypisierung in `GenericApplicationTest` nur noch, wo wirklich nötig
Kai Moritz [Sun, 14 Aug 2022 09:32:10 +0000 (11:32 +0200)]
Typisierung in `GenericApplicationTest` nur noch, wo wirklich nötig

* Es wird nur noch dort mit Typisierung gearbeitet, wo dies unumgänglich
  ist, weil die typisierte Implementierung angesprochen wird.
* Das Versenden der Test-Nachrichten erfolgt als `Bytes` für Schlüssel
  und Nachricht.
* Dadurch muss der `RecordGenerator` nicht mehr typisiert werden.
* Dafür muss die typisierte Implementierung des Testfalls dann Schlüssel
  und Nachricht mit einem passenden Serializer in eine `Bytes`-Payload
  umwandeln.

2 years ago`ApplicationTest` auf basis der typisierbaren Basis neu implementiert
Kai Moritz [Sun, 14 Aug 2022 08:54:27 +0000 (10:54 +0200)]
`ApplicationTest` auf basis der typisierbaren Basis neu implementiert

2 years agoTypisierbare Basis-Klasse `GenericApplicationTests` eingeführt
Kai Moritz [Sun, 14 Aug 2022 07:54:45 +0000 (09:54 +0200)]
Typisierbare Basis-Klasse `GenericApplicationTests` eingeführt

2 years agoGRÜN: Erwartungen implementiert
Kai Moritz [Sat, 13 Aug 2022 14:10:28 +0000 (16:10 +0200)]
GRÜN: Erwartungen implementiert

2 years agoROT: Erwartungen an SumBusinessLogic.addToSum(String, Integer)
Kai Moritz [Sat, 13 Aug 2022 14:02:25 +0000 (16:02 +0200)]
ROT: Erwartungen an SumBusinessLogic.addToSum(String, Integer)

2 years agoGRÜN: Erwartungen implementiert
Kai Moritz [Sat, 13 Aug 2022 13:35:44 +0000 (15:35 +0200)]
GRÜN: Erwartungen implementiert

2 years agoROT: Erwartungen an SumBusinessLogic.endSum(String)
Kai Moritz [Sat, 13 Aug 2022 13:34:31 +0000 (15:34 +0200)]
ROT: Erwartungen an SumBusinessLogic.endSum(String)

2 years agoGRÜN: Erwartungen implementiert
Kai Moritz [Sat, 13 Aug 2022 13:24:53 +0000 (15:24 +0200)]
GRÜN: Erwartungen implementiert

2 years agoROT: Erwartungen an SumBusinessLogic.getSum(String)
Kai Moritz [Sat, 13 Aug 2022 13:24:16 +0000 (15:24 +0200)]
ROT: Erwartungen an SumBusinessLogic.getSum(String)

2 years agoGRÜN: Erwartungen implementiert
Kai Moritz [Sat, 13 Aug 2022 13:19:54 +0000 (15:19 +0200)]
GRÜN: Erwartungen implementiert

2 years agoROT: Erwartungen an SumBusinessLogic.startSum(String)
Kai Moritz [Sat, 13 Aug 2022 13:17:01 +0000 (15:17 +0200)]
ROT: Erwartungen an SumBusinessLogic.startSum(String)

2 years agoDemonstration für das Wordcount-Beispiel angepasst wordcount
Kai Moritz [Sat, 13 Aug 2022 11:35:51 +0000 (13:35 +0200)]
Demonstration für das Wordcount-Beispiel angepasst

2 years agoDemonstration in README.sh gepimped
Kai Moritz [Sat, 13 Aug 2022 10:37:27 +0000 (12:37 +0200)]
Demonstration in README.sh gepimped

2 years agoVerbesserte/Erweiterte Tests aus 'stored-offsets' nach 'wordcount' gemerged
Kai Moritz [Sat, 13 Aug 2022 09:44:13 +0000 (11:44 +0200)]
Verbesserte/Erweiterte Tests aus 'stored-offsets' nach 'wordcount' gemerged

2 years agoDer Integration-Test prüft auch, ob der HealthIndicator 'UP' zurückgibt
Kai Moritz [Fri, 12 Aug 2022 21:27:45 +0000 (23:27 +0200)]
Der Integration-Test prüft auch, ob der HealthIndicator 'UP' zurückgibt

2 years agoIntegration-Test hinzugefügt, um die Lauffähigkeit der App sicherzustellen
Kai Moritz [Fri, 12 Aug 2022 21:18:19 +0000 (23:18 +0200)]
Integration-Test hinzugefügt, um die Lauffähigkeit der App sicherzustellen

2 years agoFixes für Setup/README.sh aus 'deserialization' in 'stored-offsets' gemerged
Kai Moritz [Fri, 12 Aug 2022 21:07:17 +0000 (23:07 +0200)]
Fixes für Setup/README.sh aus 'deserialization' in 'stored-offsets' gemerged

2 years agoCompose-Setup und README.sh für dieses Beispiel repariert
Kai Moritz [Fri, 12 Aug 2022 20:31:24 +0000 (22:31 +0200)]
Compose-Setup und README.sh für dieses Beispiel repariert

* Zuvor war in dem Setup noch ein Producer konfiguriert, der Nachrichten
  vom Typ `String` geschrieben hat, so dass der Consumer _sofort_ das
  zeitliche gesegnet hat.
* Im README-Skript wurde nicht darauf gewartet, dass der Consumer
  gemeldet hat, dass er ordentlich gestartet ist, bevor er nach der
  vermeintlichen Konsumption der Poison-Pill wieder neu gestartet wurde.

2 years agoVerbesserungen aus 'deserialization' nach 'stored-offsets' gemerged
Kai Moritz [Fri, 12 Aug 2022 15:40:11 +0000 (17:40 +0200)]
Verbesserungen aus 'deserialization' nach 'stored-offsets' gemerged

2 years agoRefaktorisierungen aus 'wordcount' nach 'stored-offsets' zurück portiert
Kai Moritz [Fri, 12 Aug 2022 15:32:24 +0000 (17:32 +0200)]
Refaktorisierungen aus 'wordcount' nach 'stored-offsets' zurück portiert

2 years agorefactor: Alle Kafka-Belange in den `WordcountRebalanceListener` verschoben
Kai Moritz [Fri, 12 Aug 2022 10:04:27 +0000 (12:04 +0200)]
refactor: Alle Kafka-Belange in den `WordcountRebalanceListener` verschoben

* Dafür neues Interface `PollIntervalAwareRebalanceListener` eingeführt.
* `WordcountRebalanceListener` implementiert das neue Interface und
  kümmert sich um alle Kafka-Belange.
* `WordcountRecordHandler` kümmert sich nur noch um die Fachlogik.

2 years agorefactor: Handling der Partitionen in WordcountRebalanceListener
Kai Moritz [Fri, 12 Aug 2022 09:53:46 +0000 (11:53 +0200)]
refactor: Handling der Partitionen in WordcountRebalanceListener

2 years agorefactor: RebalanceListener als eigenständige Klasse
Kai Moritz [Fri, 12 Aug 2022 09:13:54 +0000 (11:13 +0200)]
refactor: RebalanceListener als eigenständige Klasse

2 years agorefactor: Implementierung an Branch `stored-offsets` angepasst
Kai Moritz [Thu, 11 Aug 2022 18:52:35 +0000 (20:52 +0200)]
refactor: Implementierung an Branch `stored-offsets` angepasst

2 years agoWordcount-Implementierung mit Kafka-Boardmitteln und MongoDB als Storage
Kai Moritz [Sun, 24 Jul 2022 19:34:43 +0000 (21:34 +0200)]
Wordcount-Implementierung mit Kafka-Boardmitteln und MongoDB als Storage

* Zählt die Wörter pro Benutzer.
* Simple Implementierung mit Maps.
* Verwendet die bereits für das Speichern der Nachrichten-Zählung und
  der Offsets verwendete MonogoDB-Anbindung zum speichern.
* Typisierung zurückgenommn: Immer String für Key/Value
* Verwendet aus Bequemlichkeit den Seen-Endpoint von der Zählung.

2 years agoUmstellung des Nachrichten-Datentyps auf Long zurückgenommen
Kai Moritz [Sun, 24 Jul 2022 15:18:33 +0000 (17:18 +0200)]
Umstellung des Nachrichten-Datentyps auf Long zurückgenommen

* Im Branch 'deserialization' wurde der Datentyp der Nachricht von `String`
  auf `Long` umgestellt, um eine `DeserializationException` vorzuführen, die
  innerhalb des Kafka-Codes geworfen wird.
* Diese Änderung wurde schon dort nicht in dem `README.sh`-Skript
  reflektiert.
* Hier stört sie jetzt die Experimente mit dem `EndlessProducer`, der
  Nachrichten vom Typ `String` erzeugt, so dass der Consumer kein einzige
  Nachricht annehmen kann.
* Daher wird der Nachrichten-Datentyp hier wieder auf `String` zurück
  umgestellt.
* Dafür musste auch der Testfall angepasst und der Test entfernt werden, der
  die Exception kontrolliert.

2 years agoAuf den `CooperativeStickyAssignor` umgestellt
Kai Moritz [Sun, 24 Jul 2022 17:32:51 +0000 (19:32 +0200)]
Auf den `CooperativeStickyAssignor` umgestellt

2 years agoDas Speichern der Daten und Offsets erfolgt nicht mehr nach jedem `poll()`
Kai Moritz [Sun, 24 Jul 2022 16:39:05 +0000 (18:39 +0200)]
Das Speichern der Daten und Offsets erfolgt nicht mehr nach jedem `poll()`

* Statdessen kann eine `Duration` konfiguriert werden.
* Ähnlich wie in der Client-Library von Kafka, wird ein Zeitstempel für
  den letzten Commit gespeichert und die Daten werden immer dann
  gespeichert, wenn dieser weiter als das eingestellte
  `consumer.commit-interval` in der Vergangenheit liegt.

2 years agoWenn kein gespeicherter Offset vorliegt, auto.offset.reset von Kafka nutzen
Kai Moritz [Sun, 24 Jul 2022 16:22:00 +0000 (18:22 +0200)]
Wenn kein gespeicherter Offset vorliegt, auto.offset.reset von Kafka nutzen

* Es wird jetzt nur noch dann ein expliziter Seek durchgeführt, wenn eine
  gespeicherte Offset-Position gefunden wurde.
* Andernfalls wird der von Kafka initialisierte Ausgansgs-Offset verwendet.
* Welchen Offset Kafka vorgibt, hängt von `auto.offset.rest` ab!

2 years agoFehler im Shutdown-Code korrigiert: Shutdown von `EndlessConsumer` zu spät
Kai Moritz [Sun, 24 Jul 2022 15:40:36 +0000 (17:40 +0200)]
Fehler im Shutdown-Code korrigiert: Shutdown von `EndlessConsumer` zu spät

2 years agomongo-express sollte erst nach der MongoDB gestartet werden
Kai Moritz [Sun, 24 Jul 2022 15:18:02 +0000 (17:18 +0200)]
mongo-express sollte erst nach der MongoDB gestartet werden

2 years agoAusgabe der verarbeiteten Nachrichten im Revoke-Callback entfernt
Kai Moritz [Sun, 24 Jul 2022 14:15:23 +0000 (16:15 +0200)]
Ausgabe der verarbeiteten Nachrichten im Revoke-Callback entfernt

* Es musste allein für diese Ausgabe eine Map mit den zuletzt eingelesenen
  Offset-Positionen gepflegt werden.
* Das ist zu viel Overhead, für die Randmeldung im Log.

2 years agoFehler in Logging-Ausgabe korrigiert
Kai Moritz [Sun, 24 Jul 2022 14:12:04 +0000 (16:12 +0200)]
Fehler in Logging-Ausgabe korrigiert

* Der über den Merge hinzugefügt Test hat einen Fehler aufgedeckt.
* In onPartitionsRevoked() wurde bei der Berechnung der verarbeiteten
  Nachrichten für die Log-Ausgabe ein Nullzeiger dereferenziert.
* Ursache dafür war, dass die Map `offsets` in der Version, die die Offsets
  speichert gar nicht mehr gepflegt wurde.

2 years agoMerge der Refaktorisierung des EndlessConsumer (Branch 'stored-state')
Kai Moritz [Sun, 24 Jul 2022 13:35:14 +0000 (15:35 +0200)]
Merge der Refaktorisierung des EndlessConsumer (Branch 'stored-state')

* Die `commtSync()`-Aufrufe machen beim Speichern der Offsets außerhalb
  von Kafka keinen Sinn mehr.
* Der Testfall musste an die extern gespeicherten Offsets angepasst
  werden: Die gesehenen Offsets müssen aus der MongoDB gelesen werden,
  anstatt über einen separaten Consumer aus Kafka.
* Der mit dem Merge hinzugefügte Test schlägt fehl, da er einen Fehler
  aufdeckt (NPE bei einer Log-Ausgabe zur Offset-Verarbeitung).

2 years agoTest prüft ungültige und unbekannte Nachrichten springified-consumer--serialization
Kai Moritz [Tue, 26 Jul 2022 14:21:17 +0000 (16:21 +0200)]
Test prüft ungültige und unbekannte Nachrichten

2 years agoVerbesserungen des Testfalls gemerged (Branch 'deserialization')
Kai Moritz [Tue, 26 Jul 2022 14:11:45 +0000 (16:11 +0200)]
Verbesserungen des Testfalls gemerged (Branch 'deserialization')

2 years agoVerhalten des Testfalls kontrollierbarer gemacht
Kai Moritz [Tue, 26 Jul 2022 14:03:10 +0000 (16:03 +0200)]
Verhalten des Testfalls kontrollierbarer gemacht

* Die Awaitility-Aufrufe pollen den zu prüfenden Zustand wenn nicht anders
  angegeben so häufig, wie es die CPU zulässt - also ohne Verzögerung
  zwischen den Überprüfungen.
* Das kann den Rechner temporär so überlasten, dass der erwartete Zustand
  in der abgewarteten Zeit gar nicht eintritt!
* Z.B. aufgetreten, wenn wie hier das Commit-Interval auf 1 Sekunde
  gesetzt ist, das Polling von Awaitility aber noch ungebremst durchgeführt
  wird.
* Um diese Quelle für falsche Fehler auszuschließen, wurde jetzt
  durchgängig ein Poll-Intervall von 1 Sekunde für Awaitility gesetzt.

2 years agoTestfall überarbeitet
Kai Moritz [Tue, 26 Jul 2022 13:37:43 +0000 (15:37 +0200)]
Testfall überarbeitet

* Abhängigkeit der Testergebnisse von Ausführreihenfolge beseitigt.
* Die Abhängigkeit bestand, da die Offset-Positionen als Zustand die
  Testausführung überdauert haben.
* Daher konnte kein weiterer Test mehr ausgeführt werden, nachdem einmal
  eine Poison-Pill in das Topic geschrieben wurde, über die der
  implementierte Consumer stolpert.
* Um das zu umgehen, werden die Offset-Positionen jetzt nach jedem Test
  auf das Ende der Partitionen verschoben. D.h., wenn in dem Test eine
  Poision-Pill geschrieben wird, über die der implementierte Consumer
  nicht hinweglesen kann, werden die Offests vor der Ausführung des
  nächsten Tests über diese Poision-Pill hinweg gesetzt.
* Dadurch ist wurde ein Fehler / eine Schwäche in der Testlogik aufgedeckt:
  In dem Test für das erfolgreiche Schreiben wurde nur deswegen ein Commit
  ausgeführt, weil zuvor noch kein Commit durchgeführt wurde, so dass der
  Default-Wert für das Commit-Interval immer überschritten war.
* Um das zu umgehen, wurde eine Konfigurations-Option für das Setzen des
  Parameters `auto.commit.interval` eingeführt, so dass im Test
  sichergestellt werden kann, dass auf jeden Fall in dem beobachteten
  Zeitraum ein automatischer Commit ausgelöst wird.
* Außerdem: Weniger verwirrende Ausgabe des Offset-Fortschritts.

2 years agoDeserialisierung von Nachrichten unterschiedlichen Typs
Kai Moritz [Tue, 26 Jul 2022 09:38:54 +0000 (11:38 +0200)]
Deserialisierung von Nachrichten unterschiedlichen Typs

2 years agoRefaktorisierungen des Testfalls gemerged (Branch 'deserialization')
Kai Moritz [Tue, 26 Jul 2022 10:52:23 +0000 (12:52 +0200)]
Refaktorisierungen des Testfalls gemerged (Branch 'deserialization')

2 years agoVerwendung eines weniger verwirrenden Key in Tests (fachlich irrelevant)
Kai Moritz [Tue, 26 Jul 2022 10:42:45 +0000 (12:42 +0200)]
Verwendung eines weniger verwirrenden Key in Tests (fachlich irrelevant)

2 years agoErzeugung von ProducerRecord in Test refaktorisiert
Kai Moritz [Tue, 26 Jul 2022 10:40:45 +0000 (12:40 +0200)]
Erzeugung von ProducerRecord in Test refaktorisiert

2 years agoMerge der Refaktorisierung des EndlessConsumer (Branch 'deserialization')
Kai Moritz [Sun, 24 Jul 2022 10:34:53 +0000 (12:34 +0200)]
Merge der Refaktorisierung des EndlessConsumer (Branch 'deserialization')

* Um die Implementierung besser testen zu können, wurde die Anwendung
  in dem Branch 'deserialization' refaktorisiert.
* Diese Refaktorisierung werden hier zusammen mit den eingeführten
  Tests gemerged.
* Der so verfügbar gemachte Test wurde so angepasst, dass er das Speichern
  des Zustands in einer MongoDB berücksichtigt.

2 years agoMerge der überarbeiteten Compose-Konfiguration ('deserialization')
Kai Moritz [Sat, 23 Jul 2022 14:17:42 +0000 (16:17 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('deserialization')

2 years agoMerge der überarbeiteten Compose-Konfiguration ('rebalance-listener')
Kai Moritz [Sat, 23 Jul 2022 14:15:29 +0000 (16:15 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('rebalance-listener')

2 years agoMerge der überarbeiteten Compose-Konfiguration ('stored-state')
Kai Moritz [Sat, 23 Jul 2022 13:58:44 +0000 (15:58 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('stored-state')

2 years agoREADME.sh startet MongoDB und Mongo-Express
Kai Moritz [Sat, 23 Jul 2022 13:58:16 +0000 (15:58 +0200)]
README.sh startet MongoDB und Mongo-Express

2 years agoMerge der überarbeiteten Compose-Konfiguration ('rebalance-listener')
Kai Moritz [Sat, 23 Jul 2022 13:41:57 +0000 (15:41 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('rebalance-listener')

* Dabei auch die letzten Verbesserungen aus 'rebalance-listener' übernommen.

2 years agoMerge der überarbeiteten Compose-Konfiguration ('counting-consumer')
Kai Moritz [Sat, 23 Jul 2022 13:35:01 +0000 (15:35 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('counting-consumer')

2 years agoMerge der überarbeiteten Compose-Konfiguration ('endless-stream-consumer')
Kai Moritz [Sat, 23 Jul 2022 11:49:23 +0000 (13:49 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('endless-stream-consumer')

* Die letzten Änderungen an 'endless-stream-consumer' sind länger nicht
  mehr gemerged worden.

2 years agoCompose-Konfiguration unabhängig von Default-Konfiguration gemacht
Kai Moritz [Sat, 23 Jul 2022 11:26:29 +0000 (13:26 +0200)]
Compose-Konfiguration unabhängig von Default-Konfiguration gemacht

* Damit Instanzen parallel über die IDE (mit voreingestelltem Default-Port)
  und Compose gestartet werden können, wurden den einzelnen Komponenten
  (Producer, Consumer etc.) jeweils unterschiedliche explizite
  Default-Ports zugewiesen.
* Dies führt leicht zu fehlern, in den Compose-Setups, da dort i.d.R.
  Port-Mappings für die gestarteten Instanzen definiert werden.
* Daher werden die Compose-Setups jetzt so umgestellt, dass sie den
  einkompilierten Default-Port der Komponenten explizit mit dem Port `8080`
  überschreiben, so dass alle Komponenten _innerhalb_ von Compose
  einheitlich (und so wie bei Spring-Boot standard) über `8080` ansprechbar
  sind.

2 years agoMerge der Upgrades für Confluent/Spring-Boot (Branch 'first-contact')
Kai Moritz [Sat, 23 Jul 2022 08:37:24 +0000 (10:37 +0200)]
Merge der Upgrades für Confluent/Spring-Boot (Branch 'first-contact')

2 years agoUpgrade von Spring Boot und den Confluent-Kafka-Images
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

2 years agoMerge branch 'deserialization' into springified-consumer--serialization
Kai Moritz [Sat, 30 Apr 2022 09:38:26 +0000 (11:38 +0200)]
Merge branch 'deserialization' into springified-consumer--serialization

2 years agoFehler in Shutdown-Logik für den `ExecutorService` korrigiert
Kai Moritz [Sat, 30 Apr 2022 09:36:13 +0000 (11:36 +0200)]
Fehler in Shutdown-Logik für den `ExecutorService` korrigiert

2 years agoMerge branch 'rebalance-listener' into deserialization
Kai Moritz [Sat, 30 Apr 2022 09:34:38 +0000 (11:34 +0200)]
Merge branch 'rebalance-listener' into deserialization

2 years agoMerge branch 'endless-stream-consumer' into rebalance-listener
Kai Moritz [Sat, 30 Apr 2022 09:24:34 +0000 (11:24 +0200)]
Merge branch 'endless-stream-consumer' into rebalance-listener

2 years agoHealthIndicator implementiert: Implementierung selbst vergessen :/
Kai Moritz [Sat, 30 Apr 2022 09:22:41 +0000 (11:22 +0200)]
HealthIndicator implementiert: Implementierung selbst vergessen :/

2 years agoRefactor: `EndlessConsumer` ist selbst ein `ConsumerRebalanceListener`
Kai Moritz [Fri, 22 Apr 2022 15:53:41 +0000 (17:53 +0200)]
Refactor: `EndlessConsumer` ist selbst ein `ConsumerRebalanceListener`

* Vorbereitung für die Übernahme der Funktionalität in der springifizierten
  Version.

2 years agoSpringify: Nachrichten-Typ wird über den Type-Info-Header bestimmt
Kai Moritz [Sun, 17 Apr 2022 11:44:49 +0000 (13:44 +0200)]
Springify: Nachrichten-Typ wird über den Type-Info-Header bestimmt

2 years agoSpringify: Der Payload ist eine als JSON gerenderte Klasse
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.

2 years agoTests: Refaktorisiert - Durcheinander bei Assertions aufgeräumt
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.

2 years agoTests: Refaktorisiert - Serialisierung des Payloads konfigurierbar gemacht
Kai Moritz [Sun, 17 Apr 2022 11:15:07 +0000 (13:15 +0200)]
Tests: Refaktorisiert - Serialisierung des Payloads konfigurierbar gemacht

2 years agoTests: Tests prüfen den Status des Consumers
Kai Moritz [Fri, 15 Apr 2022 11:14:19 +0000 (13:14 +0200)]
Tests: Tests prüfen den Status des Consumers

2 years agoTests: Refaktorisiert - Nachrichten werden für alle Tests aufgezeichnet
Kai Moritz [Fri, 15 Apr 2022 10:22:57 +0000 (12:22 +0200)]
Tests: Refaktorisiert - Nachrichten werden für alle Tests aufgezeichnet

2 years agoTests: Fehlerfall-Test prüft, dass nicht alle Nachrichten gelesen wurden
Kai Moritz [Fri, 15 Apr 2022 10:17:23 +0000 (12:17 +0200)]
Tests: Fehlerfall-Test prüft, dass nicht alle Nachrichten gelesen wurden

2 years agoTests: Assert-Beschreibungen korrigiert/ergänzt
Kai Moritz [Fri, 15 Apr 2022 10:08:50 +0000 (12:08 +0200)]
Tests: Assert-Beschreibungen korrigiert/ergänzt

2 years agoTests: Geprüft, dass der Fehler nach einem Neustart neu vorliegt
Kai Moritz [Mon, 11 Apr 2022 14:19:44 +0000 (16:19 +0200)]
Tests: Geprüft, dass der Fehler nach einem Neustart neu vorliegt

2 years agoTests: Umbau für einen Commit im Fehlerfall und Anpassung des Tests
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

2 years agoTests: Refaktorisiert - Methoden-Reihenfolge aufgeräumt und kommentiert
Kai Moritz [Mon, 11 Apr 2022 08:04:53 +0000 (10:04 +0200)]
Tests: Refaktorisiert - Methoden-Reihenfolge aufgeräumt und kommentiert

2 years agoTests: Der Test wartet, bis die Offsets regulär committed wurden
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.

2 years agoTests: Der EndlessConsumer wird jetzt doch asynchron ausgeführt
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.

2 years agoTests: Refaktorisiert - DRY für Test auf Offset-Fortschritt
Kai Moritz [Sun, 10 Apr 2022 13:54:26 +0000 (15:54 +0200)]
Tests: Refaktorisiert - DRY für Test auf Offset-Fortschritt

2 years agoTests: Überprüft, ob überhaupt ein Offset-Fortschritt vorliegt
Kai Moritz [Sun, 10 Apr 2022 13:25:58 +0000 (15:25 +0200)]
Tests: Überprüft, ob überhaupt ein Offset-Fortschritt vorliegt

2 years agoTests: Offsets werden unter TopicPartition abgelegt
Kai Moritz [Sun, 10 Apr 2022 13:25:57 +0000 (15:25 +0200)]
Tests: Offsets werden unter TopicPartition abgelegt