EventStore Подписка на поток для категории

Я начал создавать тестовое приложение в.Net, которое использует EventStore от Грега Янга в качестве резервного хранилища для CQRS/ES.

Чтобы упростить загрузку полной совокупности, я сохраняю поток с именем "agg-123". Например, для совокупности продуктов с идентификатором 553 будет существовать поток с именем "product-553". И то же самое для агрегата "Order", поток будет называться "order-123".

От регидратации и сохранения событий это работает хорошо.

Сейчас я пытаюсь создать прослушиватель, который будет прослушивать определенные потоки, чтобы затем заполнить базу данных запросов. Методы подписки, которые я вижу, могут только подписываться на "order-123" или "all". Я не вижу, как я могу подписаться на "продукт" или "заказ", или оба.

Я думаю, что либо

  • Я пропустил точку с именами потоков и назвал их неправильно
  • Упустили способ выбрать его, что-то вроде "продукта-*"
  • Ожидается, что он подпишется на "все" и отфильтровывает то, что вас не интересует, хотя это создает проблему, так как он также отправляет все события "статистика"

Кто-нибудь совет?

3 ответа

Решение

В ваших прогнозах вы можете использовать fromCategory(). EventStore классифицирует каждый поток по имени потока вплоть до первого "-". Таким образом, ваши потоки 'order-123' и 'order-456' находятся в категории 'order'.

Так что вы можете сделать что-то вроде:

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

Это спроецирует все связанные с заказами события из всех агрегатов заказов в один поток "заказов", на который вы можете подписаться.

Вам нужно убедиться, что проекции категории выполняются. (Прошло много времени с тех пор, как я использовал EventStore, он вернулся, когда прогнозы были в бета-версии и не были включены по умолчанию, не уверен, что в последних версиях то же самое)

Вам нужно проверить, работают ли проекции, так как эта функция по умолчанию отключена на момент написания этого поста, так как функция проекций все еще находится в бета-версии.

Существует специальная проекция типа, называемая категориальной проекцией, которая вам, вероятно, нужна. Если у вас есть потоки, которые названы после name-id шаблон, например product-123, product-234Вы можете подписаться на $ce-product поток, чтобы получить все события, которые сохраняются в этих потоках.

Из стоимости создания потоковой статьи:

Обычно, когда люди хотят только несколько потоков, это потому, что они хотят считывать вещи определенным образом для определенного типа читателей. Это можно сделать другими способами. Внутренне Магазин Событий - по сути тематический паб / саб. То, что вы можете сделать, это перераспределить ваши потоки, используя проекции, чтобы помочь обеспечить конкретного читателя. В качестве примера скажем, что читатель интересовался всеми событиями InventoryItemCreated и InventoryItemDeactivation, но не интересовался всеми другими событиями в системе. Поддержка этого потока, когда у нас есть события во многих миллионах потоков, все еще может быть сделана.

Для этого мы создадим проекцию для переиндексации потоков.

Таким образом, идея заключается в том, что вы могли бы создать две проекции для создания событий для некоторых products а также orders потоки.

В той же статье упоминается проекция системного типа, которая создает поток для каждого типа события с именем $et-{typename}, Это также может оказаться полезным в вашем случае.

Например, если вы заинтересованы только в наблюдении за созданием агрегатов, вы можете подписаться на соответствующие потоки. Предполагая, что у вас есть некоторые productCreated а также orderCreated события, вы бы просто подписаться на $et-productCreated а также $et-orderCreated События. После получения событий из этих потоков вы также можете подписаться на отдельные потоки (например, product-553 а также order-123) просто потребляя Id от *Created События.

(Примечание. По умолчанию проекции отключены, и после их включения может потребоваться вручную запустить проекцию по типу.)

Другие вопросы по тегам