Kai Moritz [Mon, 22 Aug 2022 15:01:39 +0000 (17:01 +0200)]
README.sh: Ausgabe der Ergebnisse der \`adder\`-Services verbessert
* Übersichtlichere Ausgabe: sie wird nicht mehr umgebrochen und eingerückt.
* Umbruch nach der Ausgabe eines vollständiges Ergebnisses (durch das
Ausschalten von `--pretty` erzeugt `http` diesen nicht mehr automatisch.
Kai Moritz [Mon, 22 Aug 2022 15:00:09 +0000 (17:00 +0200)]
README.sh: `adder`-Services werden jetzt gelöscht anstatt gestoppt
* Dadurch ist immer nur das Log sichtbar, das durch/nach der letzten
Ausführung des Skriptes erzeugt wurde.
Kai Moritz [Sun, 21 Aug 2022 17:33:11 +0000 (19:33 +0200)]
Implementierung vereinfacht: Auf das Nötigste zusammengekürzt
* Das regelmäßige Speichern im Poll-Interval wird für die Übung nicht
benötigt.
* Damit entfällt auch das Interface
`PollIntervalAwareConsumerRebalanceListener`
* Die Vereinfachung hat eine Anpassung der Tests erfordert: Da in dem
Test, der überprüft, ob die Offsets korrekt committed werde, wenn kein
Fehler vorliegt, gar kein Rebalance auftritt, musste der Consumer
gestoppt werden, damit die Ergebnisse für die Überprüfung sichtbar
werden.
Kai Moritz [Sun, 21 Aug 2022 15:52:23 +0000 (17:52 +0200)]
Log-Meldungen zu gespeichertem und wiederhergestelltem Zustand
Kai Moritz [Sat, 20 Aug 2022 17:33:30 +0000 (19:33 +0200)]
Setup und Vorführ-Skript auf 2 adder- und requests-Services umgestellt
Kai Moritz [Sat, 20 Aug 2022 16:13:50 +0000 (18:13 +0200)]
Log-Meldung für durchgeführte Berechnungen bei Revoke korrigiert
Kai Moritz [Fri, 19 Aug 2022 14:17:35 +0000 (16:17 +0200)]
Compose-Setup und Vorführ-Skript an die Übung angepasst
* Die Mongo-DB muss vor dem Neu-Start gelöscht werden, da sie sonst noch
den alten Zustand enthält.
* Außerdem muss der `adder`-Service dabei gestoppt sein, da er sonst den
alten Zustand sofort neu anlegt, wenn die frisch erzeugte leere Mongo-DB
erreichbar wird.
* Das Skript außerdem weniger, timing-anfällig gemacht, indem es wartet,
bis der Zustand für den im Skript benutzten User sichtbar wird.
* Das Skript fasst das ausgegebene JSON außerdem mit `jq` und `uniq` so
zusammen, dass sofort erkennbar ist, ob es zu falschen Berechnungen
gekommen ist.
* Der im Skript benutzte User `peter` wartet jetzt zwischen den
Berechnungs-Anfragen nicht mehr und stellt größere Anfragen, damit es
sicherer zu falschen Berechnungen kommt -- (sonst kam es dazu, dass
der Consumer eh die letzte Berechnung vollständig ausgeführt hatte und
dann auf weitere Nachrichten gewartet und einen Commit gemacht hatte,
bevor er abgeschossen wurde, so dass alle Berechnungen vollständig waren)
* Der Auto-Commit von Kafka wurde auf 3 Sekunden verkürzt, und das Skript
an diese Zeit angepasst, so dass auf jeden Fall ein Commit erfolgt ist,
bevor der Consumer getötet wird.
Kai Moritz [Fri, 19 Aug 2022 10:36:36 +0000 (12:36 +0200)]
ROT: (Erwartet!) Merge der Korrigierten Test-Logik und Erwartungen
* Merge branch 'sumup-adder' into sumup-adder--ohne--stored-offsets
* ROT: Es wird erwartet, dass der Test anschlägt, da der Consumer bei
einem Logik-Fehler Nachrichten doppelt liest, so dass sich ein von
den Erwartungen abweichender Zustand ergibt.
Kai Moritz [Fri, 19 Aug 2022 10:07:08 +0000 (12:07 +0200)]
GRÜN: Korrektur der falsch formulierten Erwartungen zu dem Consumer-Zustand
Kai Moritz [Fri, 19 Aug 2022 09:53:58 +0000 (11:53 +0200)]
ROT: Merge der korrigierten Test-Logik deserialization -> into sumup-adder
* Der Merge korrigiert die grundsätzlichen Fehler der Test-Logik in
`GenericApplicationTests` durch den Merge des Fixes aus dem Branch
`deserialization`.
* Zusammen mit dem Merge von `sumup-adder--ohne--stored-offsets` der
einen Fehler der fachlichen Test-Logik in `ApplicationTests` korrigiert,
korrigiert dies die technichschen Fehler in der Test-Logik.
* ROT: Der Test schlägt trotzdem noch fehl, da die Annahmen über den
Zustand des Consumers falsch formuliert wurden.
Kai Moritz [Wed, 17 Aug 2022 20:51:10 +0000 (22:51 +0200)]
ROT: Korrigierten/Verbesserten Test und Überarbeitetes Setup gemerged
* Merge branch 'sumup-adder--ohne--stored-offsets' into sumup-adder.
* In dem gemergten Branch ist es nicht wichtig, wann genau die
Mongo-DB zwischen den Tests zurückgesetzt wird, da sie nur den Zustand
des Consumers enthält.
* Wenn die Offsets mit in der Mongo-DB gespeichert werden, ist es
wesentlich, an zu welchem Zeitpunkt während der Test-Vorbereitung
diese zurückgesetzt wird!
* ROT: Der verbesserte/verschärfte Test deckt Fehler in der Test-Logik auf.
Kai Moritz [Thu, 18 Aug 2022 21:36:22 +0000 (23:36 +0200)]
GRÜN: Fehler in der Test-Logik korrigiert
* Die Assertion, dass nach einem wiederholten Versuch, den Logik-Fehler
zu konsumieren nicht mehr Nachrichten konsumiert wurden, als für den
Test generiert wurden ist nicht gültig, da bei einem Logik-Fehler ja
gerade _kein_ Commit der zuletzt gelesenen Nachrichten erfolgt, da
dies dazu führt, dass der Offset für Partitionen erhöht wird, für die
vor dem Eintreten des Fehlers noch nicht alle Nachrichten gelesen
wurden, wenn nicht explizti Seek's für diese Partitionen durchgeführt
werden.
* Die Assertion, dass die Offset-Position nach einem Fehler der Offset-
Position _vor_ der Ausführung der Fachlogik entspricht ist falsch, da
durchaus Commits durchgeführt werden können, bevor der Fehler auftritt.
Daher wird jetzt explizit geprüft, dass
** Die Offset-Position für keine Partition größer ist, als der Offset
der dort zuletzt gesehenen Nachricht.
** UND mindestens eine Partition existiert, deren Offset _kleiner_ ist,
als der Offset der zuletzt gesehenen Nachricht.
Kai Moritz [Fri, 19 Aug 2022 09:10:52 +0000 (11:10 +0200)]
ROT: Fehler in Test-Logik aufgedeckt
* Einige Assertions in dem Test für die Offset-Position nach einem
Logik-Fehler waren fehlerhaft.
* Dies ist bisher nicht aufgefallen, weil der Test nicht scharf genug
war: Er hat so wenig Nachrichten gesendet, dass die fehlerhaften
Assertions nicht aufgefallen sind, weil es nie zu einem Commit gekommen
ist, bevor der Fehler ausgelöst wurde.
* TODO: Der Test ist wahrscheinlich immer noch in hohem Maße abhängig
von der Ausführungsgeschwindigkeit auf dem Test-System. Besser wäre
es, wenn die Verarbeitung künstlich gedrosselt würde, so dass die
Timing-Annahmen zu den asynchron ablaufenden Operationen nicht auf
das Testsystem abgestimmt werden müssen.
Kai Moritz [Wed, 17 Aug 2022 20:31:19 +0000 (22:31 +0200)]
ROT: (Ohne stored-offsets) Überprüfung der Fachlogik korrigiert
* Der ursprüungliche Test ist nicht korrekt angeschlangen
* Der Test Schlug nicht an, weil geprüft wurde, dass `AdderResults`
eine Teilmenge der insgesamt erwarteten Ergebnisse enthält, aber nicht
mehr und/oder andere Ergebnisse.
* Problem: `AdderResult` hat zum Zeitpunkt der Überprüfung überhaupt keine
Ergebnisse enthalten, da der Consumer nach dem Fehler alle Partitionen
abgegeben hat und entsprechend die Ergebnisse aus `AdderResult` entfernt
und gespeichert wurden.
* Daher wird jetzt gegen die in der Mongo-DB gespeicherten Ergebnisse
verglichen.
* Unterwegs verbessert / korrigiert:
** Falsches Assert-Statement entfernt (beim 2. Durchlauf können durchaus
mehr Nachrichten als erwartet empfangen werden, nämlich 2x weniger
als erwartet ;)
** Commit erfolgt alle 500ms
** Test realistischer gestaltet: Viel mehr Nachrichten und durcheinander.
** Der Fehler wird nicht nach der ersten Hand voll Nachrichten erzeugt,
sondern erst gegen Ende der generierten Nachrichten.
Kai Moritz [Wed, 17 Aug 2022 16:37:55 +0000 (18:37 +0200)]
README.sh-Skript zur Demonstration des Setups überarbeitet
Kai Moritz [Tue, 16 Aug 2022 16:58:10 +0000 (18:58 +0200)]
Verbesserungen und Fachlogik-Test aus 'sumup-adder' gemerged
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.
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.
Kai Moritz [Mon, 15 Aug 2022 20:15:17 +0000 (22:15 +0200)]
Die Ergebnisse werden gespeichert und sind via REST abrufbar
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.
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.
Kai Moritz [Mon, 15 Aug 2022 17:12:12 +0000 (19:12 +0200)]
GRÜN: Neue Erwartungen umgesetzt
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.
Kai Moritz [Mon, 15 Aug 2022 16:53:10 +0000 (18:53 +0200)]
fix: Fehlerhafte Erwartung korrigiert
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.
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...
Kai Moritz [Sun, 14 Aug 2022 17:04:47 +0000 (19:04 +0200)]
Benennung vereinheitlicht und projektunabhängig gemacht
Kai Moritz [Sun, 14 Aug 2022 16:25:54 +0000 (18:25 +0200)]
fix: In `onPartitionsAssigned()` wurde der Kafka-Offset ausgegeben
Kai Moritz [Sun, 14 Aug 2022 16:16:34 +0000 (18:16 +0200)]
GRÜN: Korrektur des über die verschärften Tests aufgedeckten Fehlers
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!
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
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.
Kai Moritz [Sun, 14 Aug 2022 13:26:26 +0000 (15:26 +0200)]
Anzahl der erzeugten Test-Nachrichten wird vom `RecordGenerator` bestimmt
Kai Moritz [Sat, 13 Aug 2022 15:58:22 +0000 (17:58 +0200)]
GRÜN: Erwartungen implementiert
Kai Moritz [Sat, 13 Aug 2022 15:57:38 +0000 (17:57 +0200)]
ROT: Übersehene Erwartung an SumBusinesLogic.endSum(String) ergänzt
Kai Moritz [Sat, 13 Aug 2022 15:56:41 +0000 (17:56 +0200)]
refactor: Benennung der Fachlogik-Tests vereinheitlicht
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.
Kai Moritz [Sun, 14 Aug 2022 11:26:08 +0000 (13:26 +0200)]
Namen der Test-Klassen korrigiert
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.
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.
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.
Kai Moritz [Sun, 14 Aug 2022 08:54:27 +0000 (10:54 +0200)]
`ApplicationTest` auf basis der typisierbaren Basis neu implementiert
Kai Moritz [Sun, 14 Aug 2022 07:54:45 +0000 (09:54 +0200)]
Typisierbare Basis-Klasse `GenericApplicationTests` eingeführt
Kai Moritz [Sat, 13 Aug 2022 14:10:28 +0000 (16:10 +0200)]
GRÜN: Erwartungen implementiert
Kai Moritz [Sat, 13 Aug 2022 14:02:25 +0000 (16:02 +0200)]
ROT: Erwartungen an SumBusinessLogic.addToSum(String, Integer)
Kai Moritz [Sat, 13 Aug 2022 13:35:44 +0000 (15:35 +0200)]
GRÜN: Erwartungen implementiert
Kai Moritz [Sat, 13 Aug 2022 13:34:31 +0000 (15:34 +0200)]
ROT: Erwartungen an SumBusinessLogic.endSum(String)
Kai Moritz [Sat, 13 Aug 2022 13:24:53 +0000 (15:24 +0200)]
GRÜN: Erwartungen implementiert
Kai Moritz [Sat, 13 Aug 2022 13:24:16 +0000 (15:24 +0200)]
ROT: Erwartungen an SumBusinessLogic.getSum(String)
Kai Moritz [Sat, 13 Aug 2022 13:19:54 +0000 (15:19 +0200)]
GRÜN: Erwartungen implementiert
Kai Moritz [Sat, 13 Aug 2022 13:17:01 +0000 (15:17 +0200)]
ROT: Erwartungen an SumBusinessLogic.startSum(String)
Kai Moritz [Sat, 13 Aug 2022 11:35:51 +0000 (13:35 +0200)]
Demonstration für das Wordcount-Beispiel angepasst
Kai Moritz [Sat, 13 Aug 2022 10:37:27 +0000 (12:37 +0200)]
Demonstration in README.sh gepimped
Kai Moritz [Sat, 13 Aug 2022 09:44:13 +0000 (11:44 +0200)]
Verbesserte/Erweiterte Tests aus 'stored-offsets' nach 'wordcount' gemerged
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
Kai Moritz [Fri, 12 Aug 2022 21:18:19 +0000 (23:18 +0200)]
Integration-Test hinzugefügt, um die Lauffähigkeit der App sicherzustellen
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
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.
Kai Moritz [Fri, 12 Aug 2022 15:40:11 +0000 (17:40 +0200)]
Verbesserungen aus 'deserialization' nach 'stored-offsets' gemerged
Kai Moritz [Fri, 12 Aug 2022 15:32:24 +0000 (17:32 +0200)]
Refaktorisierungen aus 'wordcount' nach 'stored-offsets' zurück portiert
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.
Kai Moritz [Fri, 12 Aug 2022 09:53:46 +0000 (11:53 +0200)]
refactor: Handling der Partitionen in WordcountRebalanceListener
Kai Moritz [Fri, 12 Aug 2022 09:13:54 +0000 (11:13 +0200)]
refactor: RebalanceListener als eigenständige Klasse
Kai Moritz [Thu, 11 Aug 2022 18:52:35 +0000 (20:52 +0200)]
refactor: Implementierung an Branch `stored-offsets` angepasst
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.
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.
Kai Moritz [Sun, 24 Jul 2022 17:32:51 +0000 (19:32 +0200)]
Auf den `CooperativeStickyAssignor` umgestellt
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.
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!
Kai Moritz [Sun, 24 Jul 2022 15:40:36 +0000 (17:40 +0200)]
Fehler im Shutdown-Code korrigiert: Shutdown von `EndlessConsumer` zu spät
Kai Moritz [Sun, 24 Jul 2022 15:18:02 +0000 (17:18 +0200)]
mongo-express sollte erst nach der MongoDB gestartet werden
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.
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.
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).
Kai Moritz [Tue, 26 Jul 2022 14:21:17 +0000 (16:21 +0200)]
Test prüft ungültige und unbekannte Nachrichten
Kai Moritz [Tue, 26 Jul 2022 14:11:45 +0000 (16:11 +0200)]
Verbesserungen des Testfalls gemerged (Branch 'deserialization')
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.
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.
Kai Moritz [Tue, 26 Jul 2022 09:38:54 +0000 (11:38 +0200)]
Deserialisierung von Nachrichten unterschiedlichen Typs
Kai Moritz [Tue, 26 Jul 2022 10:52:23 +0000 (12:52 +0200)]
Refaktorisierungen des Testfalls gemerged (Branch 'deserialization')
Kai Moritz [Tue, 26 Jul 2022 10:42:45 +0000 (12:42 +0200)]
Verwendung eines weniger verwirrenden Key in Tests (fachlich irrelevant)
Kai Moritz [Tue, 26 Jul 2022 10:40:45 +0000 (12:40 +0200)]
Erzeugung von ProducerRecord in Test refaktorisiert
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.
Kai Moritz [Sat, 23 Jul 2022 14:17:42 +0000 (16:17 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('deserialization')
Kai Moritz [Sat, 23 Jul 2022 14:15:29 +0000 (16:15 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('rebalance-listener')
Kai Moritz [Sat, 23 Jul 2022 13:58:44 +0000 (15:58 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('stored-state')
Kai Moritz [Sat, 23 Jul 2022 13:58:16 +0000 (15:58 +0200)]
README.sh startet MongoDB und Mongo-Express
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.
Kai Moritz [Sat, 23 Jul 2022 13:35:01 +0000 (15:35 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('counting-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.
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.
Kai Moritz [Sat, 23 Jul 2022 08:37:24 +0000 (10:37 +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 [Sat, 30 Apr 2022 09:38:26 +0000 (11:38 +0200)]
Merge branch 'deserialization' into springified-consumer--serialization
Kai Moritz [Sat, 30 Apr 2022 09:36:13 +0000 (11:36 +0200)]
Fehler in Shutdown-Logik für den `ExecutorService` korrigiert
Kai Moritz [Sat, 30 Apr 2022 09:34:38 +0000 (11:34 +0200)]
Merge branch 'rebalance-listener' into deserialization
Kai Moritz [Sat, 30 Apr 2022 09:24:34 +0000 (11:24 +0200)]
Merge branch 'endless-stream-consumer' into rebalance-listener
Kai Moritz [Sat, 30 Apr 2022 09:22:41 +0000 (11:22 +0200)]
HealthIndicator implementiert: Implementierung selbst vergessen :/
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.
Kai Moritz [Sun, 17 Apr 2022 11:44:49 +0000 (13:44 +0200)]
Springify: Nachrichten-Typ wird über den Type-Info-Header bestimmt