2016-01-12 17 views
7

Ho iniziato a creare un'applicazione di test in .Net, che utilizza EventStore di Greg Young come archivio di supporto per CQRS/ES.EventStore Sottoscrizione a un flusso per una categoria

Per semplificare il caricamento di un aggregato completo, salgo su uno stream con il nome "agg-123". Ad esempio per un aggregato di prodotti con un ID di 553, ci sarebbe uno stream denominato "product-553". E poi lo stesso per un aggregato "Ordine", lo stream si chiamerebbe "order-123".

Dal reidratazione e dal risparmio di eventi questo funziona bene.

Attualmente sto tentando di creare un listener che ascolterà determinati flussi per poi popolare un database di query. I metodi di sottoscrizione che vedo possono sembrare solo abbonarsi a "order-123" o "all". Non riesco a vedere come vorrei iscriversi a "prodotto-" o "ordine-", o entrambi.

immagino che sia

  • ho perso il punto con i nomi di flusso, e loro hanno chiamato sbagliato
  • hanno perso un modo per sceglierlo, qualcosa come "prodotto-*"
  • E ' Si prevede di iscriversi a "tutti" e filtrare ciò che non ti interessa, anche se questo dà il problema che invia anche tutti gli eventi "stats"

Qualcuno qualche consiglio?

+0

Ciao Eyeball, se possibile, puoi controllare la mia domanda qui: https://stackoverflow.com/questions/35828118/subscribe-to-stream-event-never-appear-in-subscription-client - sembra come se avere un po 'il "problema". – janhartmann

risposta

4

nelle vostre proiezioni è possibile utilizzare fromCategory(). EventStore classifica ciascun flusso in base al nome del flusso fino al primo '-'. Quindi i tuoi stream 'order-123' e 'order-456' sono entrambi nella categoria 'order'.

Così si può fare qualcosa di simile:

fromCategory('order') 
    .whenAny(function(s,e) { 
    linkTo('orders',e); 
    }); 

Questo proietterà tutti gli eventi correlati ordine da ogni ordine aggrega in un unico flusso 'ordini' che ci si può iscrivere.

È necessario assicurarsi che le proiezioni di categoria siano in esecuzione. (È passato un po 'da quando ho usato EventStore, era indietro quando le proiezioni erano in beta e non erano abilitate di default, non sono sicuro se le cose sono le stesse nelle ultime versioni)

+0

Perfetto, questo è esattamente quello che stavo cercando! – eyeballpaul

1

Da The cost of creating a stream article:

In genere quando le persone sono che vogliono solo pochi corsi d'acqua proprio perché vuole leggere le cose in un certo modo per un particolare tipo di lettore. Questo può essere fatto in altri modi. Internamente l'Event Store è essentialy un pub/sub basato su argomenti. Quello che puoi fare è ripartizionare i tuoi stream utilizzando le proiezioni per aiutare a fornire un lettore specifico. Ad esempio, diciamo che un lettore era interessato a tutti gli eventi InventoryItemCreated e InventoryItemDeactivated ma non era lo interessato a tutti gli altri eventi nel sistema. Il supporto di questo flusso quando abbiamo gli eventi in molti milioni di stream può ancora fare .

Per fare ciò creeremo una proiezione per reindicizzare i flussi.

Quindi l'idea è che si potrebbe creare due proiezioni ad emettere eventi ad alcune products e orders flussi.

Nello stesso articolo viene citato il sistema bytype projection, che crea uno stream per ogni tipo di evento con il nome $et-{typename}. Questo potrebbe anche rivelarsi utile nel tuo caso.

Ad esempio, se si è interessati solo a osservare la creazione degli aggregati, è possibile iscriversi ai flussi corrispondenti. Supponendo che tu abbia alcuni eventi productCreated e orderCreated, devi semplicemente iscriverti agli eventi $et-productCreated e $et-orderCreated. Dopo aver ricevuto gli eventi da questi flussi, è anche possibile iscriversi ai singoli flussi (ad esempio product-553 e order-123) semplicemente consumando il Id dagli eventi *Created.

. (Nota: le proiezioni sono disabilitati di default e una volta attivate, potrebbe essere necessario avviare manualmente la proiezione byType)

+0

In questo scenario, mi piacerebbe essere più incline alla proiezione completa che per tipo. Non vedo come posso fare ciò che voglio per proiezione però. Puoi crearne uno con "fromstream ('product-123')", ma non vedo come posso proiettare tutti "product-xxx" in un flusso senza aggiungere manualmente tutti gli ID che non posso fare. – eyeballpaul

+0

Non riesco a vedere un modo utilizzando una proiezione normale per farlo, forse ho bisogno di usare la tua seconda idea, scegliendo i tipi di evento? In pratica vorrei che ogni tipo di evento fosse "prodotto" e "ordine" aggregato. Significa che ho bisogno di cambiare manualmente la proiezione ogni volta che creo un nuovo tipo di evento. – eyeballpaul

+0

Altri approcci: creare stream 'products' e' orders' e quindi proiezioni da emettere per flussi specifici di Id (ad esempio 'product-553'storing di tutti gli eventi per il prodotto con Id 553), specificare il tipo di aggregazione nell'evento i metadati eseguono il filtraggio nelle proiezioni. – jnovo

4

È necessario controllare se le proiezioni sono in esecuzione, poiché questa funzione è disabilitata per impostazione predefinita al momento della scrittura di questo post poiché la funzione Proiezioni è ancora in beta.

C'è una proiezione di tipo speciale denominata categoria di proiezione che è quello che probabilmente è necessario. Se si dispone di flussi nominati seguendo lo schema name-id, ad esempio product-123, product-234, è possibile iscriversi allo stream $ce-product per ricevere tutti gli eventi salvati su tali stream.

+0

Grazie per la risposta, ma Matt ha già fornito questa risposta e l'ho accettata. – eyeballpaul

+2

Va bene, ma non ho visto nessuno qui menzionare il $ ce- stream. Questa è la proiezione predefinita GES che esiste per impostazione predefinita. Vedo che Matt ha menzionato "la proiezione di categoria" e ovviamente questo è esattamente lo stesso, tuttavia, non è necessario creare un flusso di aggregazione separato, è disponibile con il nome che ho citato fuori dagli schemi. –

+0

Nessun problema. Più informazioni per la gente nel futuro, meglio è. – eyeballpaul

Problemi correlati