Eine auf Microservices basierende Architektur umzusetzen, bedeutet, dass auch die Datenhaltung auf die verschiedenen Services verteilt werden muss. Was aber bedeutet das in der Praxis? Was ist, wenn Daten einer Entität - vollständig oder in Teilen - in mehreren Services benötigt werden? Wie wird referenzielle Integrität über mehrere Services hinweg realisiert? Wie lassen sich serviceübergreifende Transaktionen realisieren? Dies sind nur einige von vielen Fragen, die im Rahmen der Session beantwortet werden. So viel vorab: Umdenken ist gefragt!
23. #WISSENTEILEN
Cust
Orders
GET customerorders/123 …
Konzept:
Ein spezieller Service
CustOrders liefert die
gewünschte Übersicht.
Herausforderung:
Die dafür benötigten
Infos der Kunden und
Bestellungen liegen in
unterschiedlichen
Services.
? Orders
Customer
24. #WISSENTEILEN
Lösungsidee:
Ein spezieller Service
CustOrders liefert die
gewünschte Übersicht
via API Composition.
Herausforderung:
Die dafür benötigten
Infos der Kunden und
Bestellungen liegen in
unterschiedlichen
Services.
Cust
Orders
Orders
Customer
GET customerorders/123 …
25. #WISSENTEILEN
Lösungsidee:
Ein spezieller Service
CustOrders liefert die
gewünschte Übersicht
via API Composition.
Herausforderung:
Die dafür benötigten
Infos der Kunden und
Bestellungen liegen in
unterschiedlichen
Services.
Cust
Orders
Orders
Customer
GET customerorders/123 …
Aufruf der
Data Owner APIs*
Data Owner
*Integration der Daten
lesend via Data Owner
schreibend via Data Owner
26. #WISSENTEILEN
Koordination der Aufrufe
Lösungsidee:
Ein spezieller Service
CustOrders liefert die
gewünschte Übersicht
via API Composition.
Herausforderung:
Die dafür benötigten
Infos der Kunden und
Bestellungen liegen in
unterschiedlichen
Services.
Cust
Orders
Orders
Customer
27. #WISSENTEILEN
Koordination der Aufrufe
Aggregation der Ergebnisse
Lösungsidee:
Ein spezieller Service
CustOrders liefert die
gewünschte Übersicht
via API Composition.
Herausforderung:
Die dafür benötigten
Infos der Kunden und
Bestellungen liegen in
unterschiedlichen
Services.
Cust
Orders
Orders
Customer
28. #WISSENTEILEN
Koordination der Aufrufe
Aggregation der Ergebnisse
Resilience im “Fall des Falles“
Lösungsidee:
Ein spezieller Service
CustOrders liefert die
gewünschte Übersicht
via API Composition.
Herausforderung:
Die dafür benötigten
Infos der Kunden und
Bestellungen liegen in
unterschiedlichen
Services.
Cust
Orders
Orders
Customer
29. #WISSENTEILEN
Koordination der Aufrufe
Aggregation der Ergebnisse
Resilience im “Fall des Falles“
btw: starre Kopplung
Lösungsidee:
Ein spezieller Service
CustOrders liefert die
gewünschte Übersicht
via API Composition.
Herausforderung:
Die dafür benötigten
Infos der Kunden und
Bestellungen liegen in
unterschiedlichen
Services.
Cust
Orders
Orders
Customer
!
30. #WISSENTEILEN
Cust
Orders
Lösungsidee #2:
Ein spezieller Service
CustOrders hält die
gewünschte Übersicht in
einer eigenen DB vor.*
GET customerorders/123 …
* Database-per-Service Pattern
benötigte Daten von
Customer & Order
Herausforderung:
Die dafür benötigten
Infos der Kunden und
Bestellungen liegen in
unterschiedlichen
Services.
31. #WISSENTEILEN
Cust
Orders
Orders
Customer
Lösungsidee #2:
Ein spezieller Service
CustOrders hält die
gewünschte Übersicht in
einer eigenen DB vor.*
Herausforderung #2:
Änderungen an den
Originaldaten müssen
propagiert werden.
?
* Database-per-Service Pattern
Data change
benötigte Daten von
Customer & Order
32. #WISSENTEILEN
Cust
Orders
Orders
Customer
Data change
benötigte Daten von
Customer & Order
Domain Event:
„Order changed“
Lösungsidee #2+:
Der CustOrders Service
wird via Domänen-Event
über die Änderung
“informiert“.
Herausforderung #2:
Änderungen an den
Originaldaten müssen
propagiert werden.
*Integration der Daten
lesend via Replikat
schreibend via Data Owner
33. #WISSENTEILEN
Cust
Orders
Orders
Customer
*Integration der Daten
lesend via optimiertem Replikat
schreibend via Data Owner
Data change
Domain Event:
„Order changed“
„Materialized View“*
CustumerOrders
Lösungsidee #2+:
Der CustOrders Service
wird via Domänen-Event
über die Änderung
“informiert“.
Herausforderung #2:
Änderungen an den
Originaldaten müssen
propagiert werden.
34. #WISSENTEILEN
Cust
Orders
Orders
Customer
Data change
Domain Event:
„Order changed“
Lösungsidee #2+:
Der CustOrders Service
wird via Domänen-Event
über die Änderung
“informiert“.
Herausforderung #2:
Änderungen an den
Originaldaten müssen
propagiert werden.
Order NEW
Order OLD
WARNING:
Eventual Consistency, d.h.
Original und Replikat sind
für einen kurzen Augenblick
out-of-sync!
35. #WISSENTEILEN
Cust
Orders
Orders
Customer
Data change
Domain Event:
„Order changed“
Lösungsidee #2+:
Der CustOrders Service
wird via Domänen-Event
über die Änderung
“informiert“.
Herausforderung #2:
Änderungen an den
Originaldaten müssen
propagiert werden.
Dies führt zu Eventual
Consistency. Ist das
fachlich ein Problem?
Wenn nicht, alles OK! Order NEW
Order OLD
43. #WISSENTEILEN
Checkout
Konzept:
Der gesamte Bestellvorgang
kann im „Normalfall“ mit Hilfe
des Checkout-Service
abgehandelt werden.
Datenversorgung:
Zu dem Zweck hält der
Checkout-Service ein
Replikat der notwendigen
Daten*.
Orders
Preferred Delivery Address
Preferred Payment Method
*ggf. als eigene Domänen-Repräsentation
46. #WISSENTEILEN
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Konzept:
Der gesamte Bestellvorgang
kann im „Normalfall“ mit Hilfe
des Checkout-Service
abgehandelt werden.
Herausforderung:
Die bevorzugte Lieferadresse
bzw. Zahlungsmethode soll
nicht zur Anwendung kommen.
47. #WISSENTEILEN
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Konzept:
Der gesamte Bestellvorgang
kann im „Normalfall“ mit Hilfe
des Checkout-Service
abgehandelt werden.
Alternative Adresse:
… im „Ausnahmefall“ wird
der Address-Service zur
Auswahl einer alternativen
Adresse herangezogen.
48. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Lösungsidee:
… im „Ausnahmefall“ wird
der Address-Service zur
Auswahl einer anderen
Adresse herangezogen.
49. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
GET …/addresses
(list all addresses)
Lösungsidee:
… im „Ausnahmefall“ wird
der Address-Service zur
Auswahl einer anderen
Adresse herangezogen.
50. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
200 ok
[
„list of
addresses“
]
Lösungsidee:
… im „Ausnahmefall“ wird
der Address-Service zur
Auswahl einer anderen
Adresse herangezogen.
51. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
PUT …/addresses/123
(change pref. delivery address)
Lösungsidee:
… im „Ausnahmefall“ wird
der Address-Service zur
Auswahl einer anderen
Adresse herangezogen.
52. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
204 no content
[ ]
Lösungsidee:
… im „Ausnahmefall“ wird
der Address-Service zur
Auswahl einer anderen
Adresse herangezogen.
53. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
Lösungsidee:
… im „Ausnahmefall“ wird
der Address-Service zur
Auswahl einer anderen
Adresse herangezogen.
54. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
pref. delivery
address changed
Lösungsidee:
… im „Ausnahmefall“ wird
der Address-Service zur
Auswahl einer anderen
Adresse herangezogen.
55. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
pref. delivery address changed
Lösungsidee:
… im „Ausnahmefall“ wird
der Address-Service zur
Auswahl einer anderen
Adresse herangezogen.
56. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
pref. delivery
address changed
Lösungsidee:
… im „Ausnahmefall“ wird
der Address-Service zur
Auswahl einer anderen
Adresse herangezogen.
57. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
Lösungsidee:
… im „Ausnahmefall“ wird
der Address-Service zur
Auswahl einer anderen
Adresse herangezogen.
58. #WISSENTEILEN
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Konzept:
Der gesamte Bestellvorgang
kann im „Normalfall“ mit Hilfe
des Checkout-Service
abgehandelt werden.
Herausforderung:
Eine neue Adresse, die
bisher dem System noch
nicht bekannt ist, soll zur
Anwendung kommen.
59. #WISSENTEILEN
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Konzept:
Der gesamte Bestellvorgang
kann im „Normalfall“ mit Hilfe
des Checkout-Service
abgehandelt werden.
Neue Adresse anlegen:
… auch neue Adressen
werden ausschließlich
über den Data-Owner
Address-Service angelegt
und im Anschluss repliziert.
60. #WISSENTEILEN
Address
Lösungsidee:
… auch neue Adressen
werden ausschließlich
über den Data-Owner
Address-Service angelegt
und im Anschluss repliziert.
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
NEW Preferred Delivery Address
new Address
61. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Lösungsidee:
… auch neue Adressen
werden ausschließlich
über den Data-Owner
Address-Service angelegt
und im Anschluss repliziert.
73. #WISSENTEILEN
Cust
Orders
Orders
Customer
Herausforderung:
Ein Kunde wird gelöscht.
Ist die so entstehende
Eventual Integrity
fachlich akzeptabel?
Wenn ja, alles OK.
Wenn nein, …
Orders of Customer 123
Idee:
Der Bestell-Service wird
via Domänen-Event über
Löschung des Kunden
Informiert.
Customer 123
Integrity in sync
Customer MQ
75. #WISSENTEILEN
Cust
Orders
Orders
Customer
Idee #2:
Der Kunde wird lediglich
als gelöscht markiert und
die APIs Bedarf angepasst.
Herausforderung:
Ein Kunde wird gelöscht.
Customer 123 Orders of Customer 123
GET customerorders/123 …
*
*als gelöscht markiert
76. #WISSENTEILEN
Cust
Orders
Orders
Customer
Idee #2:
Der Kunde wird lediglich
als gelöscht markiert und
die APIs Bedarf angepasst.
Herausforderung:
Ein Kunde wird gelöscht.
Customer 123 Orders of Customer 123
GET customerorders/123 …
*
*als gelöscht markiert
Kunde 123 im Status „aktiv“?
GET customer/123
200
OK
77. #WISSENTEILEN
Cust
Orders
Orders
Customer
Idee #2:
Der Kunde wird lediglich
als gelöscht markiert und
die APIs Bedarf angepasst.
Herausforderung:
Ein Kunde wird gelöscht.
Customer 123 Orders of Customer 123
GET customerorders/123 …
*
*als gelöscht markiert
Kunde 123 im Status „aktiv“?
GET customer/123
404
Not Found
111. #WISSENTEILEN
DISCLAIMER
Im folgenden Beispiel wird davon ausgegangen,
dass die gezeigten Services bereits „optimal“
geschnitten sind und somit aus Sicht der
fachlichen Modellierung keine weitere
Optimierung möglich ist.
“
119. #WISSENTEILEN
Verteilte Transaktionen via SAGAs
• Konsistenz von Daten zwischen Services
wird durch eine wohldefinierte Abfolge lokaler
Transitionen/Transaktionen erreicht.
• Service kommuniziert „erfolgreiche“ lokale
Transition/Transaktion an den nächsten
beteiligten Service*.
*mehr dazu später
131. #WISSENTEILEN
Verteilte Transaktionen via SAGAs
• wohldefinierte Abfolge von Compensation
Actions realisieren verteiltes Rollback
• Compensation Actions sind fachlicher Code
und somit Applikationslogik
• Abfolge von lokalen TXs & CAs kann
beliebig komplex werden!
143. #WISSENTEILEN
Choreographie von SAGAs
• pro
lose gekoppelt (Teilnehmer kennen sich nicht)
relativ einfach zu implementieren
• contra
i.d.R. zyklische Abhängigkeiten
erhöhte Komplexität im Domänen-Modell
kein zentraler Business-Code (wann valide?)
144. #WISSENTEILEN
Choreographie von SAGAs
• btw lose Kopplung
Teilnehmer kennen sich zwar nicht, wissen aber
genau, was bei einem Event zu tun ist und wie
im Anschluss – durch ein eigenes Event – zu
antworten ist (a.k.a. pseudo lose Kopplung)
146. #WISSENTEILEN
Orchestrierung von SAGAs
• explizite Sequenzsteuerung
• zentraler SAGA-Koordinator im Service
• Command / Handler Pattern
• beteiligte Services haben kein „Wissen“
158. #WISSENTEILEN
Orchestration von SAGAs
• pro
Logik ist einfach(er) zu verstehen
fachliche Kopplung nur unidirektional
keine zyklischen Abhängigkeiten
Separation of Concerns (Domain Logic vs. TX)
159. #WISSENTEILEN
Orchestration von SAGAs
• contra
„Smart Orchestrator & Dump Services“ Pattern,
d.h. Risiko, zu viel Business Logic im
Orchestrator zu zentralisieren
160. #WISSENTEILEN
Orchestration von SAGAs
• btw Orchestrator
Will man den wirklich selber bauen? Nein!
Alternative 1: Saga Framework
Alternative 2: Lightweight Workflow Engine
162. #WISSENTEILEN
Konsistenz von Daten und Nachrichten
Services veröffentlichen „Erfolgs“-Nachricht direkt
nach lokaler TX
lokale TX und „Erfolgs“-Nachricht sind
atomare Einheit aus Sicht des Services
*Message Broker buffered bei Bedarf die Message