Шаблон использования для чтения "последних данных" в шаблоне CQRS + источник событий
Я нахожусь в процессе реализации тестового проекта с шаблоном CQRS (Command Query Responsibility Segregation).
У меня есть пара вопросов.
-
Я хочу проверить последнюю цену в магазине данных для элемента в корзине покупок пользователей непосредственно перед покупкой. Таким образом, цена real_model (через материализованное представление) будет проверена по отношению к самой текущей цене в хранилище данных (таблице product). Я хочу показать пользователю предупреждение, если есть несоответствие между ценой. Каков наилучший способ достичь этого?
-
Когда пользователь обновляет свою электронную почту и пароль, должен ли он по-прежнему полагаться на создание событий для обновления хранилища данных (Event->EventStore->Service Bus - >DataStore) или непосредственно обновлять хранилище данных? Я не хочу задержки события, запускающего read_model_update, поскольку пользователь должен будет немедленно войти в систему.
1 ответ:
Я подозреваю, что "лучший способ достичь этого" будет во многом зависеть от опыта покупок, который ваши заинтересованные стороны хотят предоставить клиенту. Т. е.-когда цена должна быть заблокирована? Например, возможно, цены, показанные в корзине покупок, являются твердыми котировками с ограничениями по времени.Я хочу проверить последнюю цену в магазине данных для элемента в корзине покупок пользователей непосредственно перед покупкой... Каков наилучший способ достичь этого?
Но извиняюсь за эти подробности...
Один из подходов состоит в том, чтобы выполнить проверку вменяемости по модели read перед отправкой команды. Существует общий шаблон (эффективно) проверки, чтобы увидеть, будет ли команда работать, учитывая состояние модели чтения, а затем отправка предварительно проверенной команды для обновления книги записей. Вы обмениваете некоторую задержку на снижение частоты отказов.
Другой возможностью было бы использовать менеджер процессов; идея заключается в том, что "placeOrder" не является простая запись в модель, но скорее начало жизненного цикла. Итак, представьте себе, например, что ценовое предложение является вещью в вашей модели - когда товар помещается в корзину, генерируется ценовое предложение (возможно, с некоторым сроком действия). При изменении цены обновляются все различные котировки. Когда ордер размещен, обработчик видит событие placedOrder и пытается вызвать метод acceptQuote для котировки цены; если котировка все еще действительна, то генерируется событие продвигает процесс заказа к следующему состоянию. Если цитата больше не действительна, то либо генерируется другое событие, либо команда отклоняется, и в конечном итоге тайм-аут показывает, что может возникнуть проблема....
(Вы можете попробовать сделать что-то подобное с самим продуктом, но это не работает так хорошо из-за проблем с конкуренцией; единственный способ узнать, что вы работаете с Самым последним состоянием объекта, - это записать его в Книгу запись.)
Может быть полезно рассмотреть условия расы не существуют по Уди Дахану.
Когда пользователь обновляет свою электронную почту и пароль, должен ли он по-прежнему полагаться на создание событий для обновления хранилища данных (Event->EventStore->Service Bus - >DataStore) или непосредственно обновлять хранилище данных?
Никаких прямых обновлений - все обновления модели чтения должны произойти-после обновления книги записей.
Я не хочу d