Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Event-Driven Architecture - 10 Jahre klüger

Event-Driven Architecture - 10 Jahre klüger

Von der https://www.software-architecture-alliance.de/2024

Vor zehn Jahren habe ich zum ersten Mal einen Vortrag über Event-driven Architecture gehalten. Kafka war gerade seit zwei Jahren Open Source und bei Version 0.8, und nur ein paar Wochen vorher war Java 8 erschienen, und die erste Version von Spring Boot. Damals war gerade das Label "reactive" populär, und so hieß er "From Enterprise To Reactive". Unter anderem habe ich das Saga-Pattern propagiert.

In den zehn Jahren habe ich einiges dazugelernt - musste aber vor allem auch vieles erst einmal verlernen. In diesem Vortrag ziehe ich eine kleine Bilanz: Welche Ansätze haben sich in den zehn Jahren bewährt, und welche waren für mich enttäuschend? (In welcher Kategorie wird wohl das Saga-Pattern wieder auftauchen?)

Nicht alles wird sich übertragen lassen, aber manche Einsicht kann vielleicht hilfreich sein.

Lutz Hühnken

October 23, 2024
Tweet

More Decks by Lutz Hühnken

Other Decks in Programming

Transcript

  1. @[email protected] EDA und ich.. - Mein erstes message-driven, asynchrones System:

    Bundesbank 2002 - An Event-Driven-Systemen gearbeitet z.B. für Zalando, ING, ista, Maersk - Zurzeit: Bank “green fieldˮ, mit Event-Driven Architecture, Microservices, DDD 2
  2. @[email protected] • Kleiner Rückblick auf die letzten 10 Jahre •

    3 Lehren aus 10 Jahren Event-Driven Architecture • 3 Lehren für die Arbeit als Architekt*in 3
  3. @[email protected] 4 4 Wer gleich raten möchte, diese Begriffe merken

    1. Actor System 2. Application Server 3. Cloud 4. DDD 5. Docker 6. Event Sourcing 7. Event-Driven Architecture 8. Kafka 9. Kubernetes 10. Message Queue 11. Microservices 12. Saga Pattern 13. Spring Boot
  4. @[email protected] 8 8 Microservices - die letzten 10 Jahre Kaum

    zu glauben, dass das vor 10 Jahren Application Server noch Standard waren. In der Java-Welt hat Spring Boot einen riesigen Beitrag geleistet zur “Umkehrungˮ des Ansatzes. Wenn wir heute von Event-Driven Architecture reden, meinen wir in der Regel Event-Driven Microservices.
  5. @[email protected] 9 9 Microservices - die letzten 10 Jahre Für

    das Problem, das sie lösen sollten - nämlich Teams, die gemeinsam an einem System arbeiten, zu erlauben, ihren Teil des Systems unabhängig von anderen zu deployen, zu skalieren, zu updaten, und möglicherweise mit einem anderen Tech Stack als die anderen - haben wir keine bessere Lösung.
  6. @[email protected] 12 12 Kafka - die letzten 10 Jahre Kafka

    ! Message Queue Kafka ist aus einer Nische zu dem Standard geworden. Das Architektur-Konzept “Log-based Message Brokerˮ hat sich als sehr geeignet für Event-Driven Architecture erwiesen. Manche kamen erst zu Kafka, und darüber (unfreiwillig?) zu EDA.
  7. @[email protected] 17 17 Domain-Driven Design - 10 Jahre Vor 10

    Jahren: Aggregates, Entities, Values, Repositories Schwerpunkt: Taktisches DDD. Heute: Bounded Contexts, Customer-Supplier, Conformist Schwerpunkt: Strategisches DDD. Das Thema war zwar durchgehend präsent, aber die Wahrnehmung hat sich geändert.
  8. @[email protected] 19 19 Actor Systems Aktoren sind nebenläufige Einheiten, die

    ausschließlich über Nachrichten kommunizieren. Aktoren können drei verschiedene Reaktionen durchführen: • Nachrichten an sich selbst oder andere Aktoren verschicken. • Neue Aktoren erzeugen. • Das eigene Verhalten ändern. Der Nachrichtenaustausch erfolgt asynchron, d. h. der Sender einer Nachricht kann nach dem Abschicken sofort mit anderen Aktionen fortfahren und muss nicht warten, bis der Empfänger die Nachricht akzeptiert.
  9. @[email protected] 23 23 Actor Systems, Event Sourcing - die letzen

    10 Jahre Vor 10 Jahren hätte ich gedacht, dass die Themen heute relevanter wären. Missverhältnis von “zu lösendes Problemˮ und Ungewohntheit / Notwendigkeit des Umlernens? Würde ich unter “gute Ideen, die sich nicht durchgesetzt habenˮ einsortieren.
  10. @[email protected] 30 30 EDA vor 10 Jahren Innerhalb des Services:

    Event Sourcing, Event Driven (vert.x (à la node.js), Aktoren, etc.) Zwischen den Services: Irgendwas HTTP, Websockets, RMI, Message Queue, Workflow Engine, Framework)
  11. @[email protected] 31 31 EDA heute Event Sourcing & lokales Eventing

    sind schwer vermittelbar. Die Leute lieben - anscheinend - CRUD 󰤇
  12. @[email protected] 33 33 Wenn ich die Events in der Outbox

    einfach niemals lösche, könnte ich die Tabelle jederzeit wegwerfen und aus den Events wiederherstellen 🤔 Transactional Outbox vs. Event Sourcing
  13. @[email protected] 36 36 EDA vor 10 Jahren Event Sourcing &

    lokales Eventing sind schwer vermittelbar. CRUD und Methodenaufrufe sind tief verankert. Aber ok: Für das, was wir heute erreichen wollen, ist die Kommunikation zwischen den Services ist das relevantere Problem.
  14. @[email protected] Event-Driven Architecture = Event-Driven Microservices Ziele: • Laufzeit-Abhängigkeit zwischen

    Services beseitigen • Verhindern eines “Verteilten Monolithenˮ Die einzelnen Services können intern CRUD nutzen. Interessante Updates werden über Events publiziert. 37 37 EDA heute
  15. @[email protected] 40 40 🚫 “Primär DatenˮPerspektive Es geht um Service-Kollaboration,

    nicht um Datenreplikation. Anti-Pattern: Generische “Updatedˮ Events bei denen der Empfänger raten muss, was der Änderungsgrund ist. Event-Typen haben dann keine fachliche Bedeutung Ubiquitous Language!. Aber Ergebnis z.B. einer Event-Storming-Session sind Trigger, nicht Daten-Events. Events sind die kleinste Einheit einer Story.
  16. @[email protected] 41 41 🚫 “Primär TriggerˮPerspektive Jeder Empfänger benötigt wahrscheinlich

    zumindest einige Attribute. Es gibt meistens mindestens einen Empfänger, der sich nicht für den Business-Prozess interessiert. Führt oft dazu, dass zusätzlich doch auch wide events generiert werden müssen (z.B. Bootstrapping, Analytics) (siehe auch Stream/Tabelle Dualität).
  17. @[email protected] 42 42 Events sind duale Wesen: Trigger und Daten

    Im Zweifelsfall: Verwende Wide Events, die den Grund der Änderung als Attribut enthalten. Erlaubt ein Schema per Topic Dualität Schema/Tabelle), aber jeder Event hat auch eine klare Business-Bedeutung (im Event Storming-Fall: kann einem Post-It™ zugeordnet werden).
  18. @[email protected] 43 43 EDA  10 Jahre klüger.. 1. Makroarchitektur

    zuerst 2. Duale Natur von Events 3. Finde den Flow
  19. @[email protected] 44 44 Finde den Flow Event Command Query Beschreibt

    Etwas, was in der Vergangenheit geschehen ist. Eine Absicht, eine Operation auszuführen und/oder Daten zu ändern. Eine Anfrage nach Daten zu einem oder mehreren Objekten.
  20. @[email protected] 46 46 Finde den Flow Event Command Query Beschreibt

    Etwas, was in der Vergangenheit geschehen ist. Eine Absicht, eine Operation auszuführen und/oder Daten zu ändern. Eine Anfrage nach Daten zu einem oder mehreren Objekten. Antwort Keine Bestätigung (oder Fehler) Die angefragten Daten Kommunikation Fire-and-Forget Request-Response Request-Response
  21. @[email protected] 49 49 Finde den Flow Events sind Fakten. Was

    die Abonnenten mit diesen Fakten machen, interessiert den Publizierer zur Laufzeit nicht. Events sind “Fire-and-Forgetˮ. Es gibt keinen Rückkanal. Nicht vergessen: Das Ziel ist, Laufzeitabhängigkeit zu beseitigen. Wenn ein Service zur Laufzeit auf die Antwort eines anderen warten muss, besteht eine Laufzeitabhängigkeit, egal, wie asynchron die Kommunikation ist.
  22. @[email protected] 50 50 Finde den Flow Die Konsequenz: Einen Business-Prozess

    umzusetzen, ist keine Implementierungsaufgabe. Es ist eine Architekturaufgabe, einen Event Flow zu finden, der das Businessziel umsetzt. Z.B. mit Event Storming, geht aber auch anders.)
  23. @[email protected] 51 51 EDA  10 Jahre klüger.. 1. Makroarchitektur

    zuerst 2. Duale Natur von Events 3. Finde den Flow
  24. @[email protected] 54 54 Pragmatisch = gut, prinzipientreu = dogmatisch, realitätsfern,

    schlecht ? 🤔 Aber: • Wenn wir uns Prinzipien geben, müssen wir sie auch ernst nehmen. • Es gibt falsch verstandenen Pragmatismus. Pragmatismus vs. Prinzipientreue
  25. @[email protected] 55 55 Falsch verstandener Pragmatismus 󰞹: Wir machen alles

    mit Events und Kafka. 󰠁: Aber hier benötige ich eine Response für meine Nachricht. 󰞹: Kein Problem. Dann legen wir einfach ein Response-Topic an, und dein Service abonniert das, und über die Correlation-ID findest du die Response zu deinem Event. Timeouts musst du irgendwie auch behandeln. Und das muss verteilt funktionieren und Crashes überstehen.
  26. @[email protected] 57 57 Richtige Antwort 󰞹: Wir machen alles mit

    Events und Kafka. 󰠁: Aber hier benötige ich eine Response für meine Nachricht. 󰞹: Dann sind wir irgendwo falsch abgebogen. Finde den Flow! Wenn es wirklich nicht anders geht: Kafka ist nicht das richtige Tool. Mache einen HTTP/gRPC Call.)
  27. @[email protected] 60 60 Pragmatismus vs. Prinzipientreue • Starte mit Prinzipien

    • Definiere Guidelines • Es ist nicht nur der Hammer in der Werkzeugkiste. Mache nicht die Lösung zum Ziel.
  28. @[email protected] 61 61 Architekturarbeit - 10 Jahre klüger.. 1. Sei

    prinzipientreu (aber pragmatisch) 2. Reduziere Komplexität
  29. @[email protected] 63 63 Erinnert euch an “Finde den Flowˮ. Business-Prozesse

    bilden komplexe Abläufe ab. Nehmt sie nicht als in Stein gemeißelt und findet komplexe Lösungen dafür. Nehmt die Herausforderung an, die Komplexität zu reduzieren! Komplexität
  30. @[email protected] 64 64 Architekturarbeit - 10 Jahre klüger.. 1. Sei

    prinzipientreu (aber pragmatisch) 2. Reduziere Komplexität 3. Investiere in Wirkung
  31. @[email protected] 67 67 EDA  10 Jahre klüger.. 1. Makroarchitektur

    zuerst 2. Duale Natur von Events 3. Finde den Flow
  32. @[email protected] 68 68 Architekturarbeit - 10 Jahre klüger.. 1. Sei

    prinzipientreu (aber pragmatisch) 2. Reduziere Komplexität 3. Investiere in Wirkung
  33. Was denkt ihr? Lasst uns diskutieren! Und bitte gebt eine

    Bewertung ab ⭐⭐⭐⭐⭐ 69 Mastodon @[email protected] LinkedIn https://linkedin.com/in/lutzh Blog https://www.reactivesystems.eu/