2011-10-10 48 views
5

Diciamo che volevo avere una saga che viene creata da qualche evento, quindi si siede e aspetta qualche ora, e se non succede nulla, invia qualche comando.Sagas basati sul tempo con Event Sourcing

Ora, se questa Saga era tutta in memoria e dovevo riavviare l'app/server, la saga sarebbe stata scaricata e non sarebbe mai più stata visualizzata, giusto?

Vorrei utilizzare Event Sourcing per portare questo Saga alla velocità una volta che il sistema è di nuovo online?

In tal caso, mi servirebbe un Evento Store separato con "saghe attive" che possono essere riprodotte all'avvio del sistema, per aumentare la velocità di Sagas. Finora mi sembra buono, ma come potrei implementare il timeout?

Avrei bisogno di un modo per "falsificare" i timeout al replay, tenendo conto che potrebbero esserci diversi timeout successivi, a seconda degli eventi che entrano nella saga.

risposta

6

Il modo migliore per ottenere questa funzionalità è con un altro endpoint che è in grado di restituire un messaggio a voi in un determinato momento. Ad esempio, la tua saga può inviare un messaggio a questo "timeout manager" e dire svegliarmi tra 1 ora o 1 giorno o anche 1 anno. Il messaggio verrà quindi restituito in quel momento. Idealmente questo messaggio avrebbe un significato aziendale che potrebbe causare un'azione.

Forse il miglior esempio di questo è qualcosa come l'iscrizione al cliente dove, se il cliente non ha confermato il proprio account entro 7 giorni dall'iscrizione, li notificherà via email. Il "messaggio di timeout" sarebbe effettivamente: RemindUserToConfirmAccountMessage. Quando questo messaggio viene ricevuto dalla saga dopo 7 giorni, la saga determinerà in base al suo stato attuale, se questo messaggio deve essere gestito e l'e-mail di un cliente deve essere inviata. Ma se l'utente ha già confermato il proprio account, il messaggio può essere scartato senza alcuna azione.

+0

Come posso creare una Saga che dura 7 giorni? Sono sicuro che deve essere persistente in caso di riavvio del servizio, giusto? –

+1

@ MauroDestro Non è necessario tenere in memoria le proprie saghe quando si utilizza Event Sourcing. Pensa a una saga come entità che puoi riprodurre prima che possa gestire un evento. Confronta come si riprodurrebbe un aggregato prima di poter gestire un comando. L'utilizzo dell'approccio di Jonathan per gestire i timeout (rendendoli eventi di per sé stessi) rende possibile replicare anche il "tempo". –