В настоящее время мы оцениваем архитектуры CQRS и Event Sourcing. Я пытаюсь понять, каковы последствия использования такого дизайна. Вот два вопроса, на которые я пытаюсь найти ответы:
1)
Что произойдет, если после того, как приложение некоторое время будет запущено и запущено, появится новое требование добавить дополнительное поле в ViewModel в базе данных ReadModel? Например, почтовый индекс клиента требуется в ViewModel CustomerList, где он не был ранее. Таким образом, дополнительный столбец можно легко добавить в базу данных ViewModel, но как он заполняется? Насколько я вижу, единственный способ - очистить базу данных для чтения и воспроизвести все события с нуля, чтобы создать базу данных ReadModel. Но что делать, если приложение работало месяцами или годами (как мы надеемся, так и будет). Это могут быть миллионы событий для воспроизведения, просто для добавления данных для столбца почтового индекса.
У меня такая же проблема, если по какой-либо технической причине база данных ReadModel вышла из синхронизации или мы хотим добавить новую базу данных ReadModel. Похоже, что чем старше приложение, и чем больше оно используется, тем сложнее и дороже оно получает современную версию для чтения. Или я где-то упускаю трюк? Что-то вроде снимков ReadModel?
2)
Что произойдет, если после того, как все миллионы событий будут воспроизведены для создания базы данных для чтения, некоторые данные не совпадают с ожидаемыми (то есть выглядят неправильно). Считается, что, возможно, ошибка где-то в хранении событий или денормализация подпрограмм могла вызвать это (и кажется, что если есть одна вещь, на которую вы можете положиться в кодировании, это ошибки). Как идти об отладке этого! Это кажется невыполнимой задачей. Или, может быть, мне опять не хватает трюка.
Мне было бы интересно услышать от любого, кто какое-то время работал с такой системой, как у вас сработали пути обслуживания и обновления.
Спасибо за любое время и вклад.