2016-01-12 10 views
7

Ich habe damit begonnen, eine Testanwendung in .Net zu erstellen, die EventStore von Greg Young als Backing Store für CQRS/ES verwendet.EventStore Abonnieren eines Streams für eine Kategorie

Um das Laden eines vollständigen Aggregats zu vereinfachen, speichere ich in einem Stream mit dem Namen "agg-123". Für ein Produktaggregat mit einer ID von 553 würde beispielsweise ein Stream namens "product-553" vorhanden sein. Und dann dasselbe für ein Aggregat "Order", der Stream würde "Order-123" heißen.

Von der Rehydrierung und Speicherung von Ereignissen funktioniert das gut.

Ich versuche jetzt, einen Listener zu erstellen, der bestimmte Streams abhören wird, um eine Abfragedatenbank zu füllen. Die Subscribe-Methoden, die ich sehe, scheinen nur "order-123" oder "all" zu abonnieren. Ich kann nicht sehen, wie ich "Produkt" oder "Bestellung" oder beides abonnieren würde.

Ich stelle mir vor, dass entweder

  • ich den Punkt mit Strom Namen verpasst haben, und haben sie falsch genannt
  • einen Weg verpasst haben, sie zu wählen, so etwas wie „produkt- *“
  • Es wird erwartet, dass „alle“ und herauszufiltern, was Sie nicht daran interessiert sind, obwohl dies gibt das Problem, dass es sendet auch alle „Statistiken“ Ereignisse

jemand einen Rat abonnieren?

+0

Hallo Augapfel, wenn möglich - können Sie meine Frage hier überprüfen: https://stackoverflow.com/questions/35828118/subscribe-to-stream-event-never-appear-in-subscription-client - scheint wie ich habe etwas das "Problem". – janhartmann

Antwort

4

In Ihren Projektionen können Sie fromCategory() verwenden. EventStore kategorisiert jeden Stream nach dem Namen des Streams bis zum ersten '-'. Ihre Streams 'order-123' und 'order-456' befinden sich also beide in der Kategorie 'order'.

So können Sie so etwas wie:

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

Dadurch werden alle auftragsbezogenen Ereignisse projizieren aus allen um einen einzigen ‚Orders‘ Strom-Aggregate in die Sie abonnieren können.

Sie müssen sicherstellen, dass die Kategorie Projektionen ausgeführt werden. (Es ist eine Weile her, seit ich EventStore verwendet habe, war es zurück, als Projektionen in der Beta waren und nicht standardmäßig aktiviert waren, nicht sicher, ob die Dinge in den neuesten Versionen gleich sind)

+0

Perfekt, genau das habe ich gesucht! – eyeballpaul

1

Von The cost of creating a stream article:

Im Allgemeinen, wenn die Menschen nur wenige Ströme wollen sein, weil sie wollen Dinge für einen bestimmten Typ von Leser in einer bestimmten Weise verlesen. Dies kann auf andere Arten geschehen. Intern ist der Event Store essentiell ein Thema Pub/Sub. Was Sie tun können, ist Ihre Streams unter Verwendung von Projektionen neu zu partitionieren, um für einen bestimmten Leser zu sorgen. Als Beispiel nehmen wir an, dass ein Leser an allen Ereignissen von InventoryItemCreated und InventoryItemDeactivated interessiert war, aber nicht an allen anderen Ereignissen im System interessiert war. Unterstützung dieser Stream, wenn wir die Ereignisse in vielen Millionen von Streams haben, kann noch getan werden.

Dazu erstellen wir eine Projektion, um die Streams neu zu indizieren.

Die Idee ist, dass man zwei Projektionen schaffen könnte Ereignisse zu einigen products und orders Ströme zu emittieren.

Im selben Artikel wird die System-Bytype-Projektion erwähnt, die für jeden Ereignistyp einen Stream mit dem Namen $et-{typename} erstellt. Dies könnte sich auch in Ihrem Fall als nützlich erweisen.

Wenn Sie beispielsweise nur an der Erstellung der Aggregate interessiert sind, können Sie die entsprechenden Streams abonnieren. Unter der Annahme, dass Sie einige productCreated und orderCreated Ereignisse haben, würden Sie einfach die $et-productCreated und $et-orderCreated Ereignisse abonnieren. Wenn Sie Ereignisse von diesen Streams empfangen, können Sie auch die einzelnen Streams abonnieren (z. B. product-553 und order-123), indem Sie einfach die Id aus den *Created Ereignissen verwenden.

. (Anmerkung: Projektionen sind standardmäßig deaktiviert und einmal aktiviert Sie manuell müssen möglicherweise die byType Projektion starten)

+0

In diesem Szenario würde ich mehr auf die volle Projektion als nach Typ neigen. Ich sehe nicht, wie ich durch Projektion das machen kann, was ich will. Sie können einen mit "fromstream ('product-123')" erstellen, aber ich sehe nicht, wie ich alle "product-xxx" in einen Stream projizieren kann, ohne manuell alle IDs hinzuzufügen, die ich nicht ausführen kann. – eyeballpaul

+0

Ich kann keinen Weg sehen, eine normale Projektion dafür zu verwenden, vielleicht muss ich Ihre zweite Idee verwenden, indem ich Ereignistypen wähle? Ich würde grundsätzlich JEDEN Ereignistyp für "Produkt" und "Auftrag" aggregieren wollen. Es bedeutet jedoch, dass ich die Projektion jedes Mal manuell ändern muss, wenn ich einen neuen Ereignistyp erstelle. – eyeballpaul

+0

Andere Ansätze: Erstellen Sie "Produkte" und "Bestellungen" -Streams und dann Projektionen, um an ID-spezifische Streams zu emittieren (z. B. "Produkt-553" alle Ereignisse für das Produkt mit ID 553 speichern), den Aggregattyp im Ereignis angeben Metadaten filtern in den Projektionen. – jnovo

4

Sie müssen überprüfen, ob Projektionen werden ausgeführt, da diese Funktion zum Zeitpunkt des Schreibens dieses Beitrags standardmäßig deaktiviert ist, da sich die Funktion "Prognosen" noch in der Betaphase befindet.

Es gibt eine spezielle Art Projektion genannt Kategorie Projektion das ist, was Sie wahrscheinlich brauchen. Wenn Sie Streams haben, die nach dem Muster name-id benannt sind, z. B. product-123, product-234, können Sie den Stream abonnieren, um alle Ereignisse zu empfangen, die in diesen Streams gespeichert sind.

+0

Danke für deine Antwort, aber Matt hat diese Antwort bereits gegeben und ich habe sie angenommen. – eyeballpaul

+2

Das ist in Ordnung, aber ich habe niemanden gesehen, der hier den $ ce-Stream erwähnt. Dies ist die GES-Standardprojektion, die standardmäßig vorhanden ist. Ich sehe Matt erwähnt "Kategorie Projektion" und natürlich ist das genau das gleiche, jedoch müssen Sie nicht eine separate Aggregation Stream erstellen, es ist verfügbar unter dem Namen, den ich out of the box erwähnt. –

+0

Kein Problem. Je mehr Informationen für Menschen in der Zukunft, desto besser. – eyeballpaul