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 schema. Per questo esempio, il modello consisterà in tre transazioni come quelle rappresentate. Il sottosistema di sicurezza può leggere gli eventi dal sistema principale da una coda.
Quello che vorrei ricevere è un avviso che è una conseguenza diretta degli eventi che si verificano 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
Tenendo presente questo, ho pensato che l'approvvigionamento di eventi potesse applicarsi molto bene qui, 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 accadere 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 della query che ho visto così tante volte nella letteratura sull'approvvigionamento CQRS / Eventi, con una differenza non così sottile.
In questa letteratura, il lato query è costruito da gestori di eventi che possono generare una materializzazione dello stato in un dato punto rileggendo nuovamente tutti gli eventi. In questo caso, tuttavia, ciò non può essere realizzato esattamente così per le ragioni spiegate in precedenza. L'idea che ogni stato sia transitorio non si applica così bene qui . Dobbiamo registrare il fatto che un avviso è stato inviato da qualche parte.
Una soluzione facile per me sarebbe avere una tabella o una struttura diversa in cui si conservano le registrazioni degli avvisi precedentemente attivati. Poiché disponiamo di un ID, saremmo in grado di verificare se in precedenza è stato emesso un avviso con lo stesso ID. Avere queste informazioni renderebbe SendAlertCommand idempotente. Diversi comandi possono essere emessi, ma l'effetto collaterale avverrà solo una volta.
Pur avendo in mente quella soluzione, non so se questo suggerisca che c'è qualcosa di sbagliato in questa architettura per questo problema.
- Il mio approccio è corretto?
- C'è un posto dove posso trovare maggiori informazioni su questo?
È strano che non sono stato in grado di trovare ulteriori informazioni al riguardo. Forse ho usato la formulazione sbagliata.
Grazie mille!