demos/kafka/training
2 years agoConcurrency auf 2 gesetzt und Verzögerung eingebaut sumup-adder--springified--concurrency
Kai Moritz [Sat, 17 Sep 2022 09:16:26 +0000 (11:16 +0200)]
Concurrency auf 2 gesetzt und Verzögerung eingebaut

* Durch die künstliche Verzögerung von Nachrichten für `+klaus+` wird
  deutlich erkennbar, dass die Nachrichten jetzt durch 2 Threads
  verarbeitet werden.

2 years agoVereinfachte Version der auf Spring Kafka basierenden Implementierung sumup-adder--springified sumup-adder--springified---lvm-2-tage
Kai Moritz [Sun, 11 Sep 2022 17:58:02 +0000 (19:58 +0200)]
Vereinfachte Version der auf Spring Kafka basierenden Implementierung

2 years agoService ergänzt, der das Dead-Letter-Topic ausliest sumup-adder--rebalance-listener--springified
Kai Moritz [Fri, 16 Sep 2022 16:08:45 +0000 (18:08 +0200)]
Service ergänzt, der das Dead-Letter-Topic ausliest

2 years agoTest repariert: Explizite Consumer-Konfiguration für DLT-Consumer
Kai Moritz [Sun, 11 Sep 2022 13:52:12 +0000 (15:52 +0200)]
Test repariert: Explizite Consumer-Konfiguration für DLT-Consumer

* Der `DeadLetterTopicConsumer` wird jetzt explizit mit einem Consumer
  konfiguriert, der alle Nachrichten schlicht als `String` deserialisiert.
* Dadurch kommt es beim Einlesen der Nachrichten nicht mehr zu Fehlern
  und der Test arbeitet wie erwartet.
* Die Definitionen des Type-Mappings für den Producer werden daher
  nicht mehr benötigt.

2 years agoDer Test prüft die Anzahl der Einträge im DLT
Kai Moritz [Sun, 11 Sep 2022 13:24:27 +0000 (15:24 +0200)]
Der Test prüft die Anzahl der Einträge im DLT

* Der Test schlägt fehl, weil die Überprüfung aufdeckt, dass der
  `DeadLetterTopicConsumer wegen einer Fehlkonfiguration nicht in der
  Lage ist, die Poistion-Pill-Nachrichten einzulesen.
* Dies liegt daran, dass er die Consumer-Konfiguration der Anwendung
  verwendet und deswegen auch genau wie diese am Deserialisieren dieser
  Nachrichten scheitert.

2 years ago@KafkaListener im Test ergänzt, der das DLT mit liest
Kai Moritz [Sun, 11 Sep 2022 12:19:29 +0000 (14:19 +0200)]
@KafkaListener im Test ergänzt, der das DLT mit liest

2 years agoDLT auf Basis des `DeadLetterPublishingRecoverer` konfiguriert
Kai Moritz [Sat, 10 Sep 2022 18:41:06 +0000 (20:41 +0200)]
DLT auf Basis des `DeadLetterPublishingRecoverer` konfiguriert

* Der `DeadLetterPublishingRecoverer` muss explizit instanziiert werden.
* Um ihm den Spring-Kafka-Beans bekannt zu machen, muss die
  `DefaultErrorHandler`-Bean überschrieben werden.
* Der Recoverer wird dem Handler zusammen mit einer BackOff-Strategie
  übergeben.
* Damit der `DeadLetterPublishingRecoverer` die weiterzuleitenden
  Nachrichten senden kann, muss
* Der Producer benötigt scheinbar einen separaten Eintrag für
  `bootstrap-servers` unter `spring.kafka.producer`. Der Eintrag
  `spring.kafa.bootstrap-servers` wird hier nicht übernommen!

2 years agoAnzahl der Fehler für die Test-Logik verfügbar gemacht
Kai Moritz [Sun, 11 Sep 2022 11:42:57 +0000 (13:42 +0200)]
Anzahl der Fehler für die Test-Logik verfügbar gemacht

2 years agoAnwendung auf den Default-ErrorHandler umgestellt
Kai Moritz [Sat, 10 Sep 2022 17:19:15 +0000 (19:19 +0200)]
Anwendung auf den Default-ErrorHandler umgestellt

* Die Tests mussten entsprechend angepasst werden, da die Methode
  `EndlessConsumer.exitStatus()` aufgrund der Umstellung nicht mehr
  verfügbar ist.
* Die Logik der Tests wurde aber nicht geändert.
* Die Tests zeigen nur, dass die Anwendung sich nicht wie zuvor beendet.
* Durch manuelle Versuchen wurden folgende Erkenntnisse gewonnen:
** Im Fall eines Deserialisierungs-Fehlers begibt sich die Anwendung in
   eine Endlosschleife.
** Da, in der Fehlersituation keine Commits durchgeführt werden, hängt
   die Anwendung dann auch nach einem Neustart weiter in der
   Fehlerschleife.
** Im Fall eines Logik-Fehlers Startet ein Back-Off mit 10 Versuchen.
** Dabei werden nach jedem Fehler die Offsets für alle Partitionen für die
   der letzte `poll()` Nachrichten geliefert hatte, die noch nicht
   verarbeitet wurden, auf die nächste unverarbeitete Nachricht zurück
   gesetzt und anchließend wird `poll()` neu ausgeführt.
** Nach dem letzten Versuch springt die Anwendung über den Fehler hinweg.

2 years ago`EndlessConsumer` auf `@KafkaHandler` umgestellt
Kai Moritz [Sat, 10 Sep 2022 16:04:04 +0000 (18:04 +0200)]
`EndlessConsumer` auf `@KafkaHandler` umgestellt

* Mit `@KafkaHandler` können separate Handler-Methoden für die
  unterschiedlichen Nachrichten-Typen definiert werden, die die
  Anwendung empfängt (hier: über ein Topic, auch mögich: über
  verschiedene Topics).
* Die Tests mussten an die geänderte Implementierung angepasst werden.

2 years ago`EndlessConsumer` nimmt jetzt einzelne `ConsumerRecord`s entgegen
Kai Moritz [Sat, 10 Sep 2022 12:15:11 +0000 (14:15 +0200)]
`EndlessConsumer` nimmt jetzt einzelne `ConsumerRecord`s entgegen

* `@KafkaHandler` von Batch-Verarbeitung auf Einzel-Verarbeitung umgestellt.
* Den `ApplicationErrorHandler` um eine passende Fehler-Verarbeitung für
  die einzelne Verarbeitung der Nachrichten ergänzt
* Da der `MessageListenerContainer` nicht dazu zu bewegen ist, die
  Offset-Commits im Fehlerfall zu unterlassen, wird explizit ein Seek auf
  die Offset-Positionen der noch nicht verarbeiteten Nachrichten
  durchgeführt.
* Dabei wurde ein von Spring Kafka abgeschauter Trick verwendet: Es genügt,
  die bisher unverarbeiteten Nachrichten durchzugehen und jeweils den
  Offset der ersten Nachricht, die zu einer Partition gesehen wird, für
  den Seek vorzumerken. Denn wenn dabei für eine Partition keine Nachricht
  gefunden wird, hat entweder das letzte `poll() keine Nachricht zu der
  Partition geliefert, oder alle Nachrichten, die zu der Partition gehört
  haben, wurden erfolgreich verarbeitet. In beiden Fällen stimmt der
  Offset bereits, den die Kafka-Bibliothek intern pflegt, so dass kein
  Seek durchgeführt werden muss!
* Der Testfall wurde entsprechend angepasst und läuft daher in dieser
  Variante auch ohne Fehler, da der gespeicherte Zustand dadurch zu den
  bestätigten Offsets passt.

2 years agoAuf `@KafkaHandler` umgestellt
Kai Moritz [Sun, 4 Sep 2022 17:30:29 +0000 (19:30 +0200)]
Auf `@KafkaHandler` umgestellt

* Die Autoconfiguration über die Annotation `@EnableKafka` aktiviert
* Da die Autoconfiguration von Spring Kafka zieht, vereinfacht sich die
  Konfiguration:
** Spring Kafka erzeugt den benötigten `MessageListenerContainer`, der
   für die Anbindung der mit `@KafkaHandler` annotierten Methode
   benötigt wird automatisch und versorgt ihn mit einem passenden
   `KafkaConsumer`, so dass letzterer nicht mehr explizit erzeugt werden
   muss.
** Der Scheduler wird von Spring Kafka erzeugt und verwaltet, so dass
   nicht mehr explizit ein `ExecutorService` erzeugt und beendet werden
   muss.
** Der Rebalance-Listener wird automatisch eingebunden, der
   `ApplicationRebalanceListener` muss allerdings von der richtigen
   Spring-Klasse ableiten, damit er von der Autoconfiguration gefunden
   wird.
* Um das von dem Testfall erwartete Default-Verhalten des `KafkaConsumer`
  mit dem `MessageListenerContainer` zu simulieren, musste ein
  angepasster `ErrorHandler` implementiert werden.
* Der Code zum Exception-Handling und zum Schließen des `KafkaConsumer`
  in `EndlessConsumer` entfällt.
* Der Code zum Starten/Stoppen in `EndlessConsumer` kann einfach die
  entsprechende Methoden des `MessageListenerContainers aufrufen. Dafür
  muss er allerdings erst die passende Instanz aus einer Registry über
  die Client-ID erfragen.
* Der Testfall musste an die Autoconfiguration angepasst werden:
** Die `KafkaAutoConfiguration` muss hier explizit eingebunden werden.
** Da auch der Test einen `KafkaConsumer` benötigt, muss die in der
   Anwendung nicht mehr benötigte Factory jetzt explizit für den Test
   bereitgestellt werden.

2 years agoDer Test verwendet die `@Bean` von `EndlessConsumer`
Kai Moritz [Fri, 9 Sep 2022 10:44:54 +0000 (12:44 +0200)]
Der Test verwendet die `@Bean` von `EndlessConsumer`

* Per `git cherry-pick` vom Branch `deserialization` gepflückt.
* Conflicts:
** src/main/java/de/juplo/kafka/ApplicationConfiguration.java
** src/test/java/de/juplo/kafka/ApplicationTests.java
** src/test/java/de/juplo/kafka/GenericApplicationTests.java

2 years agoSpringify: Der Kafka-`Consumer` wird über die Spring-Factory erzeugt
Kai Moritz [Fri, 22 Apr 2022 09:24:55 +0000 (11:24 +0200)]
Springify: Der Kafka-`Consumer` wird über die Spring-Factory erzeugt

* Per `git cherry-pick` aus `springified-consumer--config' übernommen.
* Conflicts:
** src/main/java/de/juplo/kafka/ApplicationConfiguration.java
** src/test/java/de/juplo/kafka/ApplicationTests.java
* Damit Spring Kafka den Consumer instanziieren kann, musste insbesondere
  noch der Teil der Konfiguration, der fix ist, aus der Konfig-Klasse
  `ApplicationConfiguration` in die YAML-Datei `application.yml` verschoben
  werden:
** Die Auswahl des `StickyAssignor` als Partition-Assignment-Strategy
** Die Konfiguration der Deserialisierer

2 years agoSpringify: Konfiguration erfolgt über `KafkaProperties`
Kai Moritz [Fri, 22 Apr 2022 09:08:37 +0000 (11:08 +0200)]
Springify: Konfiguration erfolgt über `KafkaProperties`

* Per `git cherry-pick` aus `springified-consumer--config' übernommen.
* Conflicts:
** src/main/java/de/juplo/kafka/ApplicationConfiguration.java
** src/main/java/de/juplo/kafka/ApplicationProperties.java
** src/main/resources/application.yml
** src/test/java/de/juplo/kafka/ApplicationTests.java
* Anpassungen an `README.sh`, `docker-compose.yml` und `pom.xml` nachgeholt.

2 years agoSeparate Artefakt-/Image-ID für die JSON-Version des requests-Services
Kai Moritz [Sun, 4 Sep 2022 05:35:52 +0000 (07:35 +0200)]
Separate Artefakt-/Image-ID für die JSON-Version des requests-Services

* Die Version des Addierer-Services, die JSON-Nachrichten verarbeitet,
  hat jetzt eine explizite eigene Artefakt- und Image-ID.
* Außerdem wurde das Compose-Setup so umgestellt, dass es explizit die
  JSON-Version des Requests- und des Adder-Services verwendet.

2 years agoDer Adder verarbeitet zwei Typen von JSON-Nachrichten anstatt String
Kai Moritz [Sat, 3 Sep 2022 12:24:07 +0000 (14:24 +0200)]
Der Adder verarbeitet zwei Typen von JSON-Nachrichten anstatt String

* Bisher waren alle Nachrichten vom Typ `String`.
* Jetzt verarbeitet der Adder zwei unterschiedliche Typen von Nachrichten.
* Die Nachrichten werden als JSON übertragen und mit Hilfe des
  `JsonDeserializer` von Spring Kafka in zwei unterschiedliche
  Spezialisierungen einer Basis-Klasse deserialisiert.
* Die für die Deserialisierung benötigte Typen-Information wird von dem
  Spring-Kafka-Tooling über den die `__TypeId__` transportiert.
* D.h., damit die Nachrichten korrekt deserialisiert werden können, ist es
  _nicht_ nötig, dass der Typ der Nachricht von Jackson aus der Nachricht
  selbst abgeleitet werden kann, sondern dass sich Sender und Empfänger
  darüber verständigen, welchen Hinweis sie in dem `__TypeId__`-Header
  hinterlegen.
* Die Verarbeitung der zwei Nachrichten-Typen wurde in Unter-Methoden
  ausgelagert, da dies die Vergleichbarkeit des Codes zur der Variante
  mit `@KafkaHandler` erhöht.

2 years ago`maven-failsafe-plugin` aktiviert und den `ApplicationIT` repariert
Kai Moritz [Sun, 4 Sep 2022 13:55:35 +0000 (15:55 +0200)]
`maven-failsafe-plugin` aktiviert und den `ApplicationIT` repariert

* Das `maven-failsafe-plugin war nich scharf geschaltet, so dass nicht
  aufgefallen war, dass der Integration-Test `ApplicationIT` wegen
  fehlender Anpassungen gar nicht mehr lauffähig war.
* Anpassungen an dem Integration-Test nachgeholt.

2 years agoWechsel auf den `StickyAssignor` löst die Rebalance-Fehler
Kai Moritz [Tue, 30 Aug 2022 04:32:12 +0000 (06:32 +0200)]
Wechsel auf den `StickyAssignor` löst die Rebalance-Fehler

* Die durch Rebalances ausgelösten Zustand-Fehler bei regulären
  "Staffelübergaben" lassen sich vollständig durch ein Downgrade des
  `CooperativeStickyAssignor` auf den `StickyAssignor` lösen.
* *Achtung:* Der `StickyAssignor` verwendet das Eager-Protokoll.
* D.h., ein Down-Grade auf den `StickyAssignor` benötigt einen Reset
  der Gruppe, ist also nicht per Rolling Upgrade im laufenden Betrieb
  möglich.
* Vorführ-Skript so angepasst, dass man sofort sieht, dass diese
  Version alle regulären Rebalance-Fälle ohne Fehler durchführen kann.

2 years agoRückbau auf einen Consumer, der in `onPartitionsRevoked()` nicht committed sumup-adder--rebalance-listener
Kai Moritz [Sun, 28 Aug 2022 14:01:22 +0000 (16:01 +0200)]
Rückbau auf einen Consumer, der in `onPartitionsRevoked()` nicht committed

* Dadurch sollte es bei einem Rebalance i.d.R. zu Fehlern in dem
  mitgeführten Zustand kommen, da die Verarbeitung nur im Zufall an dem
  Offset fortegführt wird, für den der Zustand gespeichert wurde.
* Um das vorherige Verhalten der Implementierung wiederherzustellen,
  müssen insbesondere die commits im Falle eines ordentlichen
  Herunterfahrens und eines Deserialisierungs-Fehlers wieder
  ergänzt werden. Denn ansonsten bestätigt die Implementierung die
  Offsets für die zuletzt erfolgreich verarbeiteten Nachrichten nicht.
* Vorführ-Skript so angepasst, dass man sofort sieht, dass in dieser
  Version schon eine reguläre "Staffelübergabe" - also auch schon ein
  normales Rebalance, das einfach durch das Starten eines zweiten
  Consumers ausgelöst wurde - ein Fehler auftritt.

2 years agoKlar erkennbar gemacht, dass Staffelübergabe nur im Regelfall klappt sumup-adder--staffelübergabe
Kai Moritz [Wed, 31 Aug 2022 14:41:04 +0000 (16:41 +0200)]
Klar erkennbar gemacht, dass Staffelübergabe nur im Regelfall klappt

2 years agoVorführ-Skript überarbeitet: Vorgang durch andere Reihenfolge beschleunigt
Kai Moritz [Mon, 29 Aug 2022 16:59:29 +0000 (18:59 +0200)]
Vorführ-Skript überarbeitet: Vorgang durch andere Reihenfolge beschleunigt

* Dadurch das beide Consumer 1x ordentlich gestoppt werden, wird sowohl für
  `peter` als auch für `klaus` mal die Resultate in der Mongo-DB gespeichert.
* Da dies zuvor nur für einen der Nutzer geschehen ist, hat das Skript nach
  dem außerordentlichen Beenden eines Consumer sehr lange warten müssen,
  bis nach dem Neustart die Verarbeitung der angelaufenen Daten so weit
  fortgeschritten war, dass erste Resultate für beide Consumer sichtbar
  geworden sind.

2 years agoVorführ-Skript überarbeitet: Vereinfachte Abfrage für User-Zustand
Kai Moritz [Mon, 29 Aug 2022 16:54:27 +0000 (18:54 +0200)]
Vorführ-Skript überarbeitet: Vereinfachte Abfrage für User-Zustand

2 years agoRückbau auf einen Consumer, der in `onPartitionsRevoked()` immer committed
Kai Moritz [Sun, 28 Aug 2022 13:59:54 +0000 (15:59 +0200)]
Rückbau auf einen Consumer, der in `onPartitionsRevoked()` immer committed

* Entfernt wird hier das erweiterte Interface, für den Rebalance-Listener
  über den die Consumer-Implementierung die Commits für den Fehlerfall
  explizit deaktivieren kann.
* Die Staffelübergabe sollte damit weiterhin normal funktionieren. D.h.,
  solange der Consumer ordentlich heruntergefahren wird und nicht ein
  besonders hohes Nachrichten-Aufkommen angelegt wird.
* Vorführ-Skript so angepasst, dass deutlich wird, dass die
  "Staffelübergabe" nun funktioniert, wenn Consumer ordentlich gestopped
  werden, aber weiterhin Fehler auftreten, wenn ein Consumer
  außerordentlich beendet (hier: getötet) wird.

2 years agoFunktionsunabhängiger Name für das erweiterte Interface RebalanceListener sumup-adder--ohne--stored-offsets
Kai Moritz [Fri, 2 Sep 2022 03:22:50 +0000 (05:22 +0200)]
Funktionsunabhängiger Name für das erweiterte Interface RebalanceListener

2 years agoFalsch platzierte Methode aus RecordHandler entfernt
Kai Moritz [Fri, 2 Sep 2022 03:12:09 +0000 (05:12 +0200)]
Falsch platzierte Methode aus RecordHandler entfernt

2 years ago`ApplicationRecordHandler` gibt auch die Client-ID aus
Kai Moritz [Sat, 27 Aug 2022 17:15:32 +0000 (19:15 +0200)]
`ApplicationRecordHandler` gibt auch die Client-ID aus

* Conflicts:
** src/main/java/de/juplo/kafka/ApplicationRecordHandler.java

2 years agoFehler in Test-Implementierung korrigiert
Kai Moritz [Sat, 27 Aug 2022 09:50:07 +0000 (11:50 +0200)]
Fehler in Test-Implementierung korrigiert

2 years agoFehler im Commit-Verhalten korrigiert: Bei Logik-Fehler, kein Commit
Kai Moritz [Fri, 26 Aug 2022 11:52:48 +0000 (13:52 +0200)]
Fehler im Commit-Verhalten korrigiert: Bei Logik-Fehler, kein Commit

* Die Implementierung sieht vor, dass bei einer unerwarteten Exception
  (i.d.R. ein Fehler in der Fachlogik) kein Commit durchgeführt wird.
* Ansonsten müsste in der Situation ein expliziter Seek der Offstes auf
  die Positionen der vor dem Auftreten des Fehlers verarbeiteten
  Nachrichten durchgeführt werden, damit es nicht zu einem Verlust von
  Nachrichten kommt.
* Dieses Verhalten wurde durch die Verlagerung des Commits in den
  Rebalance-Listener unterwandert, da der Commit dort auch im Falle
  einer unerwarteten Exception durchgeführt wurde.
* Als Korrektur wurde hier eine Methode eingeführt, über die der
  Commit im Rebalance in dieser Situation unterdrückt werden kann.

2 years agoCode an die Implementierung in 'sumup-adder' angeglichen
Kai Moritz [Fri, 26 Aug 2022 09:31:55 +0000 (11:31 +0200)]
Code an die Implementierung in 'sumup-adder' angeglichen

2 years agoIm `ConsumerRebalanceListener` _muss_ `commitSync()` verwendet werden
Kai Moritz [Tue, 23 Aug 2022 16:43:55 +0000 (18:43 +0200)]
Im `ConsumerRebalanceListener` _muss_ `commitSync()` verwendet werden

* Genaugenommen ist auch `commitAsync()` möglich.
* Es ist jedoch nicht möglich, wie hier zuvor implementiert, `commitAsync()`
  mit einem `OffsetCallback` aufzurufen, in der Zwischenzeit die restlichen
  Aufräumarbeiten durchzuführen und anschließend auf den Callback zu warten.
* Grund: Die Callbacks werden von Kafka nicht direkt aufgerufen, wenn die
  Ergebnisse eintreffen, sondern erst, wenn das nächste mal `poll()`
  aufgerufen wird.

2 years ago`commitAsync()` in `onPartitionsRevoked()`
Kai Moritz [Tue, 23 Aug 2022 15:55:14 +0000 (17:55 +0200)]
`commitAsync()` in `onPartitionsRevoked()`

* Der Rebalance-Listener führt jetzt einen (zusätzlichen) Commit der
  Offsets durch.
* Ohne diesen Commit, kann es bei sehr hohem Nachrichten-Aufkommen dazu
  kommen, dass nicht die letztendliche Offset-Position gespeichert wird.
* Da jetzt implizit ein Commit in `onPartitionsRevoked()` durchgeführt
  wird, ist kein expliziter Commit mehr nötig, wenn der Consumer durch
  eine Exception unterbrochen wird, bei der sichergestellt ist, dass die
  zuletzt durch `poll()` gelieferten Nachrichten vollständig verarbeitet
  wurden.
** Bei einer `WakeupException` ist dies klar, da diese in `poll()`
   geworfen wurde, also _nachdem_ die Implementierung durch den Aufruf
   von `poll()` signalisiert hat, dass sie alle zuvor gelieferten
   Nachrichten vollständig verarbeitet hat.
** Bei einer `RecordDeserializationException` ist dies klar, da ein
   Fehler während der Deserialisierung der vom Broker empfangenen
   Nachrichten dazu führt, dass die Kafka-Client-Library die zuvor
   fehlerfrei deserialisierten Nachrichten ausliefert und dies auch
   entsprechend in den intern mitgeführten Offset-Positionen reflektiert.
* Der Commit wird hier asynchron durchgeführt.
* TODO: Das führt dazu, dass die Implementierung in dem Rebalance
  einfriert, da der Callback, auf den sie wartet, dort nie aufgerufen
  wird, da die Commit-Callbacks nur "synchron" abgearbeitet werden, wenn
  die `poll()`-Methode aufgerufen wird!

2 years ago.editorconfig ergänzt - siehe: ttps://editorconfig.org/
Kai Moritz [Tue, 23 Aug 2022 15:23:35 +0000 (17:23 +0200)]
.editorconfig ergänzt - siehe: ttps://editorconfig.org/

* Einziger gangbarer Weg, um IntelliJ beizubiegen, Leerzeichen für die
  Einrückung zu verwenden!
* ...aber auch für einige andere Dinge ganz praktisch...

2 years agoKonfig-Parameter zum künstlichen Verzögern der Verabeitung eingebaut
Kai Moritz [Mon, 22 Aug 2022 16:24:11 +0000 (18:24 +0200)]
Konfig-Parameter zum künstlichen Verzögern der Verabeitung eingebaut

2 years agoREADME.sh: Ausgabe der Ergebnisse der \`adder\`-Services verbessert
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.

2 years agoREADME.sh: `adder`-Services werden jetzt gelöscht anstatt gestoppt
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.

2 years agoImplementierung vereinfacht: Auf das Nötigste zusammengekürzt
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.

2 years agoLog-Meldungen zu gespeichertem und wiederhergestelltem Zustand
Kai Moritz [Sun, 21 Aug 2022 15:52:23 +0000 (17:52 +0200)]
Log-Meldungen zu gespeichertem und wiederhergestelltem Zustand

2 years agoSetup und Vorführ-Skript auf 2 adder- und requests-Services umgestellt
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

2 years agoLog-Meldung für durchgeführte Berechnungen bei Revoke korrigiert
Kai Moritz [Sat, 20 Aug 2022 16:13:50 +0000 (18:13 +0200)]
Log-Meldung für durchgeführte Berechnungen bei Revoke korrigiert

2 years agoCompose-Setup und Vorführ-Skript an die Übung angepasst
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.

2 years agoROT: (Erwartet!) Merge der Korrigierten Test-Logik und Erwartungen
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.

2 years agoGRÜN: Korrektur der falsch formulierten Erwartungen zu dem Consumer-Zustand
Kai Moritz [Fri, 19 Aug 2022 10:07:08 +0000 (12:07 +0200)]
GRÜN: Korrektur der falsch formulierten Erwartungen zu dem Consumer-Zustand

2 years agoROT: Merge der korrigierten Test-Logik deserialization -> into sumup-adder
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.

2 years agoROT: Korrigierten/Verbesserten Test und Überarbeitetes Setup gemerged
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.

2 years agoGRÜN: Fehler in der Test-Logik korrigiert
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.

2 years agoROT: Fehler in Test-Logik aufgedeckt
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.

2 years agoROT: (Ohne stored-offsets) Überprüfung der Fachlogik korrigiert
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.

2 years agoREADME.sh-Skript zur Demonstration des Setups überarbeitet
Kai Moritz [Wed, 17 Aug 2022 16:37:55 +0000 (18:37 +0200)]
README.sh-Skript zur Demonstration des Setups überarbeitet

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.