Источники событий распределяются как бонус для нескольких вещей, например. истории событий/аудита, полной и последовательной регенерации просмотров и т.д. Звучит здорово. Я фанат. Но это детали реализации на стороне чтения, и вы можете сделать то же самое, переместив хранилище событий полностью на чтение в качестве другого абонента. Так почему бы и нет?
Вот некоторые мысли:
- Представления/денормализаторы не заботятся о хранилище событий. Они просто обрабатывают события из домена.
- Перемещение хранилища событий в сторону чтения по-прежнему дает вам историю событий/аудит
- Вы все еще можете восстановить свои представления из хранилища событий. Кроме того, это не должно быть утечкой модели записи. Дайте ему образцовое гражданство!
Здесь, кажется, есть один технический аргумент для сохранения его на стороне записи. Это от Грега Янга на http://codebetter.com/gregyoung/2010/02/20/why-use-event-sourcing/:
Однако существуют некоторые проблемы, связанные с использованием того, что хранит моментальный снимок текущего состояния. Самая большая проблема связана с тем, что вы представили две модели для своих данных. У вас есть модель события и модель, представляющая текущее состояние.
То, что мне интересно, это термин "моментальный снимок", который в последнее время стал выдающимся термином в случае поиска источников. Представление магазина событий на стороне записи добавляет некоторые накладные расходы для загрузки агрегатов. Вы можете обсуждать, сколько накладных расходов, но это, по-видимому, воспринимаемая или ожидаемая проблема, поскольку в настоящее время существует концепция загрузки агрегатов из моментального снимка и всех событий со момента создания моментального снимка. Итак, теперь у нас есть... две модели снова. И не только это, но предложения по созданию снимков, которые я видел, предназначены для реализации в качестве утечки инфраструктуры, при этом фоновый процесс перемещается по всему вашему хранилищу данных, чтобы сохранить работоспособность.
И после того, как снимок сделан, события до моментального снимка становятся на 100% бесполезными с точки зрения записи, за исключением... для восстановления прочитанной стороны! Это кажется неправильным.
Еще одна тема, связанная с производительностью: хранилище файлов. Иногда нам приходится связывать большие двоичные файлы с сущностями. Понятно, что иногда они связаны с сущностями, но иногда они представляют собой сущности. Помещение их в хранилище событий означает, что вы должны физически загружать эти данные каждый раз при загрузке объекта. Это достаточно плохо, но представьте несколько или сотни из них в большой совокупности. Каждый ответ, который я видел, заключается в том, чтобы в основном укусить пулю и передать uri в файл. Это отмена и подрывает распределенную систему.
Тогда там обслуживание. Для перестройки просмотров требуется процесс, включающий хранилище событий. Таким образом, теперь любая задача обслуживания вида, которую вы когда-либо пишете, связывает вашу модель записи с использованием хранилища событий навсегда.
Разве не все точки CQRS, что случаи использования вокруг модели чтения и модели записи принципиально несовместимы? Итак, почему мы должны помещать читаемые элементы модели на стороне записи, жертвуя гибкостью и производительностью, и снова связываем их. Зачем тратить время?
Итак, в целом, я смущен. Во всех отношениях от того места, где я сижу, хранилище событий имеет больше смысла в качестве прочитанной модели. Вы по-прежнему достигаете многих преимуществ хранения хранилища событий, но вы не чрезмерно абстрактно сохраняете на стороне записи, возможно, уменьшая гибкость и производительность. И вы не связываете свою сторону чтения и записи резервными абстракциями и задачами обслуживания.
Так может кто-нибудь, пожалуйста, объясните мне одну или несколько убедительных причин, чтобы сохранить ее на стороне записи? Или, альтернативно, почему это НЕ должно идти на стороне чтения в качестве беспокойства по обслуживанию/отчетности? Опять же, я не стану сомневаться в полезности магазина. Где он должен идти:)