2016-01-12 2 views
7

J'ai commencé à créer une application de test dans .Net, qui utilise EventStore de Greg Young comme magasin de support pour CQRS/ES. Pour faciliter le chargement d'un agrégat complet, j'enregistre dans un flux nommé "agg-123". Par exemple, pour un agrégat de produit avec un identifiant de 553, il y aurait un flux nommé "product-553". Et même chose pour un agrégat "Order", le flux serait nommé "order-123". De la réhydratation et de la sauvegarde des événements, cela fonctionne bien.EventStore Abonnement à un flux pour une catégorie

Je tente maintenant de créer un écouteur qui écoutera certains flux pour ensuite remplir une base de données de requêtes. Les méthodes d'abonnement que je vois ne peuvent s'abonner qu'à "order-123", ou "all". Je ne vois pas comment je pourrais m'abonner à "product-" ou "order-", ou aux deux.

J'imagine que soit

  • J'ai manqué le point avec les noms des cours d'eau, et les ont nommé mal
  • ont manqué un moyen de choisir, quelque chose comme de « produits * »
  • Il est censé s'abonner à "tout" et filtrer ce qui ne vous intéresse pas, bien que cela donne le problème qu'il envoie également tous les événements "stats"

Quelqu'un a-t-il des conseils?

+0

Salut Eyeball, si possible - pouvez-vous vérifier ma question ici: https://stackoverflow.com/questions/35828118/subscribe-to-stream-event-never-appear-in-subscription-client - semble que je avoir un peu le "problème". – janhartmann

Répondre

4

Dans vos projections, vous pouvez utiliser fromCategory(). EventStore catégorise chaque flux par le nom du flux jusqu'au premier '-'. Vos flux "order-123" et "order-456" sont donc dans la catégorie "order".

Ainsi, vous pouvez faire quelque chose comme:

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

Ce projettera tous les événements liés à la commande de tous les agrégats pour en un seul flux « ordres » que vous pouvez vous abonner.

Vous devez vous assurer que les projections de catégorie sont en cours d'exécution. (Cela fait longtemps que j'ai utilisé EventStore, il était de retour lorsque les projections étaient en bêta et n'étaient pas activées par défaut, je ne sais pas si les choses sont les mêmes dans les dernières versions)

+0

Parfait, c'est exactement ce que je cherchais! – eyeballpaul

1

De The cost of creating a stream article:

En général, quand les gens veulent seulement quelques cours d'eau son parce qu'ils veulent lire des choses d'une certaine manière pour un type particulier de lecteur . Cela peut être fait d'autres façons. En interne, le magasin d'événements est essentiellement un sujet basé sur pub/sub. Ce que vous pouvez faire est de repartitionner vos flux en utilisant des projections pour aider à fournir un lecteur spécifique. À titre d'exemple, disons qu'un lecteur était intéressé par tous les événements InventoryItemCreated et InventoryItemDeactivated mais n'était pas intéressé par tous les autres événements dans le système. Soutenir ce flux lorsque nous avons les événements dans plusieurs millions de flux peut encore être fait. Pour ce faire, nous allons créer une projection pour réindexer les flux. Pour cela, nous allons créer une projection pour réindexer les flux.

L'idée est que vous pouvez créer deux projections pour émettre des événements à certains products et orders cours d'eau.

Dans le même article, la projection de type bytype système est mentionnée, ce qui crée un flux pour chaque type d'événement avec le nom $et-{typename}. Cela pourrait également s'avérer utile dans votre cas. Par exemple, si vous souhaitez seulement observer la création des agrégats, vous pouvez vous abonner aux flux correspondants. En supposant que vous avez des événements productCreated et orderCreated, vous vous abonnez simplement aux événements $et-productCreated et $et-orderCreated. Lors de la réception d'événements de ces flux, vous pouvez également vous abonner aux flux individuels (par exemple product-553 et order-123) simplement en consommant le Id des événements *Created.

(Note:. Projections sont désactivées par défaut et une fois activé, vous devrez peut-être démarrer manuellement la projection byType)

+0

Dans ce scénario, je me pencherais davantage sur la projection complète que sur le type. Je ne vois pas comment je peux faire ce que je veux par projection. Vous pouvez en créer un avec "fromstream ('product-123')", mais je ne vois pas comment je peux projeter tous les "product-xxx" dans un flux sans ajouter manuellement tous les ID que je ne peux pas faire. – eyeballpaul

+0

Je ne vois pas de moyen d'utiliser une projection normale pour cela, peut-être que j'ai besoin d'utiliser votre deuxième idée, en choisissant des types d'événements? Je voudrais essentiellement tout type d'événement pour "produit" et "ordre" agrégat. Cela signifie que je dois changer manuellement la projection chaque fois que je crée un nouveau type d'événement. – eyeballpaul

+0

Autres approches: créez des flux 'products' et' orders' puis des projections pour émettre dans des flux spécifiques à l'ID (par exemple 'product-553' stockant tous les événements pour le produit avec l'ID 553), spécifiez le type d'agrégat dans l'événement les métadonnées effectuent un filtrage dans les projections. – jnovo

4

Vous devez vérifier si les projections sont en cours d'exécution, car cette fonctionnalité est désactivée par défaut au moment de l'écriture de ce post, car la fonctionnalité Projections est toujours en version bêta.

Il existe une projection de type spécial appelée projection de catégorie dont vous avez probablement besoin. Si vous avez des flux nommés suivant le modèle name-id, par exemple product-123, product-234, vous pouvez vous abonner au flux $ce-product pour recevoir tous les événements enregistrés dans ces flux.

+0

Merci pour votre réponse, mais Matt a déjà fourni cette réponse, et je l'ai accepté. – eyeballpaul

+2

Ça va, mais je n'ai vu personne ici mentionner le $ ce-stream. C'est la projection par défaut de GES qui existe par défaut. Je vois Matt mentionné "catégorie de projection" et bien sûr, c'est exactement le même, cependant, vous n'avez pas besoin de créer un flux d'agrégation séparé, il est disponible sous le nom que j'ai mentionné hors de la boîte. –

+0

Pas de problème. Le plus d'informations pour les gens dans le futur, le mieux. – eyeballpaul