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
События.
(Примечание. По умолчанию проекции отключены, и после их включения может потребоваться вручную запустить проекцию по типу.)