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