Обеспечение достаточного баланса счета для транзакции представляется в вашем случае неизменным бизнес-правилом. Итак, давайте предположим, что это не может быть нарушено.
Тогда вопрос заключается просто в том, как обрабатывать «транзакции», которые охватывают граничные контексты.
DDD действительно говорит, что транзакции (инвариантные границы ) не должен пересекать ограниченный контекст (B C). Правило применимо даже на уровне агрегатов. Но правильным способом его чтения будет транзакция как часть «одного запроса».
Лучший способ справиться с этим сценарием - просто принять запрос от пользовательского интерфейса, чтобы сделать ставку, и вернуть «202». Принят »сообщение о состоянии, вместе с уникальным идентификатором отслеживания работы. Единственное взаимодействие с базой данных во время обработки запроса должно состоять в том, чтобы сохранить данные в таблице «Задания» и, вероятно, вызвать событие домена «BET_PLACED».
После этого вы будете обрабатывать ставку асинхронно. Да, обработка все равно будет включать вызов ограниченного контекста Аккаунтов, но через опубликованный API. Поскольку вы больше не находитесь в контексте запроса, время обработки не обязательно укладывается в обычные ограничения.
После завершения обработки любой пользовательский интерфейс будет регулярно обновлять sh страницу и обновлять Пользователь, или вы можете отправить Pu sh Уведомление в браузер.