2013-04-27 11 views
7

Sono in procinto di adottare i concetti DDD per progettare i nostri prossimi progetti e in particolare CQRS.CQRS e operazioni sincrone (come la registrazione dell'utente)

Dopo aver letto un sacco di cose, sto cercando di implementare una semplice Prova di concetto.

Il fatto è che ho ragione bloccato dopo che ho iniziato: p

Sto cercando di applicare questo approccio ad un semplice processo di registrazione degli utenti, dove passi sono:

  • utente riempie la registrazione modulo & inviare la richiesta
  • l'applicazione crea l'utente
  • l'applicazione autentica l'utente (automatica del registro a)
  • l'applicazione invia un VERIFICA e-mail zione per l'utente
  • L'applicazione reindirizzare l'utente da qualche altra parte con un messaggio di conferma

Da un punto di vista implementativo, ciò che ho finora è:

  • L'azione del controller mappe del richiesta dati a un oggetto RegisterCommand
  • L'azione del controllore chiede al Command Bus di gestire RegisterCommand
  • Il metodo di "registrazione" del gestore di comandi (UserService) crea un nuovo oggetto Utente (di un nuovo comando o un oggetto di fabbrica)
  • Il modello solleva RegisterEvent
  • Il gestore di comando chiede al repository per memorizzare il nuovo oggetto utente

Questo è tutto, l'azione di controllo non conosce nessuna delle quella.

Quindi, la mia ipotesi è, dal momento che tutto in questo contesto deve essere fatto in modo sincrono (tranne per l'invio di e-mail), posso usare un bus di comando diretto/sincrono e nell'azione del controller, subito dopo l'invocazione del bus di comando , Posso interrogare per un utente di sola lettura (database di query) e se esiste suppone che tutto sia andato a buon fine, così posso dare all'utente un messaggio di conferma.

Il processo di accesso automatico gestito da un gestore eventi.

Supponendo che questo sia corretto, cosa succede se qualcosa va storto, come informare l'utente con le informazioni corrette?

Un esempio comune è spesso utilizzato negli articoli che possiamo trovare su Internet: un cliente paga il suo ordine utilizzando una carta di credito scaduta. Il sistema accetta la richiesta, informa l'utente che tutto è a posto, ma l'utente riceve un'email pochi minuti dopo comunicandogli che il suo ordine non può essere elaborato.

Bene, questo scenario è accettabile in molti casi, ma per alcuni altri non è possibile. Allora, dove sono gli esempi che trattano questi casi d'uso? : p

Grazie!

+0

questi processori sono in esecuzione nella stessa thread? o avete un altro servizio in esecuzione altrove durante l'elaborazione di comandi/eventi? – Sarmaad

+0

Usiamo un linguaggio di scripting, quindi non c'è thread. Un server di accodamento potrebbe eventualmente esistere, ma non per questo caso d'uso, penso. – Benjamin

risposta

1

Il problema con esempi forzati è che è possibile cambiare idea su come funziona il "dominio", quindi è poco utile discutere in particolare di questo esempio. La premessa di base che sembri rinunciare è che dobbiamo presupporre che le cose funzioneranno. Tutto il resto riguarda il rischio e lo attenua. Prendendo questo esempio, se ti chiedo, cosa succede se ho perso 1 registrazione utente in 100000? Cosa succede se ho perso 1 su 10? Perché dovrebbe succedere? Ho problemi più grandi in quel momento? È probabile che gli utenti futuri si registrino di nuovo quando il sistema torna online e funziona come previsto? Quando sarebbe? Cosa accadrebbe se monitorassimo la qualità del servizio e impedissimo agli utenti di registrarsi perché non siamo in grado di garantire la qualità che sono venuti ad associare al nostro marchio? Cosa succederebbe se il server esplodesse o che il data center fosse sommerso? Vogliamo proteggerci da questo? Vedi, non c'è una risposta giusta. Solo varie sfumature di grigio. Quindi, come possiamo mitigare il rischio? Potremmo rendere le cose sincrone ma questa è solo una garanzia in quel momento limitato. Cosa succede se devo ripristinare un backup di 2 ore (ad esempio perché il disco è danneggiato)? Questo è 2 ore di utenti registrati persi (forse). Queste cose accadono ... Volevo solo sottolineare la relatività di ciò che considero un falso senso di sicurezza. Mitigalo, investi in ciò che non puoi permetterti di perdere, assicurati di avere una buona pista di controllo. Probabilmente non è la risposta che stavi cercando ...

+0

Sto bene con tutti questi aspetti di "coerenza finale" che alla fine non sono davvero un problema dato che come hai detto dobbiamo accettare che "le cose stanno andando a lavorare" il 99,99% delle volte. Ma in alcuni casi, dal punto di vista dell'esperienza utente, devo lasciare che l'utente usi il servizio subito dopo aver inviato la sua richiesta di registrazione, ma poi? Devo lasciargli inviare un sacco di comandi, come la creazione di contenuti, basandosi solo su ciò che il cliente assume sui dati dell'utente? Voglio dire, le autorizzazioni degli utenti sono un argomento sensato, ad esempio. – Benjamin

+0

No, hai terminato la procedura di registrazione. Quindi continui. Facile. Vuoi fornire una migliore UX? Perché non consentire all'utente di continuare come utente temporaneo (finché l'utente non conferma la registrazione) e associarlo implicitamente al suo account utente registrato? Oppure basta fare l'aggiornamento del modello letto per questo particolare caso d'uso sincrono? Molte opzioni, IYAM. –

3

Penso che questo caso di utilizzo della registrazione sia più vicino al pagamento per un caso d'uso di ordini di quanto tu pensi.

La maggior parte dei leader di pensiero CQRS suggerisce di convalidare sul lato di lettura prima di emettere un comando, dando così al tuo comando una maggiore probabilità di successo.

Se la convalida non riesce sul lato di lettura, sai come gestirlo - fai in modo che l'utente scelga un altro nome prima ancora di inviare il comando di registrazione. Se la convalida ha esito positivo, invia il comando - ora stai parlando probabilmente qualche centinaio di microsecondi QUASI dove potrebbe entrare un altro utente e ha preso lo stesso nome utente tra il momento in cui hai convalidato il comando e l'hai inviato. Altamente improbabile.

E nel caso molto raro in cui ciò accade, si agisce nello stesso modo dell'esempio della carta di credito scaduta - la prossima volta che l'utente effettua il login, si presenta con una spiegazione e un modulo per inviare un nuovo nome utente - o inviare loro una mail dicendo "hey - qualcun altro ha quel nome utente, per favore clicca qui per selezionarne uno nuovo". Perché funziona? Perché hai un ID univoco per quell'utente.

Guarda una pagina di registrazione utente come Twitter. Non appena inserisci un nome utente, fa una piccola chiamata Ajax e dice "no, questo è preso" o "questo è buono!" Questa è una pre-convalida.

Spero che questo aiuti!

+0

Bene, sto bene con lo scenario che hai descritto.Il problema è che durante un processo di registrazione nessuno vuole che gli utenti attenderanno che il server abbia gestito la richiesta. Non puoi semplicemente fingere, come faresti quando l'utente aggiunge un commento, ad esempio, mostrando immediatamente il suo messaggio con javascript. Più comunemente, gli utenti possono utilizzare immediatamente il servizio. Possiamo anche immaginare una procedura di registrazione in 3 passaggi: 1. Utente immettere nome utente/email/password 2. L'utente viene automaticamente registrato e invitato a completare il suo profilo 3. L'utente viene reindirizzato alla sua home page (se sarebbe un feed o qualsiasi altra cosa) – Benjamin

+0

Penso che sarebbe OK. Finché non utilizzi il nome utente come ID (utilizzando invece un ID surrogato - un GUID o qualcosa del genere), l'utente può accedere e accedere alla sua home page perché utilizzerà l'ID surrogato per prendere decisioni, non il nome utente – Dan

+0

Questo ha senso in teoria, ma in un contesto reale questo non sarà sufficiente. Se l'utente viene reindirizzato dopo la sua registrazione, si aspetta di essere in grado di iniziare a utilizzare il servizio. Non si può ragionevolmente dire che deve aspettare per fare qualsiasi cosa, questa sarebbe un'esperienza utente terribile. Sulla home page probabilmente vuoi mostrare più informazioni che solo l'ID utente, e certamente non vuoi che l'utente esegua alcuna operazione senza essere sicuro che sia completamente autenticato nel sistema, e i dati dell'interfaccia utente non sono sufficienti per garantire che. – Benjamin

Problemi correlati