Choreography vs Orchestration
Choreography: services react to events; no central coordinator
InventoryService publishes "inventory-reserved" →
PaymentService listens, charges card, publishes "payment-charged" →
ShipmentService listens, creates shipment
Orchestration: a saga orchestrator explicitly calls each step
SagaOrchestrator:
1. Call InventoryService.reserve()
2. If ok: call PaymentService.charge()
3. If ok: call ShipmentService.create()
4. On any failure: call compensations in reverse
Orchestration is easier to reason about and debug; choreography is more decoupled.