a business rule that must always be consistent. There are different kinds of consistency. One is transactional, which is considered immediate and atomic. There is also eventual consistency. When discussing invariants, we are referring to transactional consistency. - Vaughn Vernon, Effective Aggregate Design
Positionen public class Bestellung { private final int bestellnummer; private BigDecimal gesamtsumme = BigDecimal.ZERO; private List<Position> positionen = new ArrayList<>(); public Bestellung(int bestellnummer) { this.bestellnummer = bestellnummer; } public void NehmePositionAuf(int anzahl, int sku, BigDecimal betrag) { int nummer = this.positionen.size(); Position pos = new Position(nummer, anzahl, sku, betrag); this.positionen.add(pos); this.gesamtsumme = this.gesamtsumme.add(pos.betrag); } // mehr }
a significant process or transformation in the domain is not a natural responsibility of an ENTITY or VALUE OBJECT, add an operation to the model as standalone interface declared as a SERVICE. Define the interface in terms of the language of the model and make sure the operation name is part of the UBIQUITOUS LANGUAGE. Make the SERVICE stateless. - Eric Evans, Domain-Driven Design
und Zahlung) • Persistenz muss (verteilte) DB-Transaktionen erlauben • Anforderungen an Infrastruktur leaken in Domäne (muss implizit modelliert werden, ohne dass in der Domäne eine entsprechende Anforderung existiert)
(mit jeweils eigener DB) • externe Systeme/Legacy Software • 2PC häufig keine Option • 2PC-Coordinator ist SPOF • Performance • bei vielen DBs/externen System nicht möglich • CAP-Theorem: -Availability
Aggregate so modellieren, dass pro DB-Transaktion genau ein Aggregat geupdated wird • führt jedoch schnell zu großen “Cluster Aggregaten” Vaughn Vernon: Effective Aggregate Design, Part I: Modeling a Single Aggregate
(sinnvoll?) • Informationen müssen ausgetauscht werden • führt in (Geschäfts-)Prozessen, die mehrere Aggregate umfassen, zwangsläufig zu eventual consistency • diese muss überwacht/gesteuert werden => Prozessmanager
verspätet erfolgen (Liquidität) • Bsp.: Ergebnis/nächster Schritt erst später bekannt (z.B. Bestellung - Zahlungseingang - Verpackung - Versand) • Lösung: Zustand des Prozesses speichern => Prozesse benötigen eine ID
consistency explizit und koordiniert Aggregate / Systeme • reagiert auf Ereignisse (z.B. Commands, Events, Zeit) • hat Zustand (mind. aktueller Prozessfortschritt) => “correlation ID” • Prozessmanager ist selbst ein Aggregat - Invarianten? • kann natürlich auch event sourced sein
Microservices hinweg nicht möglich • (nicht-technische) Fehler in der Domäne explizit modellieren • für jeden Fehlerfall eine Aktion: • => Domänenexperten • => Compensating Action • => wenn nicht klar: Benutzer entscheiden lassen
• Betreuer können immer nur eine Einheit gleichzeitig durchführen • Schüler können immer nur an einer Stunde gleichzeitig teilnehmen • jede Stunde muss dokumentiert werden • Dokumentation in der Regel nachträglich (abends, WE)
• Betreuer können immer nur eine Einheit gleichzeitig durchführen • Schüler können immer nur an einer Stunde gleichzeitig teilnehmen • jede Stunde muss dokumentiert werden
als Ergebnis 0..n Nachrichten • Aggregate lassen sich sogar pure implementieren: (state, nachricht) -> (state') bzw. (nachrichten[], nachricht) -> nachrichten'[] • eine DB-Zeile pro DB-Transaktion (State-Persistenz) bzw. ein Stream pro DB-Transaktion (event sourced) • sonst keine Seiteneffekte • => kein Locking notwendig => massiv parallel verarbeitbar
• empfängt eindeutig adressierte Nachrichten (Aggregat ID) • arbeitet sie der Reihe nach ab (Posteingang) • pro Nachricht eine DB-Transaktion (ggfs. Batching) • Implementierung der Aktoren funktional oder objektorientiert • Nachrichten in Smalltalk näher am Aktorenmodell als an heutigen objektorientierten Sprachen I invented the term object-oriented, and I can tell you that C++ wasn't what I had in mind. - Alan Kay (Smalltalk-Erfinder)
Invarianten in Aggregaten (consistency boundaries) • unverzichtbar für langlebige Geschäftsprozesse (mit Zeitelement) • Nachrichtengetriebene Architektur natürliche Wahl, da nah an der Domäne, einfach zu implementieren, wenig Kopplung • ideale Ergänzung zum Event Sourcing und Event Storming (Trigger!) • extrem skalierbar • Aktorenmodell natürliche Erweiterung