Supponiamo di voler implementare un piccolo sottosistema di sicurezza per un'applicazione finanziaria che avvisa gli utenti via e-mail se viene rilevato uno strano pattern. Per questo esempio, il modello consisterà in tre transazioni come quelle illustrate. Il sottosistema di sicurezza può leggere gli eventi dal sistema principale da una coda.
Quello che vorrei ottenere è un avviso che è una conseguenza diretta degli eventi che accadono nel sistema, senza una rappresentazione intermedia che modella lo stato corrente del modello.
- Monitoraggio attivato
- Transazione elaborata
- Transazione elaborata
- Transazione elaborata
- Avviso attivato (id: 123)
- Email per avviso inviato (per id: 123)
- Transazione elaborata
Avendo questo in mente, ho pensato che l'event sourcing potesse applicarsi molto bene, anche se ho una domanda senza una risposta chiara. L'avviso attivato nell'esempio ha un chiaro effetto collaterale, è necessario inviare un'e-mail, una circostanza che dovrebbe verificarsi solo una volta. Pertanto, non dovrebbe accadere quando si riproducono tutti gli eventi di un aggregato.
In una certa misura, vedo l'e-mail che deve essere inviata in modo simile alle materializzazioni generate dal lato query che ho visto tante volte nella documentazione di sourcing CQRS / Event, con una differenza non molto sottile però.
In questa letteratura, il lato query è costruito da gestori di eventi che possono generare una materializzazione dello stato in un dato punto, rileggendo tutti gli eventi. In questo caso, tuttavia, ciò non può essere realizzato esattamente come quello per le ragioni spiegate in precedenza. L'idea che ogni stato sia transitorio non si applica molto bene qui . Dobbiamo registrare il fatto che un avviso è stato inviato da qualche parte.
Una soluzione semplice per me sarebbe avere una tabella o una struttura diversa in cui tenere traccia degli avvisi che erano stati precedentemente attivati. Dato che abbiamo un ID, saremo in grado di verificare se prima è stato emesso un avviso con lo stesso ID. Avere questa informazione renderebbe identi- cente il SendAlertCommand. Diversi comandi possono essere emessi, ma l'effetto collaterale si verificherà solo una volta.
Pur avendo in mente questa soluzione, non so se questo è un suggerimento che c'è qualcosa di sbagliato in questa architettura per questo problema.
- Il mio approccio è corretto?
- C'è qualche posto dove posso trovare ulteriori informazioni su questo?
È strano che non sia stato in grado di trovare maggiori informazioni a riguardo. Forse ho usato la dicitura sbagliata.
Grazie mille!