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