Einen Monolithen ablösen, ohne den Betrieb zu gefährden
Bei einem Energieversorger läuft die Marktkommunikation – An- und Abmeldungen, Zählerstände – über einen PHP-Monolithen, der als nicht mehr wartbar gilt. Er muss abgelöst werden, ohne dass der Betrieb stockt.
Versand und Aufbereitung von Marktdaten aus dem Monolithen herauslösen – Schritt für Schritt und im laufenden Betrieb.
Neue Anwendungen und Bibliotheken in Kotlin und Java mit Spring Boot auf AWS, aufgebaut nach hexagonaler Architektur.
Der gesamte Versand von Marktdaten läuft über die neuen Anwendungen. Die Aggregation verarbeitet im Lasttest 70.000 Marktdaten in unter einer Minute, und der Monolith läuft stabiler.
- 70.000
- Marktdaten im Lasttest in unter einer Minute aggregiert
- ≈ 10 %
- des Monolithen abgelöst
- 6
- Bibliotheken und Anwendungen gebaut
Ein System, das niemand mehr anfassen will
Der Monolith verschickt Marktnachrichten an andere Marktteilnehmer und fasst Marktdaten zusammen. Er gilt als nicht mehr wartbar, und große Datenmengen zu aggregieren war für ihn eine fast unlösbare Aufgabe.
Ihn in einem Schritt zu ersetzen, wäre zu riskant gewesen. Deshalb wird er Stück für Stück abgelöst: Jede neue Anwendung übernimmt einen klar abgegrenzten Teil.
Hexagonal – und eine Vorlage für die Abteilung
Ich habe die neuen Anwendungen nach hexagonaler Architektur aufgebaut: Die Fachlogik kennt weder Datenbank noch Messaging. Adapter für AWS, PostgreSQL und Schnittstellen sind austauschbar und einzeln testbar.
Dieser Aufbau dient in der Abteilung inzwischen als Vorlage für weitere Anwendungen.
- 6 Bibliotheken und Anwendungen in Kotlin und Java
- Messaging über SQS und SNS, Daten in S3 und Aurora PostgreSQL
- Tests mit Testcontainers, WireMock und LocalStack
Schneller und stabiler
Der gesamte Versand von Marktdaten läuft heute über die neuen Anwendungen, ebenso ihre Aggregation und Zusammenfassung. Rund 10 % des Monolithen sind abgelöst, und der verbleibende Teil läuft seitdem stabiler.
Im ersten Lasttest hat die neue Aggregation 70.000 Marktdaten in unter einer Minute verarbeitet. Für das Altsystem war das praktisch nicht zu leisten.
Damit das Neue nicht das nächste Altsystem wird
Ich habe die neuen Anwendungen von Java 21 auf Java 25 und von Spring Boot 3 auf Spring Boot 4 gehoben und Renovate eingeführt. Abhängigkeiten werden seitdem automatisch aktuell gehalten.
- Kotlin
- Java 25
- Spring Boot 4
- AWS S3
- SQS
- SNS
- EKS
- Aurora PostgreSQL
- Terraform
- Kubernetes
- Flyway
- Testcontainers
- WireMock
- LocalStack
