2015-10-30 26 views
8

Sto progettando un backend usando CQRS + Event sourcing, usando Akka + Scala. Non sono sicuro di come gestire uno stato crescente. Ad esempio, avrò un elenco crescente di utenti. A mio avviso, ogni utente verrà creato in seguito a un evento UserCreated, tali eventi verranno riprodotti da PersistentActor e gli utenti verranno archiviati in una raccolta. Qualcosa di simile:Event-sourcing con akka-persistance: stato crescente come lista?

class UsersActor extends PersistentActor { 

    override def persistenceId = .... 

    private case class UsersState(users: List[User]) 

    private var state = UsersState() 

    .... 
} 

Ovviamente tale stato sarebbe poi crescere troppo grande per essere tenuto in memoria per questo attore, quindi credo che sto facendo qualcosa di sbagliato.

Ho trovato il progetto di esempio this: l'idea sembra che ogni utente debba essere tenuto da un diverso attore e caricato (dalla cronologia eventi) secondo necessità.

Qual è il modo giusto per farlo? Molte grazie.

+0

L'individuazione degli eventi non è appropriata per tutte le parti dell'applicazione .. è necessario l'elenco di tutti gli utenti per interrogarlo per consentire agli utenti di accedere o uscire? – jazmit

+0

Grazie per il tuo commento @jazmit - no, non ho bisogno di "presentare" tutti gli utenti contemporaneamente. Sto studiando il progetto che ho collegato, sembra solo "gonfiare" l'oggetto di cui ha bisogno per servirlo o aggiornarlo. Avete ulteriori suggerimenti? – ticofab

+0

Sì, ma il progetto seme utilizza un attore persistente per utente. Ancora non sono sicuro di cosa stai cercando esattamente, l'unica cosa che posso dire è di non progettare gli attori di dominio con uno stato in continua crescita .. – jazmit

risposta

1

La risposta è: ogni aggregato/entità (nel mio esempio, ciascun utente) ottiene il proprio attore, che incorpora lo stato per quella particolare entità e quella solo.

+0

+1. Non è il posto per la discussione, ma modifichi il comportamento a seconda dello stato di 'PersistentActor'? Cioè se l'evento chiamato 'UserCreated' viene mantenuto, si modifica il comportamento in modo tale che solo gli eventi i.e. UserRemoved' e' UserUpdated' possano essere mantenuti? Oppure, se viene mantenuto l'evento "UserRemoved" che nessuno degli altri eventi non può più essere persistito per un attore con tale specifico ID di persistenza. –

+1

In effetti, questo è quello che sto facendo: modificare il comportamento in base allo stato. – ticofab

+0

Caramelle per te. Grazie per una risposta veloce. :) –