[게임 서버] 10.3 매치메이킹의 분산 처리

게시:     수정

카테고리:

태그:

이 글은 아래의 책을 자세히 정리한 후, 정리한 글을 GPT에게 요약을 요청하여 작성되었습니다.
게임 서버 프로그래밍 교과서, 배현직 저자

📦 10. 분산 서버 구조 사례

👉🏻 3. 매치메이킹의 분산 처리

📌 개념 정리

  • 매치메이킹: 플레이를 위해 다른 플레이어를 찾는 것
  • 로비 서버: 매치메이킹을 담당하는 서버

🔰 서버 분산 전

---
config:
  look: handDrawn
  theme: dark
  layout: dagre
---
sequenceDiagram
    participant C1 as 클라이언트 1
    participant C2 as 클라이언트 2~10
    participant S as 서버

    C1->>S: ① 게임 시작을 대기
    C2->>S: ② 게임 시작을 대기

    Note left of S: 목표 인원 충족

    S-->>C1: ③ 게임방에 진입
    S-->>C2: ④ 게임방에 진입
---
config:
  look: handDrawn
  theme: dark
  layout: dagre
---
flowchart LR

  C1[클라이언트]
  C2[클라이언트]
  C3[클라이언트]
  C4[클라이언트]

  subgraph MATCH[매치메이킹 + 게임방]
    S[서버]
  end

  C1 --- S
  C2 --- S
  C3 --- S
  C4 --- S
  • 단일 서버에서 과부하 지점을 찾는다.
  • 월드 시뮬레이션, 동시 접속자 몰림으로 인해 CPU/RAM이 과부하될 수 있다.

⚔️ 배틀 서버 분산

---
config:
  look: handDrawn
  theme: dark
  layout: dagre
---
flowchart LR

  C1[클라이언트]
  C2[클라이언트]
  C3[클라이언트]
  C4[클라이언트]

  L[로비 서버]
  B1[배틀 서버]
  B2[배틀 서버]

  C1 --- L
  C2 --- L

  C3 --- B1
  C4 --- B2
  • 서로 다른 게임방 혹은 다른 리전끼리는 응집력이 낮으므로 분산해야 한다.
    • 게임방을 처리하는 서버를 배틀 서버라 한다.
    • 배틀 서버 여럿과 로비 서버로 나눔으로써, 플레이 중 레이턴시도 줄일 수 있다.
  • 로비 서버 클러스터는 한 리전에 두어도 된다.
---
config:
  look: handDrawn
  theme: dark
title: 네트워크 시퀀스
---
sequenceDiagram
  participant C1 as 클라이언트 1
  participant C2 as 클라이언트 2~10
  participant L as 로비 서버
  participant B as 가장 처리량이 적은<br>배틀 서버

  C1->>L: ① 게임 시작을 대기
  activate L
  deactivate L
  C2->>L: ② 게임 시작을 대기
  activate L
  deactivate L

  L->>B: ③ 게임방 생성 명령
  activate B
  deactivate B
  B-->>L: ④ 게임방 생성했음!
	activate L
  deactivate L

  L-->>C1: ⑤ 게임방 참여를 요청
  activate C1
  deactivate C1
  C1->>B: ⑥ 접속 및 게임방 참여
	activate B
  deactivate B

  L-->>C2: ⑦ 게임방 참여를 요청
  activate C2
  deactivate C2
  C2->>B: ⑧ 접속 및 게임방 참여
  activate B
  deactivate B
  • 클라이언트는 배틀 서버에 접속할 때, 인증 정보(Credential) 를 사용한다.

🏠 로비 서버 분산

로비 서버들은 아래의 데이터를 주고받아야 한다.

  • 플레이어 실력 정보
  • 매칭 대기 중 여부

통신 방법 선택:

방법 결과 이유
동기 분산 처리 통신 횟수가 너무 많아짐
비동기 분산 처리 응답을 받지 못함
데이터 복제 기반 로컬 처리 서버 간 통신으로 플레이어 목록 동기화
---
config:
  look: handDrawn
  theme: dark
  layout: dagre
title: 네트워크 시퀀스
---
sequenceDiagram
  participant C1 as 클라이언트 1
  participant C2 as 클라이언트 2~10
  participant L1 as 로비 서버 1
  participant L2 as 로비 서버 2
  participant B as 가장 처리량이 적은<br>배틀 서버

  C1 ->> L1: ① 게임 시작 대기
  activate L1
  deactivate L1
  C2 ->> L2: ② 게임 시작 대기
  activate L2
  deactivate L2
  L2 ->> B: ③ 게임방 생성
  activate B
  deactivate B
  B ->> L2: ④ 응답
  activate L2
  deactivate L2
  L2 ->> C2: ⑤ 게임방 참여 요청
  activate C2
  deactivate C2
  C2 ->> B: ⑥ 연결 및 게임방 참여
  activate B
  deactivate B
  L2 ->> L1: ⑦ "게임방 참여" 지시
  activate L1
  deactivate L1
  L1 ->> C1: ⑧ 게임방 참여 요청
  activate C1
  deactivate C1
  C1 ->> B: ⑨ 연결 및 게임방 참여
  activate B
  deactivate B
  • ①②에서 플레이어 정보 변화를 로비 서버들끼리 동기화시킨다.
  • ⑤에서 서버는 인증 정보(Credential) 를 주고, 클라이언트는 ⑥에서 이를 사용한다.
  • ⑦에서 로비 서버는 다른 로비 서버에게 간접적으로 지시한다.

문제점 / 해결법:

  1. 플레이어/로비 서버가 정말 많다면, 로비 서버끼리 엄청난 양의 통신량이 발생한다.
    • 응집도가 높은 같은 실력의 플레이어끼리만 매칭시킨다.
    • 응집도가 낮은 플레이어의 데이터는 동기화하지 않는다.
  2. 로비 서버 간 데이터 불일치(스테일 데이터) 문제 → 아래에서 따로 알아보자.

⚠️ 로비 서버간 데이터 불일치 문제

---
config:
  look: handDrawn
  theme: dark
  layout: dagre
title: 데이터 불일치 문제
---
sequenceDiagram
    participant C1 as 클라이언트 1
    participant C2 as 클라이언트 2~10
    participant L1 as 로비 서버 1
    participant L2 as 로비 서버 2
    participant B as 가장 처리량이 적은<br>배틀 서버

    C1 ->> L1: ① 게임 시작 대기
    activate L1
    deactivate L1
    C2 ->> L2: ② 게임 시작 대기
    activate L2
    deactivate L2

    Note over C1: ③ 매칭 대기 취소
    C1 ->> L1: ④ 매칭 대기 = FALSE

    Note over L1,L2: ⑤ 아직 동기화 전<br>L1은 C1이 대기 중이라고 판단

    L2 ->> B: ⑥ 게임방 생성<br>(C1·C2 매칭)
    activate B
    deactivate B
    B ->> L2: ⑦ 응답
    activate L2
    deactivate L2

    L2 ->> C2: ⑧ 게임방 참여 요청
    activate C2
    deactivate C2
    C2 ->> B: ⑨ 연결 및 게임방 참여
    activate B
    deactivate B

    L2 ->> L1: ⑩ "게임방 참여" 지시
    activate L1
    deactivate L1
    L1 ->> C1: ⑪ 게임방 참여 요청<br>(원치 않는 매칭!)
    activate C1
    Note over C1: ⚠️ 이미 취소했음에도<br>게임 시작됨
    deactivate C1
    C1 ->> B: ⑫ 연결 및 게임방 참여
    activate B
    deactivate B

    L1 -->> L2: ⑬ 뒤늦은 동기화<br>C1 매칭 대기 = FALSE
    Note over L1,L2: ❌ 이미 늦음<br>데이터 불일치 발생
  • 매칭 취소 직전에 매칭이 성사되는 경우가 대표적이다.
  • ④를 통해 로비 서버 1은 클라이언트 1의 취소 사실을 알고 있다.
    • 로비 서버 2에 원상 복구하라 알리는 방법이 있지만, 클라이언트 2~10은 이미 배틀 서버로 이동 중이다.
    • 자동으로 매치메이킹을 재시작하는 수밖에 없다.

또 다른 해결법:

  • 메모리 저장 서버를 따로 두어 접근하는 방식을 사용할 수도 있다.
    • 이곳에서 다루었었다.
    • 데이터 접근 시마다 기기 간 통신이 발생하므로, 비효율적일 수 있다.
    • 로비 서버 연산량이 많고, 메모리 저장소 서버 연산량이 적을 때 효과적이다.

GameServer 카테고리 내 다른 글 보러가기

댓글남기기