Use choreography-based Sagas where each service reacts to domain events and emits compensating events on failure. Each service handles its own step and publishes the outcome. Compensating transactions undo completed steps when a later step fails. Track saga state in a database table for observability and debugging.
Choreography — each service publishes events and reacts to others; no central coordinator needed.
Orchestration — a central Saga orchestrator sends commands and waits for replies; easier to visualize but creates coupling.
Every step that can succeed must have a compensating transaction to undo it if a later step fails.
Compensating transactions must also be idempotent — they may be called multiple times on redelivery.
Store saga state in a database table for observability — distributed transaction failures are hard to debug without it.