Nehmen wir an, wir möchten ein kleines Sicherheitssubsystem für eine Finanzanwendung implementieren, das die Benutzer per E-Mail warnt, wenn ein seltsames Muster erkannt wird. In diesem Beispiel besteht das Muster aus drei Transaktionen, wie sie dargestellt sind. Das Sicherheitssubsystem kann Ereignisse aus dem Hauptsystem aus einer Warteschlange lesen.
Was ich erhalten möchte, ist eine Warnung, die eine direkte Folge der Ereignisse im System ist, ohne eine Zwischendarstellung, die den aktuellen Status des Musters modelliert.
- Überwachung aktiviert
- Transaktion verarbeitet
- Transaktion verarbeitet
- Transaktion verarbeitet
- Alarm ausgelöst (ID: 123)
- E-Mail für Benachrichtigung gesendet (für ID: 123)
- Transaktion verarbeitet
Vor diesem Hintergrund dachte ich, dass Event-Sourcing hier sehr gut angewendet werden könnte, obwohl ich eine Frage ohne klare Antwort habe. Die im Beispiel ausgelöste Warnung hat einen deutlichen Nebeneffekt. Es muss eine E-Mail gesendet werden. Dieser Umstand sollte nur einmal auftreten. Daher sollte es nicht passieren, wenn alle Ereignisse eines Aggregats wiedergegeben werden.
Bis zu einem gewissen Grad sehe ich die E-Mail, die gesendet werden muss, ähnlich den Materialisierungen, die von der Abfrageseite generiert wurden, die ich so oft in der CQRS / Event-Sourcing-Literatur gesehen habe, mit einem nicht so subtilen Unterschied.
In dieser Literatur besteht die Abfrageseite aus Ereignishandlern, die an einem bestimmten Punkt eine Materialisierung des Zustands erzeugen können, indem alle Ereignisse erneut gelesen werden. In diesem Fall kann dies jedoch aus den zuvor erläuterten Gründen nicht genau so erreicht werden. Die Vorstellung, dass jeder Zustand vorübergehend ist, trifft hier nicht so gut zu . Wir müssen die Tatsache aufzeichnen, dass irgendwo eine Warnung gesendet wurde.
Eine einfache Lösung für mich wäre eine andere Tabelle oder Struktur, in der Sie Aufzeichnungen über die zuvor ausgelösten Warnungen führen. Da wir eine ID haben, können wir überprüfen, ob zuvor eine Warnung mit derselben ID ausgegeben wurde. Wenn Sie diese Informationen haben, wird der SendAlertCommand idempotent. Es können mehrere Befehle ausgegeben werden, der Nebeneffekt tritt jedoch nur einmal auf.
Selbst wenn ich diese Lösung im Auge habe, weiß ich nicht, ob dies ein Hinweis darauf ist, dass mit dieser Architektur für dieses Problem etwas nicht stimmt.
- Ist mein Ansatz korrekt?
- Gibt es einen Ort, an dem ich weitere Informationen dazu finden kann?
Es ist seltsam, dass ich keine weiteren Informationen dazu finden konnte. Vielleicht habe ich den falschen Wortlaut verwendet.
Ich danke dir sehr!