Predict the output
Stock reservation fails. What does the saga log?
from collections.abc import Callable
Step = tuple[str, Callable[[], None], Callable[[], None]]
log: list[str] = []
def act(name: str, fail: bool = False) -> Callable[[], None]:
def run() -> None:
if fail:
raise RuntimeError(f"{name} failed")
log.append(name)
return run
def run_saga(steps: list[Step]) -> None:
done: list[Step] = []
for step in steps:
try:
step[1]()
done.append(step)
except RuntimeError as e:
log.append(str(e))
for _, _, compensate in reversed(done):
compensate()
return
run_saga([
("order", act("create order"), act("cancel order")),
("payment", act("charge card"), act("refund card")),
("stock", act("reserve stock", fail=True), act("release stock")),
("ship", act("book courier"), act("cancel courier")),
])
print(log)Hint 1 of 1
Which steps completed?
Choose an answer, then open Show answer below to check it.
Illustrative; not a load test
Text version
Orchestration:
- Orchestrator → Orders: create: ✓ done
- Orchestrator → Payment: charge: ✓ done
- Orchestrator → Stock: reserve: ✕ failed
- Courier is never asked: – skipped
- Orchestrator → Payment: refund: ↩ compensated
- Orchestrator → Orders: cancel: ↩ compensated
Choreography:
- Orders saves order, emits OrderCreated: ✓ done
- Payment svc ← OrderCreated: charges: ✓ done
- Stock svc ← PaymentTaken: out of stock: ✕ failed
- Courier svc never hears StockReserved: – skipped
- Payment svc ← StockFailed: refunds: ↩ compensated
- Orders ← PaymentRefunded: cancels: ↩ compensated
Show answer
Answer: A ['create order', 'charge card', 'reserve stock failed', 'refund card', 'cancel order']
Correct. Completed steps are compensated in reverse; the courier step never ran.
A saga undoes the steps that already succeeded, newest first. Payment is refunded before the order is cancelled, and the courier step never ran, so it has nothing to undo.
Why not the others?
- B
['create order', 'charge card', 'reserve stock failed']. The compensations also append to the log. - C
['create order', 'charge card', 'reserve stock failed', 'cancel order', 'refund card']. Compensation runs in reverse order: refund first. - D
['create order', 'charge card', 'reserve stock failed', 'refund card', 'cancel order', 'cancel courier']. The courier was never booked, so there's nothing to cancel.