/인프라/MSA Distributed Transactions: SAGA Pattern vs. Event Sourcing (ES) Selection Guide
InfrastructureMSA분산트랜잭션

MSA Distributed Transactions: SAGA Pattern vs. Event Sourcing (ES) Selection Guide

We examine why ACID transactions break in MSA environments and compare how the SAGA pattern and Event Sourcing (ES) actually work. We also contrast orchestration vs. choreography and give practical criteria for choosing the right architectu

MSA Distributed Transactions: SAGA Pattern vs. Event Sourcing (ES) Selection Guide

MSA Distributed Transactions: A Complete Comparison and Selection Guide for SAGA Pattern vs. Event Sourcing (ES)

The moment you adopt a microservices architecture (MSA), developers hit the most fundamental problem: transactions. In a traditional monolith you used the database’s ACID properties (Atomicity, Consistency, Isolation, Durability) to wrap multiple pieces of business logic into a single atomic unit. In MSA, each service owns its own database, so that single transaction boundary disappears and the ACID guarantees break.

Distributed-transaction complexity is one of the biggest technical hurdles of MSA. Two well-known patterns that emerged to address it are the SAGA pattern and Event Sourcing (ES). This article compares how both work in depth and gives a practical guide for choosing between them when you design a real system.

1. The Fundamental Reason ACID Transactions Break in MSA

MSA’s core philosophy is loose coupling and independent deployment. To get there, we extended service boundaries all the way to database boundaries.

The heart of the problem: Suppose the Order service must confirm a successful payment and the Inventory service must deduct stock. In the classic approach those two operations sit in one DB transaction, so if either fails, both roll back.

In MSA the Order service uses DB A and Inventory uses DB B. Even if A commits successfully, a network error or business-logic failure on B leaves A’s work already committed. You now have data inconsistency.

You therefore accept eventual consistency and must design recovery logic for failures. That is the background against which SAGA and Event Sourcing appeared.

2. The SAGA Pattern: Solving Distributed Transactions with Compensating Transactions

SAGA defines a distributed transaction as a sequence of local transactions. If any step fails, it runs compensating transactions that undo every previously successful step and return the system to a consistent state.

SAGA focuses on execution order and the rollback path on failure.

Implementing SAGA: Orchestration vs. Choreography

There are two main ways to implement SAGA.

  1. Orchestration: A central orchestrator service owns the overall flow and issues commands to each service in order.
    • Pros: Flow control is clear and easy to trace.
    • Cons: The orchestrator can become a single point of failure, and it tends to accumulate complex business logic.
  2. Choreography: There is no central controller. Each service finishes its local transaction and publishes the result as an event. Other services that subscribe to that event do the next work.
    • Pros: Coupling between services becomes extremely low; scalability is excellent.
    • Cons: The overall flow is hard to see (spaghetti flow), and in complex transactions it is very difficult to trace which service published which event.

💡 A practitioner’s take: On large, high-complexity systems I prefer a hybrid: start with orchestration so the flow stays clear, then gradually move toward choreography once the system is stable, in order to separate business logic.

3. Event Sourcing (ES): Managing Transactions via an Immutable Record of State Changes

Event Sourcing stores, instead of the current state, a time-ordered record of every state change that occurred in the system (the event stream) and treats that stream as the source of truth.

The core idea is that you trust the events themselves, not a stored “current state.”

How the Data Flow Changes: Command $\rightarrow$ Event $\rightarrow$ State

  1. Receive a command: An external “create order” request (Command) arrives.
  2. Execute business logic: Domain logic runs.
  3. Record the event: If the logic succeeds, an immutable event such as OrderCreated is written to the event store.
  4. Rehydrate state: When current state is needed, the system replays every recorded event in order from the beginning and reconstructs the object.

ES does not roll a failed transaction back. It publishes a new event that invalidates the previous incorrect state.

4. SAGA vs. Event Sourcing: Which Should You Choose? (Comparison and Decision Tree)

Both patterns solve distributed transactions, but their approach and focus are completely different.

📊 Core Comparison Table

CategorySAGA PatternEvent Sourcing (ES)
Core focusSequential execution of transactions and the rollback pathAn immutable record of every state change in the system
Data storageStore current state in the DB (run compensating logic when needed)Sequentially store every event in an event store
Consistency modelEventual consistencyEventual consistency
Transaction handlingCompensating transactionsEvent replay and publishing new events
ComplexityFlow-control (orchestration) complexity; difficulty of designing compensating logicEvent-store design; understanding the replay mechanism
Best suited whenControlling business-process flow across independent services matters mostAudit matters, or tracking state changes over time is essential

🔍 Scenario-Based Selection Guide

  1. "Order processing" scenario (sequential work A $\rightarrow$ B $\rightarrow$ C):

    • Recommendation: Use the SAGA pattern. (SAGA is the distributed-transaction concept implemented as an event-driven way to keep consistency across services.)
    • Why: Best fit when work is sequential and you need compensation—for example, the order (A) must succeed before inventory is deducted (B), and inventory deduction must succeed before payment (C) proceeds.
  2. "User account change history" scenario (recording every state change over time):

    • Recommendation: Use Event Sourcing.
    • Why: When the process itself—when the user changed what, and why—is the business value, recording every state change as an event is the most accurate and powerful approach.

Conclusion: A Complementary Relationship

In real large-scale systems the two ideas are often used together.

  • SAGA pattern: Focuses on flow control that maintains consistency across services.
  • Event Sourcing: Focuses on data modeling that most accurately preserves the history of state changes inside each service.

In a complex domain, managing inter-service flow with SAGA while securing data integrity inside each service with Event Sourcing is often the most robust architecture.

확인 정보
✦ ✦ ✦
편집 검토 · Editorial Review

Nodelog는 모든 콘텐츠의 내용과 출처를 공개 전에 검토합니다. 환경(OS·버전)에 따라 결과가 달라질 수 있는 기술 정보는 공식 문서와 함께 확인하며, 검토 기준과 정정 원칙은 편집 정책에서 안내합니다. 오류를 발견하시면 이메일로 제보해 주세요 — 확인 후 신속히 정정합니다.

편집 책임 · Nodelog 기술 편집팀·발행 · ·업데이트 ·

Comments

Be the first to comment.