2016-11-22 13 views
2

Я читал о шаблоне Event Sourcing, который может быть очень полезен, если вы хотите перестроить свою систему. Однако, что, если мне нужно запустить восстановление события при обслуживании новых входящих запросов? Есть ли какой-либо конкретный образец или передовая практика для этого сценария? Итак, вместо того, чтобы планировать простои системы, как я могу гарантировать, что новые входящие запросы не испортят мою систему во время повторного воспроизведения, потому что синхронизация событий и последовательность действительно важны для моей системы. Он включает в себя обновление записей БД, которые зависят от последовательности событий. Есть предположения?Event sourcing - воспроизведение событий

+0

Мне кажется очень похожий мой вопрос http://stackoverflow.com/questions/38197712/event-sourcing-avoid-projects-duplicated-events-while-replaying-events-and-list – martinezdelariva

ответ

0

С ограничениями, которые вы описали, это звучит как live перестройка с нуля не может быть частью ваших планов. Вместо этого вы можете настроить A/B, играя через события в новой системе, находящейся в автономном режиме в этой точке, и затем переходите к новой системе, когда она догнала. Ключ состоит в том, что как старые, так и новые системы могут одновременно настраиваться на поток событий.

Если у вас разные системы, подписанные на подмножества событий, возможно, вам нужно только воспроизвести события для одной из этих подсистем, а ваши потребности в синхронизации/последовательности могут быть выполнены без этой подсистемы в игре.

Вы можете предотвратить использование устаревшей информации, включив в нее порядковые номера событий и обработав обработку, зависящую от последовательности, если она еще не увидела это событие.

+0

Спасибо, что означает, что для я должен обеспечить, чтобы новая система сделала все догонялки, мне нужно будет запланировать небольшой простои и отключить старую систему, чтобы гарантировать, что новые данные не поступят в старую систему. Затем, как только подтвердится, что новая система полностью догоняет, мне нужно будет включить новую систему. Кажется, мне нужно запланировать некоторое время простоя для моего обслуживания, несмотря ни на что, только для обеспечения точности данных. Исправьте меня, если я ошибаюсь. – Nyamnyam

+0

Я думаю, что вы недопонимаете. Журнал событий является источником истины при поиске источников, а все другие системы - это только потребители событий.Время простоя не обязательно; это только вопрос обеспечения того, чтобы вы были удовлетворены тем, как события будут обрабатываться в любое время во время такого переключения. – rep

0

Для проецирования ваших событий на считываемую модель вам нужно использовать какую-то догоняющую подписку, такую ​​как та, которую предоставляет EventStore. В этом случае ваши новые события будут сохранены в магазине, но не будут немедленно проецироваться.

Однако вы должны понимать, что ваши пользователи начнут видеть сильно устаревшие данные и делать действия на основе непоследовательной модели чтения. Я бы предпочел избежать этого и позволить системе перестраиваться.

Я согласен с первым ответом на то, что вы можете захотеть создать новую модель чтения параллельно с обновлением старой и переключением в какой-то момент, возможно, даже не для всех пользователей.

+0

Если возможно, мы предпочитаем не использовать стороннюю библиотеку для воспроизведения события. – Nyamnyam

+0

EventStore не является библиотекой http://www.geteventstore.com –

0

Я использовал CQRS + ES в подобном случае. Я создал проекцию с подготовленными данными, что я мог только обновлять, но не перестраивать. И при каждом запросе я быстро создал информацию о результатах.

Если вам нужно выполнить некоторые длительные операции (например, обновление в db), используйте sagas. Генерировать событие -> сага -> обновлять проекцию после завершения саги и генерировать событие2.

Конечно, это будет некоторая задержка между доходом события и обновлением прогноза.

Очень интересно узнать больше о вашей системе, и если такой вариант вам подходит.