У меня есть случай синхронизации в моем дизайне CQRS/ES. Ради обсуждения давайте опишем его на примере Microsoft на эту тему, конференционное управление (https://msdn.microsoft.com/en-us/library/jj554200.aspx).CQRS/Event Sourcing/Event bus/Timing
Два контекста: управление конференцией и управление заказами. При управлении конференцией вы создаете конференцию и меняете ее свойства (например, максимальные места). Управление конференцией связывается с управлением заказами через шину событий. Таким образом, управление заказами знает, когда создается новая конференция, и создайте экземпляр объекта отслеживания (доступность места) в его контексте. Событие, такое как «максимальная доступность сидений уменьшается от 100 до 80», также сообщается из conf mgmt для заказа mgmt через автобус событий.
- Предположим, что на минуту создана конференция (максимум 20 мест).
- В минуту 4 событие достигает порядка mgmt заказа, и, следовательно, создается доступность места.
- В минуту 7 пользователь сделал заказ (через управление заказами), купив все 20 мест. (это должно быть сообщено также из - управления заказами для управления conf, чтобы conf admin мог принять правильное решение).
- В минуту 8 conf admin сделал замену на наличие мест (в контексте conf mgmt), уменьшив его до 15.
- Уведомление от заказа mgmt (о том, что все 20 мест были проданы) прибывает с минуты 9.
- Что теперь делать? (в conf mgmt? вы не должны были уменьшать места до 15, когда вы уже получили платеж за 20, но на минуту 8 администратор не знал об этом).
Это первый случай.
Теперь второй случай:
- Допустим на минуту 1 конференции создается (максимум мест 20).
- В минуту 4 событие достигает порядка mgmt заказа, и, следовательно, создается доступность места.
- В минуту 6 conf admin сделал изменение доступности мест (в контексте conf mgmt), уменьшив его до 15.
- В минуту 7 пользователь сделал заказ (через управление заказами), купив все 20 мест. Он не знает, что доступность сокращена до 15, потому что событие не достигло этого момента.
- В 10 минут, наконец, прибыло уведомление от conf mgmt.
- Что теперь делать?
Эти проблемы связаны с техническими проблемами (задержка при передаче события). Есть ли чисто технические способы избежать этого? Если нет, то каким будет бизнес-путь/дизайн-способ преодолеть это?
Добавлено примечание: Я знаю, что это проблема возможной согласованности, относящаяся к архитектуре CQRS/ES. В одном контексте это может быть легче решить, потому что для этого вы можете использовать команды (например, отменить). Но между ограниченным контекстом вы не должны передавать команды, вы общаетесь только с событиями, и я думаю, что событие не является правильной абстракцией для этого (потому что оно представляет собой то, что произошло). Или я чего-то не хватает?
Добавлено примечание: может быть, эта статья может предоставить больше контекста и намекнуть на решение, хотя для этого конкретного случая в этом вопросе я так не думаю (речь идет не о сообщении не по порядку). http://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-i-of-ii/
Добавлено примечание: или, может быть, ... в контексте управления заказами мы можем просто поставить очередь на команду для покупки места, пока мы не узнаем, что мы получили последнее/последнее событие из контекста управления конференцией. Я имею в виду, события приходят с меткой времени, не так ли? Таким образом, мы можем сравнить временную метку последнего события, которое мы получили от conf mgmt, с отметкой времени для команды покупки места. Если ts последнего события меньше, чем ts команды, мы просто не выполняем выполнение команды, пока не получим событие, ts которого больше ts команды. Такого рода ответственность несет менеджер процесса (сага).
Будет ли это работать? Это правильный подход?
Добавлено примечание: соответствующая тема>Implementing a Saga/Process Manager in a CQRS http application. Я думаю, что мы на правильном пути с менеджером процессов. Как сказал ответчик: «Вы просто не отвечаете« Подтвержденный заказ »сразу. Посмотрите, как это делают Amazon и другие торговые сайты: после получения заказа вы получаете только подтверждение« Принятое заказ »(например, HTTP Code 202 Accepted). ".
Это до логики технолога-менеджер, чтобы решить, когда на самом деле выполнить команду (на основе определенного состояния, внутреннее состояние, может быть, или в этом случае последнее получило событие от другого контекста).
Любые мнения?
Спасибо, Raka
В описываемом вами сценарии, что говорит бизнес? Спросите эксперта по домену, что должно произойти в этом сценарии – tomliversidge