이코에코(Eco²) Knowledge Base/Foundations

FLP Impossibility: 분산 합의의 불가능성

mango_fr 2025. 12. 28. 13:09

 

 

비동기 분산 시스템에서 단 하나의 노드 장애만 허용해도 합의를 보장하는 결정론적 알고리즘은 존재하지 않는다.


1차 지식생산자

원본 논문

논문저자발표핵심 내용

Impossibility of Distributed Consensus with One Faulty Process Michael J. Fischer (Yale), Nancy A. Lynch (MIT), Michael S. Paterson (Warwick) JACM 1985 FLP Impossibility 원본 논문

저자 소개

┌─────────────────────────────────────────────────────────────────┐
│                    FLP 논문 저자                                  │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  Michael J. Fischer (Yale University)                           │
│  ─────────────────────────────────                              │
│  • 계산 복잡도 이론, 분산 컴퓨팅                                        │
│  • Turing Award 후보                                            │
│                                                                  │
│  Nancy A. Lynch (MIT)                                           │
│  ────────────────────                                           │
│  • 분산 알고리즘                                                   │
│  • "Distributed Algorithms" 교과서 저자                         │
│  • Dijkstra Prize (2007), Knuth Prize (2012)                   │
│                                                                  │
│  Michael S. Paterson (University of Warwick)                    │
│  ────────────────────────────────────────                       │
│  • 알고리즘 이론, 계산 복잡도                                         │
│  • ACM Fellow                                                   │
│                                                                  │
│  논문 별칭: "FLP" (세 저자의 이니셜)                            │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

1. 배경: 분산 합의 문제 (Consensus Problem)

1.1 문제 정의

┌─────────────────────────────────────────────────────────────────┐
│                    Consensus Problem                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  설정:                                                          │
│  ─────                                                          │
│  • N개의 프로세스                                               │
│  • 각 프로세스는 초기값 ∈ {0, 1}을 가짐                         │
│  • 일부 프로세스는 장애가 발생할 수 있음 (crash)                │
│                                                                  │
│  목표: 모든 정상 프로세스가 하나의 값에 동의                    │
│                                                                  │
│  요구사항:                                                      │
│  ──────────                                                      │
│  1. Agreement (동의):                                           │
│     모든 정상 프로세스는 동일한 값을 결정                       │
│                                                                  │
│  2. Validity (유효성):                                          │
│     결정된 값은 어떤 프로세스가 제안한 초기값                   │
│     (모두 0이면 0, 모두 1이면 1 결정)                          │
│                                                                  │
│  3. Termination (종료):                                         │
│     모든 정상 프로세스는 언젠가 결정에 도달                     │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

1.2 실제 응용: Transaction Commit

┌─────────────────────────────────────────────────────────────────┐
│                    Distributed Transaction Commit                │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  시나리오: 분산 데이터베이스에서 트랜잭션 커밋                   │
│                                                                  │
│  ┌──────────┐     ┌──────────┐     ┌──────────┐                │
│  │  Node A  │     │  Node B  │     │  Node C  │                │
│  │ (DB 샤드)│     │ (DB 샤드)│     │ (DB 샤드)│                │
│  └────┬─────┘     └────┬─────┘     └────┬─────┘                │
│       │                │                │                       │
│       └────────────────┼────────────────┘                       │
│                        ▼                                         │
│                   ┌─────────┐                                   │
│                   │ Commit? │                                   │
│                   │ Abort?  │                                   │
│                   └─────────┘                                   │
│                                                                  │
│  문제:                                                          │
│  • 모든 노드가 Commit에 동의해야 데이터 일관성 유지             │
│  • 하나라도 Abort하면 전체 Abort                                │
│  • 노드가 장애나면? → 합의 불가능!                              │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

2. 시스템 모델

2.1 비동기 시스템 (Asynchronous System)

┌─────────────────────────────────────────────────────────────────┐
│                    비동기 시스템의 특징                          │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  FLP가 가정하는 시스템:                                         │
│  ─────────────────────                                          │
│                                                                  │
│  1. 프로세스 속도에 대한 가정 없음                              │
│     • 상대적 속도 알 수 없음                                    │
│     • 한 프로세스가 다른 것보다 얼마나 빠른지 모름              │
│                                                                  │
│  2. 메시지 지연에 대한 상한 없음                                │
│     • 메시지가 언제 도착할지 알 수 없음                         │
│     • 임의로 오래 지연될 수 있음                                │
│     • 단, 결국에는 도착함 (eventually delivered)                │
│                                                                  │
│  3. 동기화된 시계 없음                                          │
│     • 글로벌 시간 개념 없음                                     │
│     • 타임아웃 기반 알고리즘 불가                               │
│                                                                  │
│  4. 장애 감지 불가능                                            │
│     • 프로세스가 죽었는지, 느린 건지 구분 불가                  │
│     • "Is it dead or just slow?"                                │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

2.2 장애 모델 (Failure Model)

┌─────────────────────────────────────────────────────────────────┐
│                    장애 모델                                     │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  FLP가 가정하는 장애:                                           │
│  ───────────────────                                            │
│                                                                  │
│  1. Crash Failure (충돌 장애)                                   │
│     • 프로세스가 갑자기 멈춤                                    │
│     • 경고 없이 발생                                            │
│     • 복구 없음 (fail-stop)                                     │
│                                                                  │
│  2. 최대 1개 프로세스 장애                                      │
│     • f = 1 (단 하나의 장애만 가정)                            │
│     • 이것조차도 합의를 불가능하게 함!                          │
│                                                                  │
│  가정하지 않는 것:                                              │
│  ─────────────────                                              │
│  • Byzantine Failure (악의적 행동) - 더 어려운 문제            │
│  • 메시지 손실 - 모든 메시지는 결국 도착                        │
│  • 메시지 변조 - 메시지 내용은 정확                             │
│                                                                  │
│  핵심:                                                          │
│  ─────                                                          │
│  "가장 약한 장애 모델에서도 합의 불가능"                        │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

3. FLP 정리 (FLP Theorem)

3.1 정리 진술

Theorem (FLP, 1985):

완전히 비동기적인 분산 시스템에서, 단 하나의 프로세스 장애도 허용하면서
합의(Consensus)를 보장하는 결정론적 알고리즘은 존재하지 않는다.

 

3.2 직관적 이해

┌─────────────────────────────────────────────────────────────────┐
│                    왜 불가능한가?                                │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  핵심 딜레마: "죽었는가? 느린 것인가?"                          │
│  ───────────────────────────────────                            │
│                                                                  │
│  시나리오: P1, P2가 있고, P2로부터 응답을 기다림                 │
│                                                                  │
│  ┌────────────────────────────────────────────────────────────┐│
│  │                                                             ││
│  │   P1: "P2로부터 응답이 없다..."                             ││
│  │                                                             ││
│  │   선택지 1: P2가 죽었다고 가정하고 혼자 결정                ││
│  │   → P2가 실제로 살아있으면? 다른 값을 결정할 수 있음!       ││
│  │   → Agreement 위반                                          ││
│  │                                                             ││
│  │   선택지 2: P2를 계속 기다림                                ││
│  │   → P2가 실제로 죽었으면? 영원히 기다림                     ││
│  │   → Termination 위반                                        ││
│  │                                                             ││
│  └────────────────────────────────────────────────────────────┘│
│                                                                  │
│  어떤 선택을 해도 합의 요구사항 중 하나를 위반!                 │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

3.3 증명 핵심 아이디어

┌─────────────────────────────────────────────────────────────────┐
│                    증명 전략 (Bivalence Argument)                │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  정의:                                                          │
│  ─────                                                          │
│  • Univalent Configuration: 결과가 확정된 상태                  │
│    - 0-valent: 0으로 결정될 것이 확정                          │
│    - 1-valent: 1로 결정될 것이 확정                            │
│  • Bivalent Configuration: 아직 0 또는 1 모두 가능             │
│                                                                  │
│  증명 단계:                                                     │
│  ──────────                                                     │
│                                                                  │
│  1단계: Bivalent 초기 설정 존재 증명                           │
│  ──────────────────────────────────                             │
│  • 모든 초기값이 0 → 결과 0 (validity)                         │
│  • 모든 초기값이 1 → 결과 1 (validity)                         │
│  • 사이 어딘가에 bivalent 설정이 있어야 함                     │
│                                                                  │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  [0,0,0] → 0-valent                                      │   │
│  │  [0,0,1] → ?                                             │   │
│  │  [0,1,1] → bivalent (0 또는 1 가능)                     │   │
│  │  [1,1,1] → 1-valent                                      │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                  │
│  2단계: Bivalent에서 탈출 불가능 증명                          │
│  ──────────────────────────────────                             │
│  • 어떤 이벤트를 적용해도 bivalent 상태를 유지할 수 있음       │
│  • 장애 프로세스의 메시지를 무한히 지연시킴                     │
│  • 결정을 영원히 미룰 수 있음 → Termination 위반               │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

3.4 핵심 보조정리 (Key Lemma)

┌─────────────────────────────────────────────────────────────────┐
│                    Lemma 3 (핵심)                                │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  Lemma:                                                         │
│  어떤 bivalent configuration C에서,                             │
│  어떤 프로세스 p에게 전달 가능한 메시지 m이 있을 때,            │
│  m을 받은 후에도 bivalent한 configuration이 도달 가능하다.      │
│                                                                  │
│  의미:                                                          │
│  ─────                                                          │
│  • 어떤 메시지를 처리해도 "아직 결정 안 됨" 상태 유지 가능     │
│  • 적대자(adversary)가 메시지 순서를 조작하면                   │
│  • 영원히 bivalent 상태를 유지할 수 있음                        │
│                                                                  │
│  증명 아이디어:                                                 │
│  ──────────────                                                 │
│  • 귀류법: m 처리 후 항상 univalent라고 가정                   │
│  • e(C) = 0-valent, e'(C) = 1-valent인 경우 분석               │
│  • 메시지 순서에 따라 모순 도출                                 │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

4. 함의와 해결책

4.1 FLP의 함의

┌─────────────────────────────────────────────────────────────────┐
│                    FLP가 의미하는 것                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  의미하는 것:                                                   │
│  ─────────────                                                  │
│  • 완벽한 분산 합의는 이론적으로 불가능                         │
│  • 가장 약한 장애 모델에서도 마찬가지                           │
│  • 안전성(Safety)과 종료성(Liveness)을 동시에 보장 불가        │
│                                                                  │
│  의미하지 않는 것:                                              │
│  ─────────────────                                              │
│  • 실용적인 합의 시스템을 만들 수 없다? ✗                      │
│  • 분산 시스템은 무용하다? ✗                                   │
│  • Paxos, Raft가 틀렸다? ✗                                     │
│                                                                  │
│  핵심:                                                          │
│  ─────                                                          │
│  "모든 가능한 실행에서 합의를 보장할 수 없다"                   │
│  "대부분의 실행에서 합의를 달성하는 것은 가능"                  │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

4.2 FLP 우회 전략

┌─────────────────────────────────────────────────────────────────┐
│                    FLP 우회 전략                                 │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  1. 동기성 가정 추가 (Partial Synchrony)                        │
│  ──────────────────────────────────────                         │
│  • 메시지 지연에 상한이 있다고 가정                             │
│  • 타임아웃 사용 가능                                           │
│  • 예: Paxos, Raft (타임아웃 기반 리더 선출)                   │
│                                                                  │
│  2. 랜덤화 (Randomization)                                      │
│  ────────────────────────                                       │
│  • 확률적 종료 보장 (with probability 1)                       │
│  • 적대자가 예측 불가능한 행동                                  │
│  • 예: Ben-Or's Protocol (1983)                                │
│                                                                  │
│  3. 장애 감지기 (Failure Detectors)                             │
│  ────────────────────────────────                               │
│  • 불완전하지만 유용한 장애 감지                                │
│  • Eventually Perfect Failure Detector (◇P)                    │
│  • 예: Chandra-Toueg (1996)                                    │
│                                                                  │
│  4. 종료 보장 완화                                              │
│  ──────────────────                                             │
│  • "결국 종료" 대신 "높은 확률로 종료"                         │
│  • 실제로는 충분히 실용적                                       │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

4.3 실제 시스템에서의 적용

┌─────────────────────────────────────────────────────────────────┐
│                    실제 시스템의 FLP 우회                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  Paxos / Raft:                                                  │
│  ─────────────                                                  │
│  • 타임아웃 기반 리더 선출                                      │
│  • 동기적 구간에서만 진행 보장                                  │
│  • 비동기 구간: 안전성 유지, 진행 중단                         │
│                                                                  │
│  Redis Sentinel:                                                │
│  ───────────────                                                │
│  • down-after-milliseconds (타임아웃)                          │
│  • 장애 감지 후 Quorum 투표                                    │
│  • 부분 동기 가정                                               │
│                                                                  │
│  Kubernetes (etcd):                                             │
│  ──────────────────                                             │
│  • Raft 기반 etcd                                              │
│  • election-timeout, heartbeat-interval                        │
│  • 네트워크 분할 시 일부 노드 읽기 전용                        │
│                                                                  │
│  공통점: 안전성(Safety)은 항상 보장                             │
│         종료성(Liveness)은 부분적으로만 보장                    │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

5. 관련 결과

5.1 동기 시스템에서의 합의

┌─────────────────────────────────────────────────────────────────┐
│                    동기 시스템에서는 가능                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  동기 시스템 가정:                                              │
│  ─────────────────                                              │
│  • 메시지 지연에 알려진 상한 Δ 존재                             │
│  • 프로세스 속도에 알려진 상한 존재                             │
│  • 글로벌 시간 개념 존재                                        │
│                                                                  │
│  결과:                                                          │
│  ─────                                                          │
│  • f+1 라운드에서 합의 가능 (f = 장애 수)                      │
│  • 타임아웃으로 장애 감지 가능                                  │
│  • Byzantine Generals도 해결 가능 (n > 3f)                     │
│                                                                  │
│  FLP와의 차이:                                                  │
│  ──────────────                                                 │
│  • 동기: Agreement + Validity + Termination 모두 보장          │
│  • 비동기: Termination 보장 불가                                │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

5.2 CAP 정리와의 관계

┌─────────────────────────────────────────────────────────────────┐
│                    FLP vs CAP                                    │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  FLP (1985):                                                    │
│  ───────────                                                    │
│  • 비동기 + 1개 장애 → 합의 불가능                             │
│  • Safety vs Liveness 트레이드오프                             │
│                                                                  │
│  CAP (2000, Brewer):                                            │
│  ──────────────────                                             │
│  • 네트워크 분할 시 Consistency vs Availability 선택           │
│  • C + A + P 모두 동시에 불가능                                │
│                                                                  │
│  관계:                                                          │
│  ─────                                                          │
│  • 둘 다 분산 시스템의 근본적 한계를 설명                       │
│  • FLP: 장애 상황에서 합의의 한계                               │
│  • CAP: 네트워크 분할에서 일관성/가용성 트레이드오프           │
│                                                                  │
│  실제 선택:                                                     │
│  ──────────                                                     │
│  • CP 시스템: 일관성 우선 (etcd, ZooKeeper)                    │
│  • AP 시스템: 가용성 우선 (Cassandra, DynamoDB)                │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

6. Eco² 적용

6.1 Redis Sentinel의 FLP 우회

# Redis Sentinel 설정
sentinel:
  customConfig:
  - down-after-milliseconds 5000   # 타임아웃 (부분 동기 가정)
  - failover-timeout 10000         # Failover 제한 시간

# FLP 우회 전략:
# 1. 타임아웃으로 장애 감지 (완벽하지 않지만 실용적)
# 2. Quorum 투표로 합의 (과반수 동의)
# 3. 네트워크 분할 시: 소수 파티션 읽기 전용 (Safety 우선)

6.2 RabbitMQ의 FLP 우회

rabbitmq:
  additionalConfig: |
    # 네트워크 분할 처리 전략
    cluster_partition_handling = pause_minority

    # FLP 우회:
    # 1. Raft (타임아웃 기반 리더 선출)
    # 2. pause_minority: 소수 파티션 일시정지 (Safety 우선)
    # 3. 동기적 구간에서만 진행 보장

7. "비동기 분산 시스템 = FLP"인가?

"비동기 + 분산"이라고 자동으로 FLP 모델에 해당하지 않는다.
FLP는 '합의(consensus)' 문제를 다루는 것이므로, 시스템이 합의를 풀고 있는지가 핵심.

7.1 FLP가 직접 겨냥하는 문제

┌─────────────────────────────────────────────────────────────────┐
│                    FLP가 다루는 문제                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  FLP가 "불가능"이라고 말하는 것:                                │
│  ───────────────────────────────                                │
│  • 여러 노드가                                                  │
│  • 같은 값에 대해 완전히 동일한 결정을                          │
│  • 네트워크 지연이 무한할 수 있는 상황에서                      │
│  • 항상 진행(liveness)까지 보장하면서                           │
│  • 결정론적으로 만들어야 할 때                                  │
│                                                                  │
│  = 분산 합의 / 원자적 브로드캐스트 (Atomic Broadcast)           │
│                                                                  │
│  여기서 "불가능"은:                                             │
│  ─────────────────                                              │
│  • "모든 가능한 실행에서 종료를 보장하는 것"이 불가능           │
│  • "대부분의 실행에서 종료"는 가능 (실제 시스템이 하는 것)      │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

7.2 Eco² SSE HA 아키텍처

전체 데이터 흐름

Redis 데이터 구조

핵심 관찰: FLP 해당 여부

┌─────────────────────────────────────────────────────────────────┐
│                    Eco² 이벤트 버스 분석                         │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  핵심 관찰:                                                     │
│  ──────────                                                     │
│  • 합의를 여러 노드가 함께 만드는 구조가 아님                   │
│  • Redis Master가 "단일 시퀀서" 역할                            │
│  • State KV의 "최신 seq만 유지"도 Redis 원자 연산 위에서 성립   │
│  • = 중앙 조정자(Leader)를 둔 모델                              │
│                                                                  │
│  결론: FLP의 전제(완전 분산 합의)와 결이 다름                   │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

7.3 Race Condition: Pub/Sub의 Fire-and-forget 특성으로 인한 이벤트 누락

보장 수준

┌─────────────────────────────────────────────────────────────────┐
│                    Eco² SSE 보장 수준                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  현재 (Pub/Sub only):                                           │
│  ─────────────────────                                          │
│  • 구독 완료 후 이벤트: ✓ 수신                                  │
│  • 구독 전 이벤트: ✗ 유실 가능                                  │
│  • State 폴링: 최종 상태만 복구                                 │
│                                                                  │
│  개선 후 (Pub/Sub + Streams Catch-up):                          │
│  ──────────────────────────────────────                         │
│  • 구독 완료 후 이벤트: ✓ 수신 (Pub/Sub)                       │
│  • 구독 전 이벤트: ✓ 복구 (Streams)                            │
│  • seq 갭 감지 시: Streams에서 누락 이벤트 조회                 │
│                                                                  │
│  = Per-job Ordering + At-least-once + Catch-up 달성             │
│  = FLP 우회: 중앙 조정자(Redis) + Eventual Consistency          │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

7.5 Eco²가 실제로 필요한 보장

┌─────────────────────────────────────────────────────────────────┐
│                    Eco² SSE의 실제 요구사항                      │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  필요한 보장 (합의 아님):                                       │
│  ─────────────────────────                                      │
│                                                                  │
│  1. Per-job Ordering                                            │
│     • 같은 job_id 안에서 seq 증가 순서대로 보여주기             │
│     • 전역 순서(Total Order)가 아님                             │
│     • Redis XADD가 자동으로 보장                                │
│                                                                  │
│  2. At-least-once 전달 + Dedup                                  │
│     • 중복 와도 seq로 제거                                      │
│     • 누락되면 Catch-up으로 복구                                │
│                                                                  │
│  3. Catch-up 가능                                               │
│     • Pub/Sub 놓친 구간은 Streams/State로 메우기                │
│     • "항상 진행" 아니라 "언젠가 수렴"이면 OK                   │
│                                                                  │
│  이것은:                                                        │
│  ────────                                                       │
│  • 로그(Streams) + 라이브 푸시(Pub/Sub) + 스냅샷(State) 조합   │
│  • FLP의 "결정론적 합의의 종료 보장"과는 다른 목표              │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

7.6 FLP에 가까워지는 조건 체크

┌─────────────────────────────────────────────────────────────────┐
│                    FLP 해당 여부 체크리스트                      │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  아래 중 "예"가 많을수록 FLP/합의 문제에 가까워짐:              │
│                                                                  │
│  ┌────────────────────────────────────────────────────────────┐│
│  │                                                             ││
│  │  1. Redis 없이도 Router 여러 개가 서로 통신만으로          ││
│  │     "최신 상태/순서"를 결정해야 한다?                       ││
│  │     → Eco²: 아니오 (Redis가 단일 권위)                     ││
│  │                                                             ││
│  │  2. 네트워크 파티션이 나도 절대 멈추지 않고(liveness)      ││
│  │     계속 진행해야 한다?                                     ││
│  │     → Eco²: 아니오 (잠깐 멈추고 재연결 OK)                 ││
│  │                                                             ││
│  │  3. 동시에, 모든 클라이언트가 같은 전역 순서를             ││
│  │     반드시 봐야 한다?                                       ││
│  │     → Eco²: 아니오 (per-job 순서만 필요)                   ││
│  │                                                             ││
│  │  4. 그걸 결정론적으로 보장해야 한다?                        ││
│  │     → Eco²: 아니오 (최신 상태로 수렴이면 OK)               ││
│  │                                                             ││
│  └────────────────────────────────────────────────────────────┘│
│                                                                  │
│  Eco² 결과: 4개 모두 "아니오" → FLP 직격 대상 아님              │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

7.7 언제 FLP가 문제가 되는가?

┌─────────────────────────────────────────────────────────────────┐
│                    FLP가 문제가 되는 시나리오                    │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  FLP에 직격으로 걸리는 요구:                                    │
│  ─────────────────────────────                                  │
│                                                                  │
│  "여러 노드(Event Router / SSE Gateway)가                       │
│   같은 job_id에 대해 완전히 동일한 단일 순서(total order)를     │
│   항상(네트워크 지연 무한/파티션 가능) 진행(liveness)까지       │
│   보장하면서 결정론적으로 만들어야 한다"                        │
│                                                                  │
│  = 분산 합의 / 원자적 브로드캐스트에 가까워짐                   │
│  = 완전 비동기에서 liveness 100% 보장 불가능                    │
│                                                                  │
│  예시:                                                          │
│  ─────                                                          │
│  • 분산 DB 트랜잭션 커밋 (2PC/3PC)                              │
│  • 블록체인 합의 (PoW, PoS)                                     │
│  • 분산 락 서비스 (ZooKeeper, etcd)                             │
│  • 리더 선출 (Raft, Paxos)                                      │
│                                                                  │
│  Eco²가 이쪽으로 가는 경우:                                     │
│  ─────────────────────────                                      │
│  • Redis 없이 Event Router끼리 합의해야 할 때                  │
│  • 여러 SSE Gateway가 "같은 전역 순서"를 봐야 할 때            │
│  • 네트워크 분할에서도 "절대 멈추면 안 될 때"                  │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

7.8 Eco² 설계 원칙

┌─────────────────────────────────────────────────────────────────┐
│                    Eco² SSE 설계 원칙                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  FLP를 피하는 설계:                                             │
│  ─────────────────                                              │
│                                                                  │
│  1. 중앙 조정자 사용 (Redis Master)                             │
│     • "분산 합의"를 직접 구현하지 않음                          │
│     • Redis가 순서/스냅샷의 Source of Truth                     │
│     • 나머지는 전달(at-least-once) + 재시도 + 복구              │
│                                                                  │
│  2. Per-job Ordering (전역 순서 아님)                           │
│     • 각 job_id 내에서만 순서 보장                              │
│     • 전역 Total Order 요구 안 함                               │
│     • 훨씬 쉬운 문제                                            │
│                                                                  │
│  3. Eventual Consistency                                        │
│     • "항상 즉시 일관성" 대신 "언젠가 수렴"                    │
│     • Catch-up으로 누락 복구                                    │
│     • 네트워크 분할 시 잠깐 멈춰도 OK                          │
│                                                                  │
│  4. 복구 가능성 (Liveness보다 Safety)                           │
│     • 의심스러우면 멈추고 재연결                                │
│     • 데이터 손실/불일치보다 지연이 낫다                        │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

8. 핵심 정리

┌─────────────────────────────────────────────────────────────────┐
│                    FLP Impossibility 핵심                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  1. 정리:                                                       │
│     비동기 + 1개 장애 → 결정론적 합의 불가능                   │
│                                                                  │
│  2. 핵심 원인:                                                  │
│     "죽었는가? 느린가?" 구분 불가능                             │
│                                                                  │
│  3. 우회 전략:                                                  │
│     • 부분 동기 (타임아웃)                                      │
│     • 랜덤화 (확률적 보장)                                      │
│     • 장애 감지기                                               │
│                                                                  │
│  4. 실제 시스템:                                                │
│     • Safety는 항상 보장                                        │
│     • Liveness는 "좋은 상황"에서만 보장                        │
│     • 대부분의 경우 잘 동작                                     │
│                                                                  │
│  5. "비동기 분산 ≠ FLP":                                       │
│     • FLP는 "합의" 문제에 대한 것                               │
│     • 중앙 조정자(Redis) 사용 → 분산 합의 아님                 │
│     • Per-job ordering + eventual consistency면 충분           │
│                                                                  │
│  6. Eco² SSE 이벤트 버스:                                       │
│     • FLP 직격 대상 아님 (합의 문제 안 풀음)                    │
│     • Redis = 단일 권위 / 순서 부여자                           │
│     • 전달 + 재시도 + catch-up 모델                             │
│                                                                  │
│  7. Eco² 인프라:                                                │
│     • Redis Sentinel: 타임아웃 + Quorum                        │
│     • RabbitMQ: Raft + pause_minority                          │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

Foundations


버전 정보

  • 작성일: 2025-12-28
  • 원본 논문: JACM 1985
  • 적용 대상: Eco² Backend Infrastructure (Redis Sentinel, RabbitMQ, SSE Event Bus)