Bei gegebenem Service A (CMS), der ein Modell steuert (Produkt, nehmen wir an, dass die einzigen Felder ID, Titel, Preis sind) und Services B (Versand) und C (E-Mails), die das gegebene Modell anzeigen müssen, wie der Ansatz aussehen soll bestimmte Modellinformationen über diese Dienste hinweg im Event-Sourcing-Ansatz zu synchronisieren? Nehmen wir an, dass sich der Produktkatalog selten ändert (aber ändert) und dass es Administratoren gibt, die sehr oft auf Daten von Sendungen und E-Mails zugreifen können (Beispielfunktionen sind: B: display titles of products the order contained
und C :) display content of email about shipping that is going to be sent
. Jeder der Dienste verfügt über eine eigene Datenbank.
Lösung 1
Senden Sie alle erforderlichen Informationen zum Produkt innerhalb der Veranstaltung - dies bedeutet folgende Struktur für order_placed
:
{
order_id: [guid],
product: {
id: [guid],
title: 'Foo',
price: 1000
}
}
Bei Service B und C werden Produktinformationen im product
JSON-Attribut in der orders
Tabelle gespeichert
Daher werden zur Anzeige der erforderlichen Informationen nur die vom Ereignis abgerufenen Daten verwendet
Probleme : Abhängig davon, welche anderen Informationen in B und C dargestellt werden müssen, kann die Datenmenge im Ereignisfall zunehmen. B und C erfordern möglicherweise nicht dieselben Informationen zum Produkt, aber das Ereignis muss beide enthalten (es sei denn, wir trennen die Ereignisse in zwei Teile). Wenn gegebenen Daten nicht vorhanden innerhalb der gegebenen Fall ist, Code kann es nicht verwenden - wenn wir eine hinzufügen werden Farbe Option gegeben Produkt, für bestehende Aufträge in B und C, wird gegeben Produkt farblos sein , wenn wir die Ereignisse aktualisieren und sie dann erneut ausführen .
Lösung 2
Senden Sie nur eine Anleitung des Produkts innerhalb der Veranstaltung - dies bedeutet folgende Struktur für order_placed
:
{
order_id: [guid],
product_id: [guid]
}
Bei den Diensten B und C werden die Produktinformationen im product_id
Attribut in der orders
Tabelle gespeichert
Produktinformationen werden von den Diensten B und C bei Bedarf durch Ausführen eines API-Aufrufs an den A/product/[guid]
Endpunkt abgerufen
Probleme : Dies macht B und C (jederzeit) von A abhängig. Wenn sich das Schema des Produkts in A ändert, müssen Änderungen an allen von ihnen abhängigen Diensten (plötzlich) vorgenommen werden.
Lösung 3
Senden Sie nur eine Produktrichtlinie innerhalb des Ereignisses - dies bedeutet die folgende Struktur für order_placed:
{
order_id: [guid],
product_id: [guid]
}
Bei den Diensten B und C werden die Produktinformationen in einer products
Tabelle gespeichert . es gibt noch product_id
auf orders
Tabelle, doch die Replikation von products
Daten zwischen A, B und C; B und C enthalten möglicherweise andere Informationen zum Produkt als A.
Produktinformationen werden beim Erstellen der Services B und C festgelegt und aktualisiert, wenn sich Informationen zu Produkten ändern, indem der A/product
Endpunkt aufgerufen wird (der die erforderlichen Informationen aller Produkte anzeigt) oder indem ein direkter DB-Zugriff auf A durchgeführt und die erforderlichen Produktinformationen kopiert werden Bedienung.
Probleme : Dies macht B und C von A abhängig (beim Säen). Wenn sich das Schema des Produkts in A ändert, müssen Änderungen an allen von ihnen abhängigen Diensten vorgenommen werden (beim Seeding).
Nach meinem Verständnis wäre der richtige Ansatz, Lösung 1 zu verwenden und entweder den Ereignisverlauf gemäß einer bestimmten Logik zu aktualisieren (wenn sich der Produktkatalog nicht geändert hat und wir die anzuzeigende Farbe hinzufügen möchten, können wir den Verlauf sicher aktualisieren, um den aktuellen Status zu erhalten von Produkten und füllen Sie fehlende Daten innerhalb der Ereignisse) oder sorgen Sie für das Nichtvorhandensein bestimmter Daten (wenn sich der Produktkatalog geändert hat und wir die anzuzeigende Farbe hinzufügen möchten, können wir nicht sicher sein, ob zu diesem Zeitpunkt in der Vergangenheit ein bestimmtes Produkt angegeben wurde hatte eine Farbe oder nicht - wir können davon ausgehen, dass alle Produkte im vorherigen Katalog schwarz waren und durch Aktualisierung von Ereignissen oder Code berücksichtigt werden)
updating event history
Ich meine: Gehen Sie alle Ereignisse durch und kopieren Sie sie von einem Stream (v1) in einen anderen Stream (v2), um ein konsistentes Ereignisschema beizubehalten.
display image at the point when purchase was made
) oder nicht (das die Absicht von darstellt display current image as it within catalog
) vorhanden sein
updating event history
- Bei der Beschaffung von Ereignissen ist die Ereignishistorie Ihre Quelle der Wahrheit und sollte niemals geändert werden, sondern nur vorwärts gehen. Wenn sich Ereignisse ändern, können Sie die Ereignisversionierung oder ähnliche Lösungen verwenden. Wenn Sie Ihre Ereignisse jedoch bis zu einem bestimmten Zeitpunkt wiedergeben, sollte der Status der Daten so sein, wie er zu diesem Zeitpunkt war.