🎮 분할 용인을 구현하는 기술 (네트워크 단절 시에도 동작하게 하는 기술)
분산 시스템에서 네트워크 장애(Partition)가 발생해도 게임이 계속되도록 하는 기술들은 다음과 같다.
1️⃣ 데이터 복제(Replication)
게임 데이터를 여러 서버에 복사본으로 저장해서, 한 서버가 죽어도 다른 서버에서 데이터를 제공할 수 있도록 함.
📌 예제: 유저의 게임 점수, 탄약, 위치 데이터를 서버 A, B, C에 동일하게 저장.
- 대표적인 방법:
- 마스터-슬레이브 복제 (Master-Slave Replication) → 한 서버(마스터)가 데이터를 변경하면 나머지 서버(슬레이브)들이 복제
- 리더-팔로워 구조 → 특정 서버가 변경을 관리하고, 나머지가 따라가는 방식
2️⃣ 이벤트 소싱(Event Sourcing)
변경된 데이터를 순차적으로 로그에 저장하고, 서버가 다시 연결될 때 재적용함.
📌 예제: 게임 내에서 "플레이어가 총을 쐈다"는 이벤트를 저장하고, 네트워크가 복구되면 다시 반영.
- 대표적인 기술: Kafka, EventStore
3️⃣ 데이터 샤딩(Sharding)
데이터를 여러 서버에 나눠서 저장하고, 장애 발생 시 특정 서버의 데이터만 영향을 받도록 함.
📌 예제: 플레이어 AM은 서버 A, NZ는 서버 B에서 관리.
👉하지만 서버 간 동기화 문제가 발생할 수 있음
4️⃣ Gossip Protocol (소문 전파 방식)
서버들이 서로 상태 정보를 조금씩 전파해서 네트워크 단절 시에도 정보를 공유하도록 함.
📌 예제: 게임 서버가 다른 서버에게 변경된 데이터를 서서히 전파하는 방식.
- Cassandra, DynamoDB 같은 AP 시스템이 사용.
🎮 서버 A, B가 서로 다른 데이터를 가질 경우 → 일관성을 유지하려면?
네트워크가 복구될 때 서버 간 데이터가 일치하지 않으면(일관성이 깨지면) 해결해야 함.
1️⃣ 강한 일관성(Strong Consistency) 유지
모든 서버가 즉시 동일한 데이터를 가지도록 강제하는 방식.
- 해결 방법:
- Paxos / Raft 알고리즘 → 하나의 데이터 변경이 여러 서버에서 동의(합의, Consensus)를 얻어야 반영됨.
- Two-Phase Commit (2PC) → 데이터 변경을 적용하기 전에 모든 서버에서 승인받아야 함.
- 단점: 속도가 느려짐. FPS 게임 같은 실시간 시스템에서는 사용하기 어려움.
2️⃣ 최종 일관성(Eventual Consistency)
즉시 일관성을 맞추지는 않지만, 시간이 지나면 일관성을 유지하는 방식.
📌 예제: "네트워크가 복구되면 서버들끼리 서로 다른 데이터를 비교하여 맞추도록 함."
- 해결 방법:
- CRDT (Conflict-Free Replicated Data Types) → 데이터가 충돌하지 않도록 수학적 구조를 이용.
- Version Vector (버전 관리) → 각 서버가 데이터 버전을 관리해서 최신 데이터만 남김.
3️⃣ 충돌 해결(Conflict Resolution)
서버 A와 B가 다른 데이터를 가질 경우, 자동으로 충돌을 해결하는 방법.
- 해결 방법:
- "마지막으로 수정된 데이터가 정답이다" (Last-Write-Wins, LWW)
- "점수가 높은 쪽을 정답으로 한다" (예: 게임 점수)
- "플레이어의 요청을 우선한다" (예: 마지막으로 사용자가 본 탄약 수를 적용)
🎮 게임 서버에서는 어떤 방식이 좋을까?
📌 FPS 게임처럼 실시간성이 중요한 경우 → AP (가용성 우선) + 최종 일관성
- 서버가 분리되어도 게임이 끊기지 않도록 함.
- 네트워크 복구 후 데이터 동기화(최종 일관성) 수행.
📌 랭킹, 인벤토리, 경제 시스템처럼 정확성이 중요한 경우 → CP (일관성 우선)
- 데이터 정합성이 매우 중요하므로 강한 일관성 유지.
📌 네트워크 상태에 따라 혼합 적용 가능
- 게임 내 위치, 탄약 같은 데이터 → AP (빠른 응답)
- 게임 내 랭킹, 경제 시스템 → CP (정확성 유지)
🎮 결론: 게임에서 분할 용인을 하면 어떤 일이 벌어지고, 어떻게 해결할까?
📌 분할 용인을 채용하면
- 네트워크가 끊어져도 게임이 계속 돌아감 (가용성 유지).
- 하지만 서버가 다시 연결될 때, 데이터 불일치가 발생할 수 있음.
📌 일관성을 유지하려면
- 강한 일관성 (Paxos, Raft, 2PC) → 속도 느림.
- 최종 일관성 (Gossip, CRDT) → 나중에 데이터 정리.
- 충돌 해결 (LWW, 버전 관리) → 자동으로 정리.
📌 게임에서는 AP (가용성) 중심으로 최종 일관성을 활용하는 것이 일반적