Саги на основе времени с источником событий - PullRequest
7 голосов
/ 10 октября 2011

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

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

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

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

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

1 Ответ

7 голосов
/ 11 октября 2011

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

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

...