Я запускаю новое приложение и хочу использовать cqrs и eventourcing. У меня возникла идея воспроизводить события для воссоздания агрегатов и моментальных снимков для ускорения, если это необходимо, используя модели памяти, кеширование и т. Д.
Мой вопрос касается больших моделей чтения, которые я не хочу хранить в памяти. Предположим, у меня есть приложение, в котором я продаю продукты, и я хочу прослушать поток событий, таких как «ProductRegistered», «ProductSold», и построить таблицу в реляционной базе данных, которая будет использоваться для отчетности или интеграции с другой системой. Предположим, есть много записей, и для этой таблицы может потребоваться от нескольких секунд до минут для усечения / восстановления, и приложение экспортирует десятки этих прогнозов для различных целей.
Как обеспечить согласованность прогнозов в этом сценарии?
С данными в памяти довольно просто и быстро воспроизвести события. Но я чувствую, что внешние проекции, которые хранятся на диске, будет намного медленнее восстанавливать.
Должен ли я всегда запускать свое приложение с TRUNCATE TABLE + rebuild для каждой внешней проекции? Со временем это кажется мне непрактичным, но, возможно, меня беспокоит проблема, которой у меня еще не было.
Поскольку таблица сама по себе подобна снимку, я мог бы вести «контрольную таблицу», чтобы определять, какое событие было последним, которое я обработал для этой проекции, поэтому я могу воспроизвести только то, что необходимо. Но меня беспокоят несоответствия в случае сбоя приложения или базы данных. Кажется, что проверка согласованности таблицы и перестройка будут такими же, что снова указывает на решение 1.
Как бы вы справились с этим таким образом, чтобы его можно было поддерживать с течением времени? Есть ли лучшие решения?
Большое тебе спасибо.