Stateful (실시간 온라인 게임) 게임서버
Stateless (비실시간 비동기 온라인 게임) 게임서버
이 두 가지의 서버기술은 완전히 다른 방식의 기술을 사용한다. 먼저 게임의 종류에 대해 알아보자. 게임은 크게 '실시간 온라인 게임'과 '비실시간 비동기 온라인 게임'으로 나뉜다.
실시간/비실시간 게임
실시간 온라인 게임
- 리니지
- LOL
- 오버워치
- 크레이지아케이드
이런 실시간 온라인 게임들은 다수의 유저들과 실시간 액션 플레이를 해야한다. 그렇기 때문에 모든 클라이언트는 서버에 접속하여 연결을 유지한 상태로 플레이를 진행한다. 또한 게임의 로직과 전투의 판정 등, 모든 데이터와 결정은 게임서버가 주도적으로 진행해야만 한다. 우리는 이런 게임을 ‘실시간 온라인 게임’ 이라고 부르며 이런 목적의 게임 서버를 ‘Stateful Game Server’ 라고 부른다.
비실시간 비동기 온라인 게임
- 모바일 싱글 RPG
- 온라인 퍼즐게임
- 방치형 게임
- 수집형 게임
- 유저간 실시간 플레이가 없는 대부분의 모바일 게임
다른 유저와의 실시간 플레이 없이 싱글 플레이 후 플레이 데이터를 서버에 보관 하거나, 다른 유저의 플레이 결과만을 교환 또는 확인, 선물전달, 랭킹 확인 등의 요소들로 유저간의 실시간적인 교류와 플레이가 제한적인 게임이다. 우리는 이런 게임들을 ‘비동기 (비실시간)온라인 게임’ 이라고 부르며, 이런 목적의 게임서버를 ‘Stateless Game Server’ 라고 부른다.
위의 게임 '클래시 오브 클랜'은 비동기 온라인 게임이지만 다른 유저의 집을 공격한다. 하지만 이는 완벽한 실시간이 아니며 서버에 저장되어 있는 과거의 데이터를 보여주는 것이다. 약간의 과거 데이터를 보여주어도 문제가 없는 컨텐츠로 개발이 되었으며, 그래서 ‘비동기’ 게임 이라고 표현하는 것이다. 물론 비동기 게임서버 (Stateless Server) 기술로도 다른 유저들의 상황이 실시간에 가깝게 보이도록 만들 수 있다. 하지만 완벽한 실시간을 보장받기 힘들기 때문에 실시간 상호작용 컨텐츠를 넣기에 어려움이 있으며, 실시간 컨텐츠를 주력으로 하기에는 Stateless 게임서버의 성능,기능상의 한계가 존재한다.
두 가지 기술의 혼합형태
위와 같이 게임의 장르, 플레이 방식에 따라 게임서버의 개발 방식이 다르다. 최근에는 게임 컨텐츠가 다양화 됨에 따라 위의 2 가지 (실시간 온라인, 비동기 온라인) 방식이 함께 적용어 가고 있다.
비동기 온라인 게임 (Stateless) + 실시간 채팅 (Stateful)
비동기 온라인 게임 (Stateless) + 실시간 PVP 인스턴스 던전 (Stateful)
실시간 온라인 게임 (Stateful) + 토탈 랭킹 컨텐츠 (Stateless)
실시간 온라인 게임 (Stateful) + 로비, 캐릭터 꾸미기 (Stateless)
실시간 온라인 게임 (Stateful) + 느슨한 상호작용 컨텐츠 (Stateless)
실시간 게임서버 (Stateful server) 의 특징
모든 클라이언트는 서버에 접속하여 연결을 유지한 상태로 플레이를 진행한다. 또한 게임의 로직,데이터는 서버가 모두 게임서버의 데이터로 로직을 처리 한다.
MatchMaking 서버는 보통 stateful 서버 방식으로 하는 경우가 많다. 일반적인 구조는
웹서버(로그인/인증/기타정보) - 매치메이킹(TCP) - 게임서버(TCP 여러개 일수도)
이렇게 3개 서버를 두는 것이고 MatchMaking과 게임서버는 서로 Connection을 맺고 통신을 하면서 정보를 교환한다. MatchMaking에서 Client한테 몇번 방으로 가라고 Client에 알려주면, Client가 다시 게임서버에 붙어서 게임을 진행하는 것이다. (LOL 느낌)
서버와 클라이언트는 항시 연결을 유지하고 있기 때문에
‘클라이언트 > 서버’ / ‘서버 > 클라이언트’
의 모든 상호간 실시간 통신이 가능하다 접속한 유저들의 모든 게임 컨텐츠 데이터를 게임서버 메모리에 보관하며, 실시간으로 로직을 처리한다. 이는 빠르게 동기화된 로직 처리를 위해 필수적인 부분이다.
이런 게임로직의 빠른 처리를 위해서는 서버 컴퓨터의 메모리에 현재 플레이 중인 모든 유저의 컨텐츠 데이터를 보관하여 처리 하도록 한다. 동시접속자가 1만명 이라면 1만명의 모든 데이터를 관리하고 처리 해야만한다. 사실 이 부분이 Stateful 서버의 주 기능이다. 서버가 자체적으로 데이터(상태) 를 유지하는 것이다.
(반대로 Stateless 서버는 서버의 메모리에 데이터를 보관하지 않는다)
빠른 처리속도가 필수적인 서버 이므로 컴파일 언어인 C/C++ 를 많이 사용한다. 최근에는 C# 등의 언어도 사용이 되고 있지만 여전히 C/C++ 이 가장 많이 사용되고 있다. (간혹 스크립트 언어 또는 Java 로 개발 되기도 한다)
C++ 이 가장 많이 사용되는 이유는 결국 빠른 처리속도 문제이다. MMORPG 서버의 경우는 적으면 수천명에서 많게는 2만명 까지의 동시접속자를 처리하는 서버도 있다. 수만명의 유저의 연결을 유지하며, 수만명의 데이터를 실시간으로 처리하기 위해선 고성능의 기술이 필수다.
Stateful 게임서버의 메모리 데이터와 DB 데이터의 주 목적
게임서버의 메모리
현재 플레이 중인 유저의 플레이 로직 처리의 기준. 실제 최신 데이터
데이터 베이스의 데이터
메모리에서 처리된 데이터의 보관. 로그아웃, 서버OFF 시 보관을 위한 데이터
이런 차이로 인하여 MMORPG 에는 롤백이라는 상황이 만들어진다. 게임서버 메모리에서 로직 처리는 완료 되었고 결과도 받았으나, DB 에 저장되기 이전에 게임서버가 다운 된다면 마지막에 저장되지 못한 일부 데이터가 유실되어 없어지게 된다.
Stateful 게임서버의 확장성
Stateful 게임서버는 하나의 게임 플레이 단위를 기준으로는 Scale-Out 이 불가능하다. 그래서 동시 접속자에 제한이 있는 것이다. 예를 들어 MMORPG 진정 Scale-out 확장이 가능하도록 설계가 되었다면, 동시접속자 무제한 단일 월드가 만들어 질 수 있다. 하지만 현실적으로 불가능 하며, 개발되지 못하고 있다. 그래서 Stateful 게임서버는 완벽한 Scale-Out 은 아니지만 게임 자체를 나누건나, 별도의 월드를 추가하여 수평확장과 비슷하게 처리하고 있다.
비동기 게임서버 (Stateless server) 의 특징
조금은 가벼운 모바일 게임에서 많이 사용하는 기술이다. 유저간의 실시간 상호작용 컨텐츠가 없이 혼자서 싱글 플레이를 하는 게임, 또는 완벽한 실시간 컨텐츠가 없는 게임에 적합한 기술이다. 다른 유저와의 실시간 상호작용 없이 싱글 플레이 후 플레이 데이터의 보관, 랭킹, 친구간의 선물교환 등의 요소들로 이루어진 게임이 Stateless 게임서버이다.
게임 클라이언트 프로그램과 게임서버와의 연결 유지가 없다. 평소에는 서버와 연결이 끊어진 상태로 단독 싱글 플레이를 하며, 스테이지 클리어, 아이템 사용, 구매, 가챠뽑기 등 게임의 중요 포인트에만 서버에 연결하여 데이터를 전달하고 이에대한 결과를 반영,수신 하는 방식이다.
연결을 유지하지 않는 이유는 불필요 하기 때문이다. 클라이언트의 요청이 없는 한 서버는 할 일이 대부분 없다. 클라이언트의 요청이 많은게 아니라면 연결을 유지 해야 할 이유가 없는 것이다.
이런 방식은 우리가 평소에 너무나 많이 사용하는 인터넷 웹 환경과 비슷하다. 그래서 웹 사이트에서 사용되는 기술인 HTTP 프로토콜과 웹 프로그래밍 기술이 사용되고 있다.
Stateless 를 결정하는 기준
" 서버 메모리에 데이터 (상태) 를 유지 하는가 ? "
Stateless 는 연결유지가 없이 필요한 경우에만 클라이언트와 서버가 연결,처리를 진행하기 때문에 특정 서버의 메모리에 유저의 데이터, 컨텐츠 데이터를 올려놓고 사용하지 않는다.
Stateful 게임서버와 반대로 데이터베이스 의존도와 활용도가 아주 높다. 이유는 연결 유지와 메모리의 데이터 보관이 없기 때문에 모든 데이터를 필요시 마다 DB 에서 읽고, 변경하고, 쓰고의 3단계를 항시 반복수행 해야 한다. 그러다 보니 데이터베이스의 사용량이 굉장히 많으며 성능의 저하, 부담의 모든 부분이 데이터베이스에서 나타난다. DB에 Data를 저장하고, 불러오는데 걸리는 시간이 있기 때문이다.
Stateless 게임서버의 메모리 데이터와 DB 데이터의 주 목적
윗부분에서 Stateful 게임서버는 게임서버의 메모리가 최신데이터 이며, 로직 처리의 기준이었다. 그리고 DB 는 이에대한 자료 보관목적의 용도였다. 하지만 Stateless 에서는 게임서버에 상태,데이터가 없기 때문에 게임서버의 메모리는 이번 행동의 로직 처리를 위한 임시 저장소로 사용되며, 즉시 DB 에 저장후 메모리의 데이터는 사라진다. 그러므로 DB 의 데이터가 최신 데이터이자 원본 데이터의 역할이다.
Stateless 게임서버의 확장성
Stateless 의 경우는 서버의 대수를 늘려서 서버를 확장하기가 수월하다. 대신 DB 에 모든 데이터가 집중되고, DB 의 사용량이 많기 때문에 DB 의 성능, 분산, 설계가 굉장히 중요하다.
Stateful 서버, Stateless 서버의 장단점
Stateful 게임서버의 장점, 단점
여러 유저와의 실시간 상효작용이 이루어 지기 위해 사용할 수 있는 유일한 방법
[장점]
1. 연결 유지로 인해 다른 유저들의 행동,변화를 바로바로 동기화 가능
2. 빠른 처리 속도로 실시간 온라인 게임이 가능
3. 모든 게임의 로직을 서버가 전담 하므로 핵이 불가능 함
[단점]
1. 개발 자체가 어려움
2. 서버가 다운되면 모든 유저의 게임이 종료되며, 롤백 가능성이 있음
3. MMORPG 같은 경우 한 서버당 접속자 제한이 생김 (서버군,채널로 분산)
Stateless 게임서버의 장점, 단점
[장점]
1. 개발이 훨씬 편리함. (언어자체의 편의성, 자료, 라이브러리 등이 많음)
2. 서버의 오류가 발생 하여도 일부 유저,일부 기능에만 문제가 생김
3. 모든 데이터는 DB 기준으로 처리 하기 때문에 서버 다운의 롤백이 없음
4. 웹서버의 분산 처리가 용이함.
[단점]
1. 서버와의 실시간 처리는 어려움이 있음
2. 일부 게임의 경우 클라이언트 단독 로직으로 인해 핵이 존재함
Stateful 과 Stateless 의 선택
온라인 게임서버의 2가지 기술이 있지만 선택의 기준은 명확하다.게임의 장르에 따라서 결정되어야 하며, 클라이언트의 플렛폼 (PC, 모바일) 에 따라 결정되는 사항은 아니다. MMORPG, MOBA, 스포츠, 액션 등과 같이 다른 유저와 실시간 플레이를 하는 게임이라면 Stateful 서버로 개발 되어야 하며, 이런 요소가 없는 비동기형 온라인 게임이라면 Stateless 로 개발 되는것이 맞다.
'CS > 네트워크' 카테고리의 다른 글
[네트워크] 접근 통제 정책 (MAC, DAC, RBAC) (0) | 2024.05.27 |
---|---|
맵 방식 설정 심리스(Seamless), 존(Zone), 룸(Room) (0) | 2024.03.21 |
이상적인 스레드 풀의 적정 크기에 대하여, 스레드 풀 크기 공식, 리틀의 법칙 (0) | 2023.07.30 |
멀티 스레드(Thread)의 장점과 문제점 (0) | 2023.07.29 |
데드 레커닝 - 온라인 게임의 이동처리 기법 (0) | 2023.07.11 |