CQRS e convalide

5

Sto iniziando a presentarmi nei concetti di CQRS, ma mi vengono bloccati con la seguente situazione: Supouse hai un'entità che deve avere un nome univoco. Per verificare che, prima di creare l'entità, è necessario creare una query, quindi verificare il sottosistema della query. Ma cosa succede se la sincronizzazione non è ancora avvenuta tra il sistema di comando e il sistema di query? L'altro cliente aveva appena mandato lo stesso nome prima di te. Cosa succede in questo caso?

    
posta Apocatastasis 12.07.2013 - 23:56
fonte

2 risposte

3

Bene, non si dovrebbe utilizzare il sottosistema di query per le convalide - usare il sottosistema di comando per questo. Osserva l'immagine in l'articolo di Fowler qui - le convalide sono generalmente posizionate sul lato del modello di comando. Se, ad esempio, si tenta di assegnare a un'entità un nome univoco, il sottosistema di comando deve generare un'eccezione se tale nome era già stato utilizzato in precedenza. L'iniziatore di tale comando dovrebbe aspettarsi che ciò accada, anche quando ha utilizzato il sottosistema di query prima di trovare un nome "libero".

Ovviamente, è il caso della "coerenza finale" tra quei diversi modelli, dove c'è un ritardo tra la sincronizzazione. Se hai un sistema in cui entrambi i modelli sono strettamente coerenti, le regole possono essere ovviamente diverse.

    
risposta data 13.07.2013 - 00:28
fonte
1

Ci sono due possibili rimedi qui.

Il primo è che Condizioni di gara non esistono . Se stai operando a velocità di lavoro, dove solitamente hai processi a lunga esecuzione, in genere ti accorgi che le gare non si verificano realmente (quindi non dovresti investire troppo a fondo nel tentativo di gestirle) O che le gare sono consentite e ci sono i comandi di compensazione che sono usati per porre rimedio alle contingenze.

Secondo approccio: se il vincolo del nome univoco è in realtà un'infrastruttura aziendale che deve essere mantenuta, l'entità responsabile della creazione deve garantire l'unicità del nome, ad esempio mantenendo un elenco di tutti i nomi in uso. Il client fa del suo meglio per proteggersi dalla duplicazione controllando prima il lato di lettura per rilevare se un nome è già in uso; ma nel caso di una gara da parte di due client diversi, uno dei comandi fallisce , e il client che perde la corsa viene informato dell'errore e può scegliere un altro nome.

    
risposta data 11.12.2015 - 05:06
fonte

Leggi altre domande sui tag