Domanda

Penso di capire l'idea del modello di lettura nel contesto di ES + CQRS (per favore correggimi se non). Tuttavia, ho ancora alcuni dubbi sull'utilizzo del suo contesto di segnalazione "seria". Diciamo che uso un DB relazionale più un po 'di ORM per crollare i miei modelli di lettura. One Basic 'Summary Stats Leggi Model "potrebbe assomigliare a questo:

 class SummaryStats1
    {
    public Guid TypeId { get; set; }
    public string TypeName { get; set; }
    public Guid SubTypeId { get; set; }
    public string SubTypeName { get; set; }
    public int Count { get; set; }
    }
.

Dato un evento:

TypeId = 3acf7d6f-4565-4672-985d-a748b7706a3e
TypeName = Bla1
SubTypeId = 41532aa1-f5d1-4ec4-896b-807ad66f75fc
SubTypeName = Bla2
.

Il normalizzatore sarebbe:

(1) Controllare se esiste un'istanza della combinazione di cui sopra (definita da TypeID, TypeName, Subtypeid, Sottotipename) (2) Se non ci sono istanze creerebbero un'istanza e impostare il conteggio su uno. Se c'è aumenterà il conteggio di uno.

è questo approccio di reporting accettabile? Immagino che si possa eseguire selezioni molto efficienti contro questa struttura dati de-normalizzata (per il filtraggio e altre proiezioni SQL "):

SELECT  TypeName, Sum(Count) FROM SummaryStats1 GROUP BY TypeName
.

Gli esperti CQRS / ES sarebbero d'accordo con questo? Questa è "la via" di fare le cose (cioè creare questi modelli di lettura del rapporto dedicato)? Tutti i riferimenti al codice sorgente / esempi reali sarebbero molto apprezzati.

È stato utile?

Soluzione

.

è questo approccio di reporting accettabile?

Se è L'approccio resportivo , ovviamente varia a seconda delle esigenze, ma l'idea generale è corretta.

In sintesi:

Genera i tuoi modelli di lettura (il termine ufficiale a volte usato è Derivazione di lettura desiderosa ) sugli eventi provenienti dal tuo dominio.

I modelli di lettura possono essere tutto ciò che desideri (SQL, Redis, Mongo, ecc.). Qualunque cosa consenta di essere esibita le tue domande. Nel tuo esempio, ad esempio non c'è motivo per cui non puoi avere 2 modelli di lettura per fare più efficienti le tue domande (anche se ciò che descrivi è probabilmente abbastanza per la maggior parte dei casi):

    .
  1. La vostra vista SQL come descritto
  2. Una vista preaggregata raggruppata da typeName in modo da non dover eseguire il gruppo ogni volta in query-time (invece si calcola il raggruppamento nel normalizzatore).
  3. In breve, non c'è modo giusto o sbagliato su come costruire i tuoi modelli di lettura. La bellezza è esattamente che sei completamente libero di modellare i modelli in qualsiasi modo che desideri (in base al pattern di query e alle bottiglie di bottiglia delle prestazioni immaginate) senza dover pensare a come quei modelli hanno un impatto scrive (semplicemente perché non lo fanno da allora I CQRS Spaccature Legge e scrive)

    Utilizzo di Eventiurcing in congiunzione con i CQRS dà per nemmeno possibili possibili, vale a dire di creare nuovi lettura e popolarli con i dati semplicemente riproducendo gli eventi passati dall'eventource.

    Solo alcuni esempi extra di ciò che potrebbe essere considerato un "modello di lettura" dei tuoi dati:

      .
    • A Incl View con Redis (che è un'alternativa di ciò che ti sembrava descrivere)
    • Un indice di ricerca Elasticsearch / Solr
    • A KV-Store / Indice per alcune ricerche rapide per chiave.

    Idea di nuovo, è che questi "modelli di lettura" / viste vengono sempre tenuti aggiornati (alla fine coerenti) premendo gli eventi di aggiornamento a loro (solitamente tramite Pubsub)

    Per una migliore lettura vedi la risposta più collegamenti a questa domanda: Leggi approcci di implementazione laterali utilizzando CQRS

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