Приобретение событий и CQRS отличное, потому что он заставляет разработчиков разработчиков застревать с одной предварительно смоделированной базой данных, с которой разработчик должен работать в течение всего срока службы приложения, если не существует большого проекта переноса данных. CQRS и ES также имеют другие преимущества, такие как масштабирование eventstore, журнал аудита и т.д., Которые уже находятся по всему Интернету.
Но каковы недостатки?
Вот некоторые недостатки, которые я могу придумать после изучения и написания небольших демонстрационных приложений
- Комплекс: Некоторые говорят, что ES сложна. Но я бы сказал, что сложное приложение лучше, чем сложная модель базы данных, на которой вы можете запускать очень ограниченные запросы с использованием языка запросов (несколько объединений, индексов и т.д.). Я имею в виду, что некоторые языки программирования, такие как Scala, имеют очень богатую библиотеку коллекций, которая очень гибкая, чтобы создавать некоторые серьёзные сложные агрегации, а также Apache Spark, которая упрощает сбор распределенных запросов. Но базы данных всегда будут ограничены возможностями языка запросов, а распределение баз данных сложнее, чем распределенный код приложения (просто разверните другой экземпляр на другой машине!).
- Использование большого дискового пространства. Хранилище событий может использовать много дискового пространства для хранения событий. Но мы можем запланировать очистку каждые несколько недель и создание моментального снимка, и, возможно, мы можем хранить исторические события локально на внешнем HD просто, если нам нужны старые события в будущем?
- Использование высокой памяти. Состояние каждого объекта домена хранится в памяти, что может увеличить использование ОЗУ, и все мы, как дорогостоящее ОЗУ. БОЛЬШАЯ ПРОБЛЕМА!!, потому что я беден! любое решение для этого? Может ли использовать Sqlite вместо сохранения состояния в памяти? Я делаю вещи более сложными, вводя несколько экземпляров Sqlite в моем приложении?
- Более длительное время загрузки. При сбое или обновлении программного обеспечения загрузка выполняется медленно в зависимости от количества событий. Но мы можем использовать моментальные снимки, чтобы решить эту проблему?
- Конечная согласованность: проблема для некоторых приложений. Представьте, что если Facebook использовал Историю источников событий с CQRS для хранения сообщений и учитывая, насколько загружена система facebook, и если бы я опубликовал сообщение, я бы увидела сообщение на fb на следующий день:)
- Сериализованные события в хранилище событий. События хранят события в виде сериализованных объектов, что означает, что мы не можем запрашивать содержимое событий в хранилище событий, которое в любом случае не рекомендуется. И мы не сможем добавить еще один атрибут события в будущем. Решение было бы хранить события как объекты JSON вместо сериализованных событий? Но это хорошая идея? Или добавить еще события для поддержки изменения объекта события orignal?
Может кто-нибудь прокомментировать недостатки, которые я здесь привел, и исправить меня, если я ошибаюсь, и предложить любые другие, которые я, возможно, пропустил?