[게임 서버] 10.3 매치메이킹의 분산 처리
카테고리: GameServer
태그: GameServer
이 글은 아래의 책을 자세히 정리한 후, 정리한 글을 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) 를 주고, 클라이언트는 ⑥에서 이를 사용한다.
- ⑦에서 로비 서버는 다른 로비 서버에게 간접적으로 지시한다.
문제점 / 해결법:
- 플레이어/로비 서버가 정말 많다면, 로비 서버끼리 엄청난 양의 통신량이 발생한다.
- 응집도가 높은 같은 실력의 플레이어끼리만 매칭시킨다.
- 응집도가 낮은 플레이어의 데이터는 동기화하지 않는다.
- 로비 서버 간 데이터 불일치(스테일 데이터) 문제 → 아래에서 따로 알아보자.
⚠️ 로비 서버간 데이터 불일치 문제
---
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은 이미 배틀 서버로 이동 중이다.
- 자동으로 매치메이킹을 재시작하는 수밖에 없다.
또 다른 해결법:
- 메모리 저장 서버를 따로 두어 접근하는 방식을 사용할 수도 있다.
- 이곳에서 다루었었다.
- 데이터 접근 시마다 기기 간 통신이 발생하므로, 비효율적일 수 있다.
- 로비 서버 연산량이 많고, 메모리 저장소 서버 연산량이 적을 때 효과적이다.
댓글남기기