Domanda

È possibile utilizzare i CQRS (Command-Query Responsabilità segregazione) modello di architettura per costruire un sito come StackOverflow? Sono relativamente nuovo per CQRS e DDD (Domain Driven Design) e sono ad esplorare il modello e cercare di siti modelli che ho familiarità con il modello. Mentre posso vedere CQRS essere utile per molti aspetti per un sito come StackOverflow, ci sono alcune aree che non sono sicuro che è possibile (o, almeno, io non riesco a capire immediatamente). In particolare:

  • Fare domande Quando creo una domanda, lo vedo immediatamente e in grado di modificarlo. Nel CQRS, ho emettere un comando come 'AskQuestion' e viene creato un evento chiamato 'QuestionAsked'. Infine, la questione viene spinto al archivio dati denormalizzato. Ma così è l'esperienza è immediato. È questo possibile con CQRS?
  • voto I miei voti si riflettono immediatamente. In CQRS, Immagino questi comandi / eventi poi passano attraverso l'evento autobus al negozio di lettura. Ma così dà me le informazioni immediatamente.

Le mie preoccupazioni sono davvero attorno al concetto di feedback immediato che lo preveda. Can CQRS fornire questo? Se sì, come si può fare? Ci sono buoni esempi là fuori che illustrano come gestire questo?

Se aiuta, il mio ambiente è VS2010 / C # / SQL2008R2, ma sono aperto ad altre opzioni come SQLite, ecc sto anche guardando quadri NCQRS e Lokad di, insieme con il campione e sto progettando di Mark Nijhof su scaricano campione di Greg Young. Non ho trovato molto altro là fuori per CQRS campioni.

Grazie!

È stato utile?

Soluzione

Che cosa si sta effettivamente parlando è 'eventuale coerenza' che è spesso parlato, allo stesso tempo, come CQRS, ma è possibile utilizzare sia la tecnica in modo indipendente.

La cosa più semplice da fare è aggiornare il modello che l'interfaccia utente sta usando immediatamente e utilizzare questo per mostrare la schiena domanda per l'utente per ulteriori manipolazioni. I vari pezzi di lavoro da fare in modo che gli altri utenti possono vedere l'aggiornamento può procedere senza bloccare l'interfaccia utente. Per farlo funzionare è necessario convalidare il comando in modo che sia quasi certo di riuscire prima di inviarla via (se il comando non riesce durante l'esecuzione, allora avrete bisogno di gestire la situazione, ad esempio, inserire una sorta di chiamata al modello di UI) .

E 'anche la pena tenendo presente che di solito il 'eventuallness' di questo genere di cose è così rapido che tutto sono apparsi subito in ogni caso, anche ad altri utenti.

Altri suggerimenti

Diamo un'occhiata alle due domande ...

Fare domande Quando creo una domanda, vedo immediatamente e può modificarlo. In CQRS, ho emesso un comando come 'AskQuestion' e viene creato un evento chiamato 'QuestionAsked'. Alla fine, la questione viene spinto all'archivio dati denormalizzato. Ma l'esperienza del SO è immediata. Questo è possibile con CQRS?

Questo può essere facilmente raggiunto. Ha ogni utente ha bisogno di vedere immediatamente o semplicemente la persona che chiede che la questione? Se ci vogliono 1-2 secondi fino a quando appare a tutti sarebbe fare la differenza? Molto spesso nei sistemi finalmente coerenti c'è una differenza tra l'utente inviando una richiesta vs ogni altro utente.

Le votazioni I miei voti si riflettono immediatamente. In CQRS, immagino questi comandi / eventi finalmente si muovono attraverso il bus evento al negozio di lettura. Ma così mi dà immediatamente le informazioni.

fa dare immediatamente? Proviamo un altro esempio, Facebook. Quando si fa clic come su qualcosa non questo spettacolo subito in vostri simili? trucchi UI come mettere un pollice in alto ti fanno sentire come lo fa. Un altro esempio, amazon. Quando si fa clic su Aggiungi al carrello vuol andare immediatamente il carrello? rappresentazioni visive come "aggiunto al carrello" o un "pollice in alto" Fai come una sensazione di utente come il suo stato fatto.

Ci sono molti trucchi come questi che possono rendere una sensazione di sistema alla fine coerente come un sistema completamente coerente.

Come nota a margine molti pensano questo tipo di cosa sono fatte per la scalabilità (che a volte è il caso). Più spesso sono stato fatto per l'affidabilità. La questione diventa succede se XYZ è giù. Vuoi strani guasti locali randomizzati o non si vuole rischiare una vasta interruzione di diffusione. Uno dei migliori esempi per vedere qui è il check-out su Amazon per un acquisto Kindle, il suo strano che essi in grado di elaborare la carta di credito a come 100ms mentre tutti gli altri richiede 3-5 secondi :) Che cosa succede se il loro sistema di elaborazione delle carte di credito è giù ?

Quando si chiede una domanda, è possibile "falsi" i dati nell'interfaccia utente. Sembrerà come se fosse stato aggiornato immediatamente per l'utente (voi), ma ci vorrà del tempo prima che gli altri utenti vedranno la tua domanda. Hai bisogno di fare la stessa cosa per il voto maniglia.

Se avete bisogno di un feedback immediato, si potrebbe prendere in considerazione altre soluzioni. Ma, ci sono alcuni trucchi che potete fare per dare un feedback immediato in una soluzione CQRS. Se, ad esempio, necessità di convalidare che un nome utente è uniqe, è possibile interrogare il database di lettura (s) per scoprire se esiste il nome utente. In caso contrario, è possibile utilizzarlo. Ma, se un altro utente ha scelto lo stesso nome utente, nel frattempo, si otterrà un conflitto sul lato comando. È necessario gestire questo nel vostro modello di dominio, e, per esempio, dare all'utente un nome utente generato e inviarlo a lui da e-mail. Egli può poi cambiarlo in qualcosa d'altro.

Per falso o trucco, si potrebbe pensare l'evento come un "evento in sospeso", qualcosa che rischia di avere successo nella fase di commit / pubblicare, ma potrebbe fallire. La convalida si esegue più lato client, prima di iniziare l'presentare per impegnarsi, più è probabile che avrà successo. Quindi, se avete intenzione di fare affidamento su un commit, piano di attesa per un cliente più spesso in termini di esposizione convalida e regola aziendale.

Si potrebbe quindi consentire all'utente di continuare ad utilizzare i dati (per ulteriori modifiche) dalla marcatura o codifica i dati all'interno del UI come fare affidamento su "in attesa di commettere". Sarebbe un attributo meta dell'oggetto o attributo. Naturalmente aggiungendo e utilizzando tale attributo meta aumenterà la complessità, ma a seconda applicazione potrebbe essere un caso d'uso necessarie.

code comandi lato client / storie potrebbero essere un modo per le situazioni della maniglia di aiuto in cui eventi successivi si basava su un fine fallì attesa di commettere. In altre parole, tutto ciò che si basa su un attesa di commettere potrebbe essere parte di una storia che potrebbe essere arrotolato, salvato mentre le correzioni sono fatte per il fallito in attesa di commit, srotolato e riapplicato alla manifestazione cambiato e ripresentato in attesa di nuovo, e una volta che la notifica che l'evento in corso ha avuto successo in commettere, tutta la storia successiva lato client avrebbe cominciato a rilassarsi, presentata l'elemento successivo nella coda, la marcatura come l'evento ora in attesa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top