Data Consistency Patterns

Data Consistency Patterns

Difficulty: ⭐⭐⭐⭐

Overview

Data consistency is one of the most challenging problems in distributed systems. This chapter covers the trade-offs between Strong Consistency and Eventual Consistency, read consistency patterns, limitations of distributed transactions, and the Saga pattern.


Table of Contents

  1. Consistency Models Overview
  2. Strong vs Eventual Consistency
  3. Read Consistency Patterns
  4. Distributed Transactions and 2PC
  5. Saga Pattern
  6. Practical Application Guide
  7. Practice Problems

1. Consistency Models Overview

CAP Theorem Review

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      CAP Theorem                            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                             β”‚
β”‚                    Consistency (C)                          β”‚
β”‚                         /\                                  β”‚
β”‚                        /  \                                 β”‚
β”‚                       /    \                                β”‚
β”‚                      / CP   \                               β”‚
β”‚                     /        \                              β”‚
β”‚                    /──────────\                             β”‚
β”‚      Availability (A)        Partition Tolerance (P)        β”‚
β”‚                    \    AP    /                             β”‚
β”‚                     \        /                              β”‚
β”‚                      \──────/                               β”‚
β”‚                                                             β”‚
β”‚   When Network Partition Occurs:                           β”‚
β”‚   - Choose CP: Maintain consistency, sacrifice availability β”‚
β”‚   - Choose AP: Maintain availability, sacrifice consistency β”‚
β”‚                (Eventual)                                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Consistency Spectrum

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        Consistency Spectrum                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Strong                                              Eventual           β”‚
β”‚  Consistency          ◄────────────────────────►    Consistency         β”‚
β”‚                                                                         β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€             β”‚
β”‚  β”‚          β”‚          β”‚          β”‚          β”‚          β”‚             β”‚
β”‚  Lineariz-  Sequential Causal    Monotonic   Eventual                  β”‚
β”‚  ability    Consistency          Reads       Consistency               β”‚
β”‚                                                                         β”‚
β”‚  ◄───────── Strong Consistency ──────►◄──── Weak Consistency ────►     β”‚
β”‚  ◄─────── Low Availability/Performance ──►◄── High Availability/Perf ──►│
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2. Strong vs Eventual Consistency

Strong Consistency

All reads return the result of the most recent write.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Strong Consistency                                  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Time ──────────────────────────────────────────────────────►           β”‚
β”‚                                                                         β”‚
β”‚  Client A:  ──── Write(X=5) ─────────────────────────────►              β”‚
β”‚                      β”‚                                                  β”‚
β”‚                      β–Ό                                                  β”‚
β”‚  Primary:   ════════[X=5]════════════════════════════════►              β”‚
β”‚                      β”‚                                                  β”‚
β”‚                      β”‚ Synchronous replication                          β”‚
β”‚                      β”‚ (replication completes before write completes)   β”‚
β”‚                      β–Ό                                                  β”‚
β”‚  Replica:   ════════[X=5]════════════════════════════════►              β”‚
β”‚                      β”‚                                                  β”‚
β”‚                      β–Ό                                                  β”‚
β”‚  Client B:  ──────── Read() ─────── returns X=5 ────────►               β”‚
β”‚                                                                         β”‚
β”‚  Characteristics:                                                       β”‚
β”‚  - All nodes see the same data                                          β”‚
β”‚  - Increased write latency                                              β”‚
β”‚  - Decreased availability (when replica fails)                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Eventual Consistency

Given sufficient time, all reads will return the same value.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Eventual Consistency                                β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Time ──────────────────────────────────────────────────────►           β”‚
β”‚                                                                         β”‚
β”‚  Client A:  ──── Write(X=5) ─────────────────────────────►              β”‚
β”‚                      β”‚                                                  β”‚
β”‚                      β–Ό                                                  β”‚
β”‚  Primary:   ════════[X=5]════════════════════════════════►              β”‚
β”‚                      β”‚                                                  β”‚
β”‚                      β”‚ Asynchronous replication                         β”‚
β”‚                      β”‚ (write completes immediately, replication later) β”‚
β”‚                      β–Ό                                                  β”‚
β”‚  Replica:   ═══[X=0]════════[X=5]════════════════════════►              β”‚
β”‚                 β”‚              β”‚                                        β”‚
β”‚                 β”‚   replication lag β”‚                                   β”‚
β”‚                 β–Ό              β–Ό                                        β”‚
β”‚  Client B:  ─── Read()=0 ──── Read()=5 ─────────────────►               β”‚
β”‚                 (stale)       (current)                                 β”‚
β”‚                                                                         β”‚
β”‚  Characteristics:                                                       β”‚
β”‚  - Temporary inconsistency allowed                                      β”‚
β”‚  - Reduced write latency                                                β”‚
β”‚  - High availability                                                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Trade-off Comparison

Characteristic Strong Consistency Eventual Consistency
Read consistency Always latest Temporary lag
Write latency High Low
Availability Low High
Implementation complexity High Low
Suitable use cases Finance, inventory SNS, like counts

Selection by Use Case

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Consistency Selection by Use Case                   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Strong Consistency Required  β”‚  Eventual Consistency Suitable          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  - Bank account balance       β”‚  - SNS timeline                         β”‚
β”‚  - Inventory quantity (preventβ”‚  - Like/follower counts                 β”‚
β”‚    overselling)               β”‚  - Search index                          β”‚
β”‚  - Reservation systems        β”‚  - Log collection                        β”‚
β”‚  - Payment processing         β”‚  - View counters                         β”‚
β”‚  - User authentication state  β”‚  - Recommendation systems                β”‚
β”‚  - Distributed locks          β”‚                                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3. Read Consistency Patterns

Read-Your-Writes

Guarantees that users can always read the data they wrote.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Read-Your-Writes                                    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Problem Scenario:                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚  β”‚  User A  β”‚         β”‚  Primary β”‚         β”‚ Replica  β”‚                β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜                β”‚
β”‚       β”‚                    β”‚                    β”‚                       β”‚
β”‚       │──Write(name=Bob)──►│                    β”‚                       β”‚
β”‚       │◄── Success ────────│                    β”‚                       β”‚
β”‚       β”‚                    │── async replicate─►│                       β”‚
β”‚       │──Read(name)────────────────────────────►│ (not replicated yet)  β”‚
β”‚       │◄─────────────────── name=Alice ─────────│                       β”‚
β”‚       β”‚                                         β”‚                       β”‚
β”‚  "I just changed it to Bob, why is it Alice?"                           β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Solution 1: Read from Primary                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                     β”‚
β”‚  β”‚  User A  β”‚         β”‚  Primary β”‚                                     β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜                                     β”‚
β”‚       β”‚                    β”‚                                            β”‚
β”‚       │──Write(name=Bob)──►│                                            β”‚
β”‚       │◄── Success ────────│                                            β”‚
β”‚       │──Read(name)───────►│ ← After own write, read from Primary      β”‚
β”‚       │◄─── name=Bob ──────│                                            β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Solution 2: Timestamp-based                                            β”‚
β”‚                                                                         β”‚
β”‚  - Record timestamp T on write                                          β”‚
β”‚  - On read, only read from replicas with data after T                   β”‚
β”‚  - Use only if replica's replication_timestamp >= T                     β”‚
β”‚                                                                         β”‚
β”‚  Write Response: { success: true, timestamp: T1 }                       β”‚
β”‚  Read Request:   { key: "name", min_timestamp: T1 }                     β”‚
β”‚  β†’ Read only from replicas updated after T1                             β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
# Read-Your-Writes implementation example
class ReadYourWritesClient:
    def __init__(self, primary, replicas):
        self.primary = primary
        self.replicas = replicas
        self.last_write_timestamp = {}  # key -> timestamp

    def write(self, key, value):
        timestamp = self.primary.write(key, value)
        self.last_write_timestamp[key] = timestamp
        return timestamp

    def read(self, key):
        if key in self.last_write_timestamp:
            # Read recently written keys from Primary
            return self.primary.read(key)
        else:
            # Read unwritten keys from Replica
            return self.select_replica().read(key)

Monotonic Reads

Guarantees that once a value is read, older values will not be read subsequently.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Monotonic Reads                                     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Problem Scenario (Monotonic Reads Violation):                         β”‚
β”‚                                                                         β”‚
β”‚  Time ──────────────────────────────────────────────────────►           β”‚
β”‚                                                                         β”‚
β”‚  Replica 1: [v1]───────[v2]───────[v3]────────────────────►             β”‚
β”‚  Replica 2: [v1]───────────────────────[v2]───────────────►             β”‚
β”‚                                                                         β”‚
β”‚  User:      Read@R1=v2  Read@R2=v1  Read@R1=v3                          β”‚
β”‚                    β”‚         β”‚                                          β”‚
β”‚                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                          β”‚
β”‚                    "Feels like time went backwards"                     β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Solution: Sticky Session                                               β”‚
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                     β”‚
β”‚  β”‚  User A  │─────────│ Replica 1β”‚                                     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  fixed  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                     β”‚
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                     β”‚
β”‚  β”‚  User B  │─────────│ Replica 2β”‚                                     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  fixed  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                     β”‚
β”‚                                                                         β”‚
β”‚  - Same user always reads from same replica                             β”‚
β”‚  - Switch to different replica if current one goes down                 β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Solution: Version-based                                                β”‚
β”‚                                                                         β”‚
β”‚  Read Response: { value: "v2", version: 42 }                            β”‚
β”‚  Next Read Request: { key: "data", min_version: 42 }                    β”‚
β”‚  β†’ Read only from replicas with version >= 42                           β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Monotonic Writes

Guarantees that writes from the same session are applied in order.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Monotonic Writes                                    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Problem Scenario:                                                      β”‚
β”‚                                                                         β”‚
β”‚  User: Write(X=1) β†’ Write(X=2) β†’ Write(X=3)                            β”‚
β”‚                                                                         β”‚
β”‚  Due to network latency:                                                β”‚
β”‚  Replica receive order: X=2 β†’ X=3 β†’ X=1                                β”‚
β”‚  Final result: X=1 (not as intended!)                                   β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Solution: Version/Timestamp-based                                      β”‚
β”‚                                                                         β”‚
β”‚  Write(X=1, ts=100) β†’ Write(X=2, ts=101) β†’ Write(X=3, ts=102)          β”‚
β”‚                                                                         β”‚
β”‚  Receive order: ts=101 β†’ ts=102 β†’ ts=100                               β”‚
β”‚  Apply: X=2 applied β†’ X=3 applied β†’ X=1 ignored (ts=100 < current=102) β”‚
β”‚  Final result: X=3 (correct!)                                           β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

4. Distributed Transactions and 2PC

Two-Phase Commit (2PC)

A protocol that guarantees atomicity of distributed transactions.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Two-Phase Commit (2PC)                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Phase 1: Prepare (Voting phase)                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                       β”‚
β”‚  β”‚ Coordinator β”‚                                                       β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜                                                       β”‚
β”‚         β”‚                                                               β”‚
β”‚         │─── PREPARE β”€β”€β”€β–Ίβ”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                β”‚
β”‚         β”‚                β”‚Participant1│───► Prepare transaction         β”‚
β”‚         │◄── VOTE YES β”€β”€β”€β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     (acquire lock, write log)  β”‚
β”‚         β”‚                                                               β”‚
β”‚         │─── PREPARE β”€β”€β”€β–Ίβ”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                β”‚
β”‚         β”‚                β”‚Participant2│───► Prepare transaction         β”‚
β”‚         │◄── VOTE YES β”€β”€β”€β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                β”‚
β”‚         β”‚                                                               β”‚
β”‚  Phase 2: Commit (Decision phase)                                       β”‚
β”‚         β”‚                                                               β”‚
β”‚         │─── COMMIT β”€β”€β”€β”€β–Ίβ”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                β”‚
β”‚         β”‚                β”‚Participant1│───► Execute commit              β”‚
β”‚         │◄─── ACK β”€β”€β”€β”€β”€β”€β”€β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                β”‚
β”‚         β”‚                                                               β”‚
β”‚         │─── COMMIT β”€β”€β”€β”€β–Ίβ”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                β”‚
β”‚         β”‚                β”‚Participant2│───► Execute commit              β”‚
β”‚         │◄─── ACK β”€β”€β”€β”€β”€β”€β”€β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                β”‚
β”‚         β”‚                                                               β”‚
β”‚         β–Ό                                                               β”‚
β”‚  Transaction Complete                                                   β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2PC Failure Scenarios

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     2PC Failure Scenarios                               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Scenario 1: Participant votes NO                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                       β”‚
β”‚  β”‚ Coordinator β”‚                                                       β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜                                                       β”‚
β”‚         │─── PREPARE ───►│Participant1│◄── VOTE YES                    β”‚
β”‚         │─── PREPARE ───►│Participant2│◄── VOTE NO (failed)            β”‚
β”‚         β”‚                                                               β”‚
β”‚         │─── ROLLBACK ──►│Participant1β”‚                                β”‚
β”‚         │─── ROLLBACK ──►│Participant2β”‚                                β”‚
β”‚         β–Ό                                                               β”‚
β”‚  Transaction Aborted                                                    β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Scenario 2: Coordinator Failure (Blocking problem)                     β”‚
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                       β”‚
β”‚  β”‚ Coordinator │──X (failure)                                          β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜                                                       β”‚
β”‚         │─── PREPARE ───►│Participant1│◄── VOTE YES (waiting...)       β”‚
β”‚         │─── PREPARE ───►│Participant2│◄── VOTE YES (waiting...)       β”‚
β”‚         β”‚                                                               β”‚
β”‚         X  Coordinator down!                                            β”‚
β”‚                                                                         β”‚
β”‚         β”‚Participant1β”‚: "Commit? Rollback? Cannot decide..."           β”‚
β”‚         β”‚Participant2β”‚: "Resources remain locked..."                   β”‚
β”‚                                                                         β”‚
β”‚  ───────────────────────────────────────────────────────────────────    β”‚
β”‚  This is the biggest problem with 2PC: BLOCKING                         β”‚
β”‚  Participants wait indefinitely until Coordinator recovers              β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Limitations of 2PC

Limitation Description
Blocking Entire system blocks when Coordinator fails
Performance 2 network round trips, all participants wait
Availability Entire transaction rolls back if one participant fails
Scalability Performance degrades rapidly as participants increase

3PC (Three-Phase Commit)

An attempt to mitigate the blocking problem of 2PC:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     3PC vs 2PC                                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  2PC:                          3PC:                                     β”‚
β”‚  1. Prepare                    1. CanCommit (voting)                    β”‚
β”‚  2. Commit/Rollback            2. PreCommit (prepare confirmation)      β”‚
β”‚                                3. DoCommit (actual commit)               β”‚
β”‚                                                                         β”‚
β”‚  3PC Advantages:                                                        β”‚
β”‚  - Participants share state in PreCommit phase                          β”‚
β”‚  - Consensus among participants possible even when Coordinator fails    β”‚
β”‚                                                                         β”‚
β”‚  3PC Limitations:                                                       β”‚
β”‚  - Still possible inconsistency during network partition                β”‚
β”‚  - Increased complexity, rarely used in practice                        β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

5. Saga Pattern

A distributed transaction pattern to overcome the limitations of 2PC.

Saga Basic Concept

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Saga Pattern Overview                               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  2PC:  One large atomic transaction                                     β”‚
β”‚        [─────────── Entire Transaction ───────────]                     β”‚
β”‚        Rollback entire transaction on failure (locks held)              β”‚
β”‚                                                                         β”‚
β”‚  Saga: Sequence of local transactions                                   β”‚
β”‚        [T1] β†’ [T2] β†’ [T3] β†’ [T4]                                       β”‚
β”‚        Execute compensating transactions on failure                     β”‚
β”‚        [T1] β†’ [T2] β†’ [T3-fail] β†’ [C2] β†’ [C1]                           β”‚
β”‚                                     Compensating transactions           β”‚
β”‚                                                                         β”‚
β”‚  ─────────────────────────────────────────────────────────────────      β”‚
β”‚                                                                         β”‚
β”‚  Example: Travel Booking Saga                                           β”‚
β”‚                                                                         β”‚
β”‚  Normal flow:                                                           β”‚
β”‚  [Book Flight] β†’ [Book Hotel] β†’ [Book Car] β†’ [Payment]                 β”‚
β”‚       T1             T2            T3          T4                       β”‚
β”‚                                                                         β”‚
β”‚  T3 fails:                                                              β”‚
β”‚  [Book Flight] β†’ [Book Hotel] β†’ [Car-fail] β†’ [Cancel Hotel] β†’ [Cancel Flight]β”‚
β”‚       T1             T2            T3            C2             C1      β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Choreography

Each service autonomously operates by publishing and subscribing to events.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Choreography Saga                                   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”             β”‚
β”‚  β”‚  Order  β”‚    β”‚ Payment β”‚    β”‚  Stock  β”‚    β”‚Shipping β”‚             β”‚
β”‚  β”‚ Service β”‚    β”‚ Service β”‚    β”‚ Service β”‚    β”‚ Service β”‚             β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜             β”‚
β”‚       β”‚              β”‚              β”‚              β”‚                    β”‚
β”‚  ═════β•ͺ══════════════β•ͺ══════════════β•ͺ══════════════β•ͺ═══  Event Bus     β”‚
β”‚       β”‚              β”‚              β”‚              β”‚                    β”‚
β”‚  1.OrderCreated      β”‚              β”‚              β”‚                    β”‚
β”‚  ─────┼─────────────►│              β”‚              β”‚                    β”‚
β”‚       β”‚         2.PaymentCompleted  β”‚              β”‚                    β”‚
β”‚       β”‚         ─────┼─────────────►│              β”‚                    β”‚
β”‚       β”‚              β”‚       3.StockReserved       β”‚                    β”‚
β”‚       β”‚              β”‚       ───────┼─────────────►│                    β”‚
β”‚       β”‚              β”‚              β”‚    4.ShippingScheduled            β”‚
β”‚       β”‚              β”‚              β”‚    ──────────┼────►               β”‚
β”‚       │◄─────────────┼──────────────┼──────────────┼──── 5.OrderCompleteβ”‚
β”‚       β”‚              β”‚              β”‚              β”‚                    β”‚
β”‚  ─────────────────────────────────────────────────────────────────────  β”‚
β”‚  Compensating events on failure:                                        β”‚
β”‚                                                                         β”‚
β”‚  1.OrderCreated ──► 2.PaymentCompleted ──► 3.StockFailed!              β”‚
β”‚                                                 β”‚                       β”‚
β”‚                     PaymentRefunded β—„β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                       β”‚
β”‚                          β”‚                                              β”‚
β”‚       OrderCancelled β—„β”€β”€β”€β”˜                                              β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Choreography Pros and Cons

Pros Cons
Loose coupling Difficult to understand overall flow
No single point of failure Risk of circular dependencies
Services scale independently Complex debugging
Simple implementation Difficult testing

Orchestration

A central Orchestrator controls the entire flow.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Orchestration Saga                                  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                               β”‚
β”‚                      β”‚   Orchestrator  β”‚                               β”‚
β”‚                      β”‚ (Saga Manager)  β”‚                               β”‚
β”‚                      β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜                               β”‚
β”‚                               β”‚                                         β”‚
β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  β”‚
β”‚         β”‚                     β”‚                     β”‚                  β”‚
β”‚         β–Ό                     β–Ό                     β–Ό                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”             β”‚
β”‚  β”‚   Order    β”‚       β”‚  Payment   β”‚       β”‚   Stock    β”‚             β”‚
β”‚  β”‚  Service   β”‚       β”‚  Service   β”‚       β”‚  Service   β”‚             β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Normal flow:                                                           β”‚
β”‚                                                                         β”‚
β”‚  Orchestrator                                                          β”‚
β”‚       β”‚                                                                 β”‚
β”‚       │──── 1. CreateOrder ────►│Orderβ”‚                                β”‚
β”‚       │◄─── OrderCreated ───────│     β”‚                                β”‚
β”‚       β”‚                                                                 β”‚
β”‚       │──── 2. ProcessPayment ─►│Paymentβ”‚                              β”‚
β”‚       │◄─── PaymentDone ────────│      β”‚                               β”‚
β”‚       β”‚                                                                 β”‚
β”‚       │──── 3. ReserveStock ───►│Stockβ”‚                                β”‚
β”‚       │◄─── StockReserved ──────│     β”‚                                β”‚
β”‚       β”‚                                                                 β”‚
β”‚       │──── 4. CompleteOrder ──►│Orderβ”‚                                β”‚
β”‚       β–Ό                                                                 β”‚
β”‚  Saga Complete                                                         β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Compensation on failure:                                               β”‚
β”‚                                                                         β”‚
β”‚  Orchestrator                                                          β”‚
β”‚       β”‚                                                                 β”‚
β”‚       │──── 1. CreateOrder ────►│Orderβ”‚ βœ“                              β”‚
β”‚       │──── 2. ProcessPayment ─►│Paymentβ”‚ βœ“                            β”‚
β”‚       │──── 3. ReserveStock ───►│Stockβ”‚ βœ— (failed!)                    β”‚
β”‚       β”‚                                                                 β”‚
β”‚       │──── 4. RefundPayment ──►│Paymentβ”‚ (compensation)               β”‚
β”‚       │──── 5. CancelOrder ────►│Orderβ”‚ (compensation)                 β”‚
β”‚       β–Ό                                                                 β”‚
β”‚  Saga Rolled Back                                                      β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Orchestration Pros and Cons

Pros Cons
Centralized flow management Single point of failure
Clear workflow Increased orchestrator complexity
Easy debugging/monitoring Increased coupling
Easy testing Orchestrator scalability

Saga Pattern Comparison

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Choreography vs Orchestration Selection Criteria           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Choose Choreography:                                                   β”‚
β”‚  - When few services (2-4)                                              β”‚
β”‚  - Simple workflows                                                     β”‚
β”‚  - When service independence is important                               β”‚
β”‚  - Want to avoid strong coupling between teams                          β”‚
β”‚                                                                         β”‚
β”‚  Choose Orchestration:                                                  β”‚
β”‚  - Complex business logic                                               β”‚
β”‚  - When many services (5+)                                              β”‚
β”‚  - When clear error handling is needed                                  β”‚
β”‚  - When workflow visibility is important                                β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Saga Implementation Example (Orchestration)

class OrderSaga:
    """Order Saga Orchestrator"""

    def __init__(self, order_id):
        self.order_id = order_id
        self.state = "STARTED"
        self.compensations = []  # Compensation transaction stack

    def execute(self):
        try:
            # Step 1: Create order
            self.create_order()
            self.compensations.append(self.cancel_order)

            # Step 2: Process payment
            self.process_payment()
            self.compensations.append(self.refund_payment)

            # Step 3: Reserve stock
            self.reserve_stock()
            self.compensations.append(self.release_stock)

            # Step 4: Schedule shipping
            self.schedule_shipping()

            self.state = "COMPLETED"

        except SagaException as e:
            self.compensate()
            self.state = "COMPENSATED"
            raise

    def compensate(self):
        """Execute compensating transactions in reverse order"""
        while self.compensations:
            compensation = self.compensations.pop()
            try:
                compensation()
            except Exception as e:
                # Log compensation failure, add to retry queue
                log_compensation_failure(self.order_id, compensation, e)

    def create_order(self):
        # Call Order Service
        pass

    def cancel_order(self):
        # Order Service - cancel order
        pass

    # ... other methods

6. Practical Application Guide

Consistency Pattern Selection Checklist

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Consistency Pattern Selection Guide                 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Question 1: What is the impact of data inconsistency on business?      β”‚
β”‚  β”œβ”€β”€ Critical (financial loss, legal issues) ──► Strong Consistency    β”‚
β”‚  └── Acceptable (temporarily stale info) ──► Eventual Consistency      β”‚
β”‚                                                                         β”‚
β”‚  Question 2: What are the main system requirements?                     β”‚
β”‚  β”œβ”€β”€ Low latency ──► Eventual Consistency                              β”‚
β”‚  └── Data accuracy ──► Strong Consistency                              β”‚
β”‚                                                                         β”‚
β”‚  Question 3: What should system do on failure?                          β”‚
β”‚  β”œβ”€β”€ Allow partial functionality outage ──► Strong Consistency (CP)    β”‚
β”‚  └── Always need to respond ──► Eventual Consistency (AP)              β”‚
β”‚                                                                         β”‚
β”‚  Question 4: What is the read/write ratio?                              β”‚
β”‚  β”œβ”€β”€ Read-heavy (90%+) ──► Eventual + Read Replica                     β”‚
β”‚  └── Write-heavy ──► Careful! Consider replication lag                 β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Hybrid Approach

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Hybrid Consistency Strategy                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Apply different consistency levels per data type within same system    β”‚
β”‚                                                                         β”‚
β”‚  Example: E-commerce system                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚  β”‚  Data Type           β”‚  Consistency Level β”‚  Reason           β”‚     β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€     β”‚
β”‚  β”‚  Inventory quantity  β”‚  Strong            β”‚  Prevent oversell β”‚     β”‚
β”‚  β”‚  Payment status      β”‚  Strong            β”‚  Money accuracy   β”‚     β”‚
β”‚  β”‚  Product reviews     β”‚  Eventual          β”‚  No immediate needβ”‚     β”‚
β”‚  β”‚  View counts         β”‚  Eventual          β”‚  Less important   β”‚     β”‚
β”‚  β”‚  Shopping cart       β”‚  Session           β”‚  Per-user consist β”‚     β”‚
β”‚  β”‚  Recommended productsβ”‚  Eventual          β”‚  Not real-time    β”‚     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

7. Practice Problems

Exercise 1: Analyze Consistency Requirements

Choose an appropriate consistency model for the following scenarios and explain why:

  1. Bank account balance
  2. Twitter follower count
  3. Online game ranking
  4. Airline seat reservation
  5. News article view count

Exercise 2: Saga Design

Design an order process for an online shopping mall using the Saga pattern: - Include steps: order creation, inventory check, payment, shipping reservation - Define compensating transactions for each step - Design both Choreography and Orchestration versions

Exercise 3: Read Consistency Implementation

Design a client library that guarantees Read-Your-Writes: - Guarantee latest data on read after write - Use timestamp-based approach - Include caching strategy


Next Steps

In 11_Message_Queue_Basics.md, let's learn about message queues, the foundation of asynchronous communication!


References

  • "Designing Data-Intensive Applications" - Martin Kleppmann
  • "Microservices Patterns" - Chris Richardson
  • Google Cloud Spanner: TrueTime and External Consistency
  • AWS: Building Distributed Locks with DynamoDB
  • "Sagas" - Hector Garcia-Molina, Kenneth Salem (1987)
to navigate between lessons