Саги, основанные на времени, с поиском событий

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

Теперь, если бы эта сага была полностью в памяти и мне пришлось бы перезапустить приложение / сервер, сага была бы выгружена и больше никогда не просматривалась, верно?

Могу ли я использовать Event Sourcing, чтобы ускорить эту сагу после того, как система снова подключится к сети?

Если это так, мне понадобится отдельное хранилище событий с «активными сагами», которые можно будет воспроизвести при запуске системы, чтобы мои саги стали быстрее. Пока мне кажется это хорошо, но как мне реализовать тайм-аут?

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


person Kristoffer Lindvall    schedule 10.10.2011    source источник


Ответы (1)


Лучший способ реализовать эту возможность - использовать другую конечную точку, которая способна вернуть вам сообщение в определенный момент времени. Например, ваша сага может отправить сообщение этому «диспетчеру тайм-аута» и сказать, что разбуди меня через 1 час, 1 день или даже 1 год. Сообщение будет возвращено вам в это время. В идеале это сообщение должно иметь деловой смысл, вызывающий действие.

Возможно, лучшим примером этого является что-то вроде регистрации клиента, где, если клиент не подтвердил свою учетную запись в течение 7 дней с момента регистрации, вы должны уведомить его по электронной почте. Фактически "сообщение о тайм-ауте" будет: RemindUserToConfirmAccountMessage. Когда это сообщение будет получено сагой через 7 дней, сага определит на основе своего текущего состояния, нужно ли обработать это сообщение и отправить электронное письмо клиента. Но если пользователь уже подтвердил свою учетную запись, сообщение может быть отклонено без каких-либо действий.

person Jonathan Oliver    schedule 11.10.2011
comment
Как я могу сделать сагу, которая живет 7 дней? Я уверен, что это должно быть сохранено в случае перезапуска службы, верно? - person Mauro Destro; 11.10.2011
comment
@MauroDestro Вам не обязательно хранить саги в памяти при использовании Event Sourcing. Думайте о саге как о сущности, которую вы можете воспроизвести, прежде чем она должна обработать Событие. Сравните с тем, как вы бы воспроизвели агрегат до того, как он обработает команду. Использование подхода Джонатана для обработки тайм-аутов (превращение их в события сами по себе) также позволяет воспроизвести время. - person Kristoffer Lindvall; 11.10.2011