게임 서버의 2가지 기술 [2 / 4], 실시간 게임서버 (Stateful server) 의 특징

실시간 온라인 게임서버, Stateful 서버

Stateful 게임서버는 실시간 온라인 게임에 사용되는 기술로 대표적인 장르는 MMORPG 가 있습니다. 수천,수만명의 유저가 실시간으로 모두 같은 화면을 바라보며, 전투와 같은 동적인 플레이를 합니다.

  • MMORPG
  • MOBA (AOS) 게임
  • CS 방식의 FPS 게임
  • 기타 실시간 상호작용의 게임들

MMORPG 장르 외의 대표적인 게임 으로는 오버워치, LOL 등이 있습니다.

리니지 2m
리그오브레전드 LOL
오버워치

MMORPG 와는 다르게 수십명 내외의 플레이어가 게임을 하는 MO (Multiplayer Online) FPS , MOBA 게임 장르의 경우는 P2P 방식과 C/S 방식에 따라 게임서버의 역할이 다릅니다. 예전에는 게임서버 개발의 편의성을 위해 P2P 방식을 많이 사용 하였으나, 최근에는 C/S 구조의 방식을 많이 사용하고 있습니다.

LOL 과 오버워치 역시 C/S 의 방식이며, 이는 Stateful 게임서버의 기술을 사용하게 됩니다.

이런 게임들은 다수의 유저들과 실시간 액션 플레이를 해야합니다. 그렇기 때문에 모든 클라이언트는 서버에 접속하여 연결을 유지한 상태로 플레이를 진행 합니다. 또한 게임의 로직,데이터는 서버가 모두 게임서버의 데이터로 로직을 처리 합니다.

Stateful 게임서버의 특징 1 – 연결유지

유저의 게임 프로그램 클라이언트는 서버와 연결의 개념으로 유지하고 있습니다. ( TCP 또는 UDP 모두 사용 가능하며, 여기서의 연결이 꼭 TCP 의 Connect 를 의미 하는 것은 아닙니다)

연결의 개념을 유지하는 이유는 다른 유저들의 행동을 모든 유저들에게 실시간으로 전송시켜야 합니다. 서버에서 클라이언트에게 수많은 데이터를 빠르게 전송 시켜야 하므로 연결개념이 필수적으로 들어갑니다.

서버와 클라이언트는 항시 연결을 유지하고 있기 때문에 ‘클라이언트 > 서버’ / ‘서버 > 클라이언트’ 의 모든 상호간 실시간 통신이 가능하다

Stateful 게임서버의 특징 2 – 서버의 메모리

접속한 유저들의 모든 게임 컨텐츠 데이터를 게임서버 메모리에 보관하며, 실시간으로 로직을 처리 합니다. 이는 빠르게 동기화된 로직 처리를 위해 필수적인 부분 입니다.

서버 주도로 이동,공격 등 모든 컨텐츠가 처리 되어야 합니다. 이런 게임로직의 빠른 처리를 위해서는 서버 컴퓨터의 메모리에 현재 플레이 중인 모든 유저의 컨텐츠 데이터를 보관하여 처리 하도록 합니다.

이 게임서버 월드의 모든 데이터와 접속 플레이어의 모든 데이터를 메모리에서 관리 합니다. (물론 그래픽,사운드 데이터는 없습니다)

  • 게임월드의 시간,날씨
  • 모든 필드,던전
  • 몬스터, NPC
  • 접속 플레이어의 모든 정보
  • 전 유저의 아이템,파티,길드,퀘스트 플레이 내역
  • 등등… 컨텐츠의 모든 요소를 게임서버 메모리에

동시접속자가 1만명 이라면 1만명의 모든 데이터를 관리하고 처리 해야만 합니다.

사실 이 부분이 Stateful 서버의 주 기능 입니다. 서버가 자체적으로 데이터(상태) 를 유지합니다. (반대로 Stateless 서버는 서버의 메모리에 데이터를 보관하지 않습니다)

Stateful 게임서버의 특징 3 – 프로그래밍 언어

빠른 처리속도가 필수적인 서버 이므로 C/C++ 언어를 많이 사용 합니다. 최근에는 C# 등의 언어도 사용이 되고 있지만 여전히 C/C++ 이 가장 많이 사용되고 있습니다. (간혹 스크립트 언어 또는 Java 로 개발 되기도 합니다)

C++ 이 가장 많이 사용되는 이유는 결국 빠른 처리속도 문제 입니다. MMORPG 서버의 경우는 적으면 수천명에서 많게는 2만명 까지의 동시접속자를 처리하는 서버도 있습니다. 수만명의 유저의 연결을 유지하며, 수만명의 데이터를 실시간으로 처리하기 위해선 고성능의 기술이 필수 입니다.

Stateful 게임서버의 특징 4 – 데이터 베이스 (DB)

Stateful 게임서버의 모든 로직은 서버의 메모리의 자료를 기반으로 처리 하게 됩니다. 그렇기 때문에 데이터베이스의 활용도가 다소 떨어집니다.

유저가 서버에 접속하여 플레이를 하는 과정에서 데이터의 흐름 순서는 아래와 같습니다.

  1. 유저의 로그인 요청
  2. 게임서버는 해당 유저의 모든 데이터를 DB 에서 읽어 메모리에 저장
  3. 메모리를 기반으로 컨텐츠 로직 수행
  4. 플레이 로직에 따라 변경된 데이터를 DB 에 저장

일반적으로 위와 같은 절차로 게임서버가 진행 됩니다.

Stateful 게임서버의 DB 사용 시점과 사용 방법을 나누어서 살펴보면

처음 로그인 시 : 유저의 모든 데이터를 한방에 쭈우우욱 서버로 읽어들임

( 데이터의 흐름 방향 : 게임서버 <= DB )

게임 플레이 중 : 메모리의 데이터를 기준으로 처리 후 변동사항을 DB 에 저장

( 데이터의 흐름 방향 : 게임서버 => DB )

이처럼 유저의 접속 시점에 DB 에서 데이터를 크기 읽어들여 오며, 변동내역을 DB 로 단방향 저장하는 방식 입니다.

Stateful 게임서버의 메모리 데이터와 DB 데이터의 주 목적

게임서버의 메모리 : 현재 플레이 중인 유저의 플레이 로직 처리의 기준. 실제 최신 데이터

데이터 베이스의 데이터 : 메모리에서 처리된 데이터의 보관. 로그아웃, 서버OFF 시 보관을 위한 데이터.

이런 차이로 인하여 MMORPG 에는 롤백이라는 상황이 만들어 집니다. 게임서버 메모리에서 로직 처리는 완료 되었고 결과도 받았으나, DB 에 저장되기 이전에 게임서버가 다운 된다면 마지막에 저장되지 못한 일부 데이터가 유실되어 없어지게 됩니다.

Stateful 게임서버의 특징 5 – 확장,분산 방식

온라인 게임 또는 온라인 서비스에 더 많은 사용자를 받아들이기 위해서는 서버를 확장, 분산 해야 합니다. 그리고 서버의 확장 방법에는 Scale-Out 과 Scale-Up 방식이 존재 합니다.

Scale-Out 과 Scale-Up 에 대한 이야기만 해도 길어지기 때문에 이는 별도로 따로 올리겠습니다.

  • Scale-out 은 수평적 확장 (서버의 대수를 늘려 더 많은 사용자를 받도록 함)
  • Scale-up 은 수직적 확장 (서버의 성능을 높여 더 많은 사용자를 받도록 함)

Stateful 게임서버는 하나의 게임 플레이 단위를 기준으로는 Scale-Out 이 불가능 합니다. 그래서 동시 접속자에 제한이 있는 것입니다.

예를 들어 MMORPG 진정 Scale-out 확장이 가능하도록 설계가 되었다면, 동시접속자 무제한 단일 월드가 만들어 질 수 있습니다. 하지만 현실적으로 불가능 하며, 개발되지 못하고 있습니다.

그래서 Stateful 게임서버는 완벽한 Scale-Out 은 아니지만 게임 자체를 나누건나, 별도의 월드를 추가하여 수평확장과 비슷하게 처리하고 있습니다.

MMORPG – 유저가 서버군 (월드) 를 선택 하여 플레이 하도록 함. 사용자가 많아지면 서버군(월드) 를 더 추가하여 사용자에 대한 서버 접속을 분산 시킴.

MO, MOBA, FPS – 유저 들의 게임당 서버를 추가하여 ( 게임서버 당 1개 ~ N 개의 게임 플레이) 무수히 많은 유저가 플레이 할 수 있도록 함.

위와 같은 게임서버의 확장을 서버 대수를 늘리는 Scale-Out 이라고 부를 수도 있습니다. 하나의 게임 타이틀 서비스 입장에서는 Scale-Out 확장 이지만, 플레이의 단위로 본다면 본다면 Scale-Out 은 아닙니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다