Event-basierte Systeme: Probleme beim Behandeln von doppelten Nachrichten

Bei meinem aktuellen Kunden existieren verschiedene Mikroservices, die in der Regel asynchron über Nachrichten miteinander kommunizieren. Die Services senden dabei Nachrichten über fachliche Ereignisse (wie bspw. „Rechnung gebucht“ oder „Wareneingang gebucht“) ohne dass sie wissen, für welche anderen Microservices diese relevant sind. Letztere können sich dann auf diese Ereignisse registrieren und diese behandeln, bspw. um nach einem Wareneingang den Bestand für einen Artikel zu erhöhen. Hier fängt das Problem schon an, denn man kann nicht davon ausgehen, dass eine Nachricht nur genau einmal zugestellt wird. Die Nachrichten bei meinem Kunden werden mindestens einmal zugestellt. Damit bspw. eine Nachricht über einen Wareneingang, die mehrmals verarbeitet wird, den Bestand trotzdem nur einmal erhöht., müssen diese dedupliziert werden. Unsere Idee war, diese Deduplizierung über fachliche Attribute, die wir in der Nachricht sowieso mitsenden, durchzuführen. Das klang und funktionierte lange gut, aber im Folgenden soll es darum gehen, warum dieses am Ende zu Problemen führen kann.

Weiterlesen

Why TypeScripts never type is super useful

At first glance, the never type  does not sound very useful for everyday coding. But actually, the following property of the type comes in very handy:

[…] The never type is assignable to every type; however, no type is assignable to never (except never itself) […]

With a small hack, this can be used to increase the type safety of a code base with no risk of breaking existing code and without any runtime overhead.

Weiterlesen

Functional programming + DDD = ❤

Using Domain Driven Design (in short DDD) it is common to follow the principles of hexagonalonion or ports and adapters architecture. This means that your domain logic should be independent from how it is connected to the outside world. For instance you shouldn’t see any messaging or REST specific logic in domain logic.  Even though this sounds easy, in past projects I came across loads of messy code when connecting the outside world (like a REST Endpoint) with the domain. Doing it in a more functional way using functions solves a lot of problems and leads to cleaner code. I want to share this in this blog post.

Weiterlesen

Troubleshooting karma (node) performance problems

After some months of nothing but backend development I started to work on my customers Angular frontend application again. I noticed that starting a single karma test took way longer than it used to be. A simple test for a pure function in headless chrome took about half a minute, in which the actual test only took some milliseconds. That was really annoying, because in my current refactoring task I have to execute lots of tests very often. Searching, browsing the karma issues and so on didn’t help, so I want to describe, how I found out what has been causing the problems. 

Weiterlesen

Metriken, Alerts und die Nadel im Heuhaufen

Bei meinem Kunden haben wir einige Schleifen mit Metriken und Alerts hinter uns. Die ersten Metriken und Alerts haben am Anfang dazu geführt, dass die Anwendung nur noch mit hohem manuellen Aufwand betreibbar war, da man quasi den einen wichtigen Alert in dem Haufen von anderen ggf. unwichtigeren Alerts nicht gefunden hat. Die Erfahrung und unsere aktuelle Lösung möchte ich hier gerne weitergeben.

Weiterlesen

Custom protocol mapper zur Anpassung des Keycloak JWT Tokens

Per Default schreibt Keycloak viele Dinge in den JWT token, wie zum Beispiel den bevorzugten Benutzernamen. Wenn das nicht genug ist, gibt es viele bereits eingebaute so genannte protocol mappers mit denen der JWT token, erzeugt von Keycloak,  noch mehr angepasst werden kann. Manchmal sind die eingebauten protocol mappers nicht genug. In diesem Fall können selbstgeschriebene protocol mapper Keycloak hinzugefügt werden. Ich habe hierfür eine Beispielprojekt bei github erstellt.

Leichgewichtige Architekturvalidierung mit ArchUnit

In meinem vergangenen Projekt mit mehreren zehntausend Zeilen Code fand ich jQAssistant gut, um einen Überblick über den Code zu bekommen und Architekturregeln einfach zu validieren. Siehe dazu auch meinen vorherigen Blogpost.

Aktuell arbeite ich in einem Projekt, das vor zwei Jahren auf der grünen Wiese gestartet ist. Dieses besteht aus mehreren Mikroservices und einem Angular Frontend. Nun ist es allerdings so, dass bei einem unser wichtigen größeren Services (ca. 7000 LOC), in dem sehr viel Fachlichkeit steckt, mir immer häufiger Verletzungen unserer hexagonalen Architektur aufgefallen sind – bspw. Zugriffe von Domänen Klassen auf Klassen des REST Ports.  Dabei handelte es sich häufig um Flüchtigkeitsfehler. Die Setupkosten von jQAssistant waren mir bisher für diese kleinen Services zu hoch. Daher habe ich nach einer „leichgewichtigen“ Alternative gesucht mit der ich des Wildwuchses Herr werden konnte und bin dann bei ArchUnit fündig geworden.

Weiterlesen

Nie wieder mühsam Code nach Mustern durchsuchen

Letztes Jahr habe ich den empfehlenswerten Steering Agile Architecture Kurs von Tudor Girba bei it-agile besucht. Der Aha-Effekt in diesem Kurs kam für mich, als es hieß, die gängige Vorgehensweise bei der Softwareentwicklung sei auf dem Stand der Technik von 1939. Damals wurden vier Millionen Fahrkarten unter immensen Kosten von Hand analysiert, um die Weiterentwicklung des Londoner U-Bahn-Systems zu steuern. Heute würde man dieselben Informationen innerhalb von Sekunden von Servern berechnet bekommen. Laut Tudor Girbas These ähnelte die aktuelle Vorgehensweise in der Softwareentwicklung sehr dem Zählen der Fahrscheine 1939. Um die Gemeinsamkeiten und mögliche Gegenmaßnahmen soll es in diesem Blog Beitrag gehen.

Weiterlesen

Voice user interface design mit Amazon Alexa

Ich war kürzlich auf einem von Amazon veranstalteten ganztägigen Workshop zum Thema Alexa hier in Hamburg und vorher auch schon mal bei einem Meetup der AWS User Group zu demselben Thema. Die Quintessenz aus beiden ist, dass die Prinzipien nach denen ein Voice User Interface (bspw. mit Alexa) entwickelt werden sollte, grundlegend von den Prinzipien nach dem bspw. eine Weboberfläche designed wird, abweicht. Eine Weboberfläche eins zu eins in eine Voice UI zu übersetzen, funktioniert nicht. Um einige dieser grundlegenden Prinzipien soll es im Folgenden gehen.

Weiterlesen

Hypermedia Links einer REST API in einem Client als ID nutzen

Schreibt man einen HTML Client für einen REST Api, so stellt sich die Frage, wie man die Urls des HTML Clients aufbaut. Auch die Url im HTML Client sollte dabei eindeutig zu einer Resource passen, damit man den Links auf die Seite des HTML Clients verschicken kann. Man muss also aus der Url des HTML Clients geschickt die Url der REST Api ableiten können. Darum soll es im Folgenden gehen.

Weiterlesen