Проверяет понимание границ агрегатов в DDD и способов обеспечения согласованности между ними без нарушения инвариантов.
В DDD агрегат — это граница согласованности: все инварианты внутри агрегата должны соблюдаться в рамках одной транзакции. Изменение нескольких агрегатов в одной ACID-транзакции нарушает это правило и приводит к блокировкам, конфликтам и плохой масштабируемости. Поэтому на практике применяют eventual consistency.
Unit of Work — это паттерн для отслеживания изменений внутри одной транзакции (обычно в рамках одного агрегата или одного bounded context). Он не предназначен для координации нескольких агрегатов в распределённой среде.
// Шаг 1: создать заказ
order = Order.create(items)
orderRepo.save(order)
eventBus.publish(OrderCreated(order.id))
// Шаг 2: зарезервировать товар
on OrderCreated:
try:
inventory.reserve(order.id, order.items)
eventBus.publish(StockReserved(order.id))
except OutOfStock:
eventBus.publish(StockRejected(order.id))
// Компенсация
on StockRejected:
order = orderRepo.find(order.id)
order.cancel()
orderRepo.save(order)Saga подходит, когда между агрегатами нужна согласованность в конечном счёте и допустима задержка. Unit of Work — только внутри одной транзакции и одного агрегата. Если бизнес требует строгой атомарности между несколькими агрегатами, стоит пересмотреть границы агрегатов.
Итог: для изменения нескольких агрегатов используйте Saga или доменные события, а Unit of Work оставьте для согласованности внутри одного агрегата.