Nehmen wir an, wir haben ein Aggregat User
, das eine UserPortraitImage
und eine Contract
als PDF-Datei hat. Ich möchte Dateien in einem dedizierten dokumentenbasierten Speicher speichern und nur prozessrelevante Daten im Ereignis speichern (mit einem Link zu den BLOB-Daten).Vermeiden Sie zweiphasige Commits in einer ereignisbezogenen Anwendung, die BLOB-Daten speichert
Aber wie vermeide ich eine zweiphasige Festschreibung, wenn ich die Dateien speichern und das neue Ereignis speichern muss?
Zuerst würde ich die Dokumente und dann das Ereignis speichern; Wenn die erste Transaktion fehlschlägt, spielt der Befehl keine Rolle. Wenn die zweite Transaktion fehlschlägt, ist es auch dann nicht von Bedeutung, wenn wir einige tote Dateien im Speicher generieren, der Befehl schlägt fehl; Wir könnten sogar einen Rollback anwenden. Aber könnte es ein zusätzliches Problem geben?
Die nächste Frage ist, wie Sie das Aggregat und das Ereignis entwerfen. Wenn das Aggregat nur einen Verweis auf den BLOB-Speicher enthält, wie lautet der Prozess, nachdem ein SignUp
-Befehl aufgerufen wurde?
SignUpCommand
==> Speichern Sie Dokumente (UserPortraitImage
und Contract
) ==> Neue User
Aggregat mit den Referenzen BLOB-Speicher gegeben und es lagern?
Gibt es ein besseres Design, das das Aggregat davon befreit, zu wissen, dass BLOB-Daten in einem anderen Geschäft gespeichert werden? Und wer ist verantwortlich für das Speichern von BLOB-Daten und das Weiterleiten der Referenz an das Aggregat?
Wenn ich eine Saga verwende, wo behalte ich die BLOB-Daten in der Zwischenzeit? Wie würde der Prozess aussehen? –