Вот о чем я думаю. Видите ли вы какие-либо проблемы с этим обходным путем для эмуляции двухфазного принятия при использовании чего-то вроде MongoDB, где каждая операция является атомарной и нет поддержки транзакций вне этого?
transaction_scope:
read message from servicebus - UpdateCustomerAddress
get customer aggregate from docdb, replay events where commited =1
call customer.updateAddress
validates
creates customer address updated event
apply event
event store as uncommitted events
do optimistic concurrency update against docdb pushing uncommitted events (single op to ensure consistency)
publish event to service bus
update docdb set events just published to commited = 1 (again one 1 op - at least in mongodb)
transaction_complete
NServiceBus или любой другой объект управляет областью внешних транзакций из инфраструктуры обработчика команд. Из того, что я вижу, мы должны иметь почти одинаковую семантику 2pc - но я чувствую, что что-то упускаю.