Game에서 Partition Tolerance 구현 방법 & 해결책

정혜창·2025년 3월 16일
0

내일배움캠프

목록 보기
36/43
post-thumbnail

🎮 분할 용인을 구현하는 기술 (네트워크 단절 시에도 동작하게 하는 기술)

분산 시스템에서 네트워크 장애(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 (가용성) 중심으로 최종 일관성을 활용하는 것이 일반적

profile
Unreal 1기

0개의 댓글

관련 채용 정보