Ordinamento delle transazioni del modello Saga e Query

1

Ho il seguente linguaggio onnipresente definito dal nostro esperto di domini: un utente può trovare gruppi di utenti e aggiungersi a esso. Un utente può interrogare un elenco di UserGroup di cui è membro e rimuoversi da esso. I gruppi utente sono creati dagli utenti, in cui il creatore è il primo membro. Quando non c'è più Utente nel Gruppo Utente, il Gruppo Utente dovrebbe essere cancellato dalle viste.

Dato che gli UserGroup possono diventare piuttosto grandi, seguendo "Effective Aggregate Design" , sono arrivato al seguente {AR} ' s:

{ utente } < - (UserId) - { UserGroupMember } - (UserGroupId) - > { UserGroup }

Tutto bene, tranne come fare l'ultima regola ( Quando non c'è più Utente nel Gruppo Utente, il Gruppo Utente dovrebbe essere cancellato dalle viste. ) funziona con questo modello?

Ho considerato una saga che ascolta l'evento UserGroupMemberLeft, accodando il nr dei membri e se 0 cancella il gruppo. Ma quando interroga il modello di lettura, ho un problema di ordinamento visto che anche il modello di lettura viene aggiornato. Come risolvere questo? Dovrei considerare anche un evento ReadModelUpdated?

    
posta Pepster 03.11.2015 - 12:41
fonte

2 risposte

1

All fine, except how to make the last rule (When there is no more User in the UserGroup, the UserGroup should be deleted from the views.) work with this model?

È un vincolo sulla query eseguita dal modello di lettura per creare la vista.

Ciò potrebbe significare che è necessario aggiornare il modello di lettura per supportare il vincolo. Ad esempio, nella tua implementazione originale, potresti aver supportato la visualizzazione di gruppi di utenti con un Set, in cui ogni gruppo sarebbe stato inserito nel set al momento della sua creazione.

Con il nuovo requisito, il modello di lettura ora deve tracciare l'appartenenza totale. Quindi sostituisci il Set con una mappa, con te usato per tracciare il conteggio degli utenti aggiunti e rimossi dal gruppo. Quando hai bisogno di una vista dei gruppi, enumeri le voci dell'hash per trovare i gruppi che soddisfano il vincolo (subscribedMembers > unsubscribedMembers).

Si noti che questi dettagli si basano esclusivamente sul modello di lettura: il requisito descritto non impone alcuna restrizione sul modello di scrittura. In base al tuo commento su UserGroupMemberLeft , sembra che tu stia cercando di introdurre la fine della vita nel modello.

Come sottolineato da @JDT, alcuni aggregati devono essere responsabili della fine della vita. Quale stato determina se l'eliminazione di un gruppo è consentita? L'aggregato che controlla quello stato è quello che dovrebbe essere responsabile per l'operazione di fine vita, poiché è l'unico che sa se è permesso il ritiro del gruppo.

Non conosco il tuo dominio, ma suppongo che il gruppo stesso contenga lo stato richiesto. Ad esempio, se non ti è permesso di ritirare un gruppo più di una volta, probabilmente è il gruppo che lo sta monitorando. Allo stesso modo, se ti è permesso solo di ritirare i gruppi vuoti, è probabilmente lo stato del gruppo che sta monitorando quello.

Quindi presumo che il gruppo sia responsabile della propria pensione. A questo punto, hai due opzioni a tua disposizione. Uno è un gestore di processi, che osserva i conteggi dei membri e invia un comando per ritirare il gruppo quando osserva che non ci sono membri. A causa della coerenza finale, questo comando potrebbe essere rifiutato, ad esempio se un nuovo membro si unisce al gruppo dopo che è stato lasciato l'ultimo.

Se è necessario ritirare il gruppo in modo coerente rispetto alla transazione, il gruppo si blocca contro ulteriori iscrizioni come parte della transazione quando l'ultimo membro lascia. Ad esempio, se il modello di scrittura sta trasmettendo eventi al modello letto, la partenza dell'ultimo utente genererebbe due eventi, uno che descrive l'uscita dell'utente e un secondo che descrive il ritiro del gruppo.

Poiché il gruppo si blocca quando l'ultimo membro parte, non devi preoccuparti delle condizioni della gara.

Fatto questo, il tuo modello di lettura può utilizzare l'implementazione Set da prima, aggiungere gruppi al set quando vengono creati per la prima volta e rimuoverli quando il gruppo è in pensione.

    
risposta data 10.12.2015 - 21:12
fonte
0

La cosa che manca nella tua lingua di dominio è il concetto di WHO che dovrebbe eliminare il gruppo. Gli utenti possono creare gruppi e aggiungersi ad essi, il che pone chiaramente la responsabilità di tali azioni sugli utenti. Ma continui a dire che "i gruppi dovrebbero essere cancellati". Dal punto di vista del business, questo non ha senso.

Se il tuo requisito è riformulato in "Quando non c'è più Utente nel Gruppo Utente, l'Utente dovrebbe eliminare il gruppo" diventa ovvio chi è la responsabilità di rimuovere il gruppo.

    
risposta data 03.11.2015 - 13:37
fonte