Где хранить события в распределенной системе, которая использует источник событий?

Если у вас есть несколько систем, которые объединены событиями, и все они используют источники событий. Где вы храните события?

В моем случае у меня есть три системы:

  • Веб-сайт, который представляет собой магазин
  • Серверная часть веб-сайта для управления клиентами, продуктами и т. Д.
  • Система учета

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

Интересно, где бы вы сохраняли события. Конечно, каждая система должна хранить все обработанные ею события, потому что она использует источник событий и, следовательно, зависит от событий, которые она однажды обработала.

Но как насчет других событий, которые не нужны, и поэтому система не подписывается? Я борюсь с тем фактом, что требования могут измениться, так что системе придется обрабатывать события из прошлого, которые не сохранялись. Откуда бы вы взяли эти события, если бы системе нужно было обрабатывать события, на которые она не подписывалась, когда они происходили?

Я думаю, что на данном этапе существует большая разница между системами, в которых не используется источник событий. Если вам необходимо реализовать функцию в системе A, которая зависит от данных, которые недоступны в A, но в другой системе B, и вы сохраняете текущее состояние с помощью инструмента ORM, такого как NHibernate, вы можете просто импортировать эти данные из A в B . Поскольку система, в которой используется источник событий, зависит от событий, чтобы перейти в текущее состояние, вам необходимо импортировать все события, которые вы пропустили в прошлом, но которые необходимы сейчас.

Для меня есть несколько разных подходов к этому проблема.

  1. Каждая система сохраняет все публикуемые события. Это дает вам возможность повторно публиковать события, если необходимо, или импортировать их в другую систему.
  2. Каждая система сохраняет все события, которые происходят, даже те, которые не нужно обрабатывать (пока).
  3. Все события от всей системы хранятся в центральном журнале событий. Если вам нужно обработать событие, которое произошло в прошлом, но вы не подписались на него, вы можете импортировать его отсюда.

Как вы справляетесь с такой ситуацией? Где вы сохраняете свои события?

Edit

Спасибо, Рой Диктус за ваш ответ. Я все еще не знаю, как поступить в следующей ситуации:

На веб-сайте публикуются события CustomerRegistered, CustomerPurchasedProduct и CustomerMarkedProductAsFavorite. В текущей версии серверной части клиенты должны отображаться, а их покупки должны отображаться. То, что покупатель отмечен как фаворит, в этой версии системы не интересует. Таким образом, бэкэнд подписался только на CustomerRegistered и CustomerPurchasedProduct.

Теперь отдел маркетинга также хочет, чтобы информация о любимых продуктах отображалась на странице сведений о клиенте.Поскольку серверная часть не подписывалась на CustomerMarkedProductAsFavorite, эта информация недоступна в серверной части. Откуда мне получить эту информацию?

7
задан Alebo 5 June 2011 в 08:35
поделиться