В настоящее время я читаю о DDD, и мне не удалось найти ответ на этот вопрос. Если у нас есть большое приложение с несколькими ограниченными контекстами, то, насколько я знаю, мы должны реализовать каждый BC как отдельное приложение. Отсюда логично прийти к выводу, что у каждой БК свой UI и хранилище событий. Раньше я думал, что у нас есть только одно хранилище событий, потому что это единственный источник правды, согласно некоторым статьям (о CQRS). Единственная проблема с этими утверждениями в том, что им не хватает контекста. Итак, является ли хранилище событий единственным источником достоверной информации в одном ограниченном контексте или во всем приложении?
Сколько хранилищ событий мы должны использовать для нескольких ограниченных контекстов?
comment
Некоторое время назад я задавал аналогичный вопрос в почтовой группе DDD и, к сожалению, не получил убедительного ответа. Одним из недостатков использования нескольких хранилищ событий является усложнение воспроизведения событий из всех этих хранилищ. Вы бы запускали их параллельно? последовательно? Как бы вы тем временем поставили в очередь входящие события? много сложных задач и так мало материала для принятия решений :)
- person Songo   schedule 17.01.2016
comment
@Songo У меня сложилось впечатление, что с несколькими хранилищами лучше. По крайней мере, каждый бк должен быть чем-то вроде отдельного приложения. Таким образом, воспроизведение должно выполняться на уровне bc, а не для каждого отдельного bc. По крайней мере, это кажется логичным, но я тоже не уверен. Попробую спросить у кого-нибудь с опытом DDD, может, ответит.
- person inf3rno   schedule 18.01.2016
comment
@Songo Я разговаривал с парнем, он предпочитает одно хранилище событий и использует несколько хранилищ событий только в том случае, если есть причина, например, разные команды работают над разными bc-s, и у них нет доступа к базам данных друг друга, или быстрее использовать несколько хранилищ событий и т. д. Так что здесь нет эмпирического правила, я думаю, что могу принять ответ Дарисса.
- person inf3rno   schedule 19.01.2016
comment
Прохладный! Какой магазин событий он использует? Насколько я знаю, ни одно хранилище событий не поддерживает эту функциональность из коробки. Я надеялся, что смогу найти хранилище событий, которое поддерживает порционирование (т. е. несколько физических хранилищ, но действует как одно логическое) так же, как вы разбиваете базу данных.
- person Songo   schedule 19.01.2016
comment
@Songo Почему это так важно? Я имею в виду, что в текущем bc вам нужны только связанные события. События других bc-ов действуют как команды (ака. сага), которые могут вызывать различные события в вашем текущем bc.
- person inf3rno   schedule 19.01.2016
Ответы (1)
"Is an ES the single source of truth in a bounded context or in entire application?"
Я думаю, вы имели в виду систему, потому что Bounded Context — это приложение в самом простом объяснении.
"If we have a large application with multiple bounded contexts"
У вас не может быть нескольких ограниченных контекстов в одной и той же модели. Модель ограничений ограниченного контекста. Таким образом, вы должны заменить термин bounded context
на subdomain
, и это будет правильно.
Во всяком случае, отвечая на ваш вопрос. Это зависит.
Единое хранилище событий для всей системы
Плюсы
- Одно место для управления
- Легко увидеть связанные события по CorrelationID
- В некоторых программах нет необходимости в обнаружении служб. Все сервисы (приложения) могут интегрироваться через единую ЭС (имеется в виду настоящая ЭС, а не хранилище данных).
- Требуется меньше процессора/памяти
Минусы
- Единая точка отказа (конечно, вы можете масштабировать ее, чтобы избежать такой ситуации)
- Вы соединяете сервисы вместе (нарушая правило микросервиса)
- Обязан не менять ЭП в течение срока службы системы
Один магазин событий для каждого приложения
Плюсы
- Нет единой точки отказа
- Развернуто с приложением
- Нет связи между услугами. Больше автономии
- Если приложение будет отключено, ES можно отключить вместе с ним
- Новые сервисы могут работать с новыми версиями или даже с другой ES.
Минусы
- Дополнительные базы данных, о которых нужно заботиться и отслеживать
- Больше процессора/ОЗУ потребляется
- Сложнее управлять идентификаторами корреляции, поскольку они разделены между несколькими ES.
- Требуется некоторое обнаружение службы. Для подписки на несколько ES или необходимости в дополнительной очереди сообщений
person
Dariss
schedule
09.01.2016
Хм интересно, я не знал, что можно выбирать, я думал, что есть строгое правило.
- person inf3rno; 09.01.2016
Почему вы предполагаете архитектуру микросервисов? Ваш ответ, кажется, сосредоточен на микросервисах, хотя вопрос не имеет к этому никакого отношения. Или я неправильно понимаю ваш ответ?
- person theDmi; 11.01.2016
Мы говорим о EventStore в ограниченном контексте. Мои ответы основаны на архитектуре микросервисов, вы прямо здесь. Но как вы его применяете: как микросервисную архитектуру, SOA-архитектуру или просто безымянную распределенную архитектуру — не имеет значения. Если вы идете с монолитным приложением, и вы не касаетесь множественных ES, потому что это не имеет смысла.
- person Dariss; 11.01.2016