Наш инструмент
В нашей команде мы работаем над инструментом, который использует источник событий. События используются для построения (времени выполнения) и перестройки (запуска) состояния агрегатов в нашей системе. Различные микросервисы (хранилища просмотров, репозитории ...) подключаются к потоку событий, чтобы построить свое состояние.
Проблема
Я работаю над проблемой, для которой пользователь может выбрать создание резервной точки для одного из этих агрегатов. Позже пользователь может вернуться к этой точке.
Предлагаемое решение
Моя идея - создать два события:
BackupCreatedEvent
BackupRestoredEvent
BackupCreatedEvent
будет содержать идентификатор агрегата, метку времени и идентификатор резервной копии. При запуске восстановления состояние агрегата будет отброшено. Затем произойдет воспроизведение всех событий в хранилище событий, которые применяются только к этому агрегату. Воспроизведение остановится, как только будет нажата BackupCreatedEvent
с соответствующими идентификаторами агрегата и резервной копии. Это должно вернуть агрегат в нужное состояние.
Всякий раз, когда вы перезапускаете приложение и вам необходимо перестроить все агрегаты, я намерен сделать следующее. Если во время воспроизведения события я наберу BackupCreatedEvent
для совокупности X
, он будет игнорировать любое последующее событие, применяемое к X
, пока не достигну совпадения BackupRestoredEvent
.
Вопрос и соображения
Когда я читаю об источнике событий, вы не можете изменять какие-либо события в вашем хранилище событий. Например, вы не должны помечать их как игнорируемые или пропускаемые во время воспроизведения. Также вы не должны удалять их из вашего магазина событий.
Мы рассмотрели возможность использования моментальных снимков, но у нас есть много служб (например, просмотровых), которые могут только применять события постепенно и не имеют возможности загружать моментальный снимок агрегата. Мы должны были бы построить эту способность.
Мой вопрос в основном: Можно ли игнорировать события при воспроизведении?