게임 서버의 2가지 기술 [3 / 4], 비동기 게임서버 (Stateless server) 의 특징

비동기 온라인 게임서버, Stateless 서버

조금은 가벼운 모바일 게임에서 많이 사용하는 기술 입니다.

유저간의 실시간 상호작용 컨텐츠가 없이 혼자서 싱글 플레이를 하는 게임, 또는 완벽한 실시간 컨텐츠가 없는 게임에 적합한 기술 입니다.

  • 모바일 싱글 RPG
  • 온라인 퍼즐게임
  • 방치형 게임
  • 수집형 게임
  • 유저간 실시간 플레이가 없는 대부분의 모바일 게임, 웹게임

다른 유저와의 실시간 상호작용 없이 싱글 플레이 후 플레이 데이터의 보관, 랭킹, 친구간의 선물교환 등의 요소들로 이루어진 게임이 Stateless 게임서버 입니다.

Stateless 게임서버의 특징 1 – 연결 유지를 하지 않음

게임 클라이언트 프로그램과 게임서버와의 연결 유지가 없습니다. 평소에는 서버와 연결이 끊어진 상태로 단독 싱글 플레이를 하며, 스테이지 클리어, 아이템 사용, 구매, 가챠뽑기 등 게임의 중요 포인트에만 서버에 연결하여 데이터를 전달하고 이에대한 결과를 반영,수신 하는 방식 입니다.

연결을 유지하지 않는 이유는 불필요 하기 때문 입니다. 클라이언트의 요청이 없는 한 서버는 할 일이 대부분 없습니다. 클라이언트의 요청이 많은게 아니라면 연결을 유지 해야 할 이유가 없습니다.

이런 방식은 우리가 평소에 너무나 많이 사용하는 인터넷 웹 환경과 비슷합니다.

그래서 웹 사이트에서 사용되는 기술인 HTTP 프로토콜과 웹 프로그래밍 기술이 사용되고 있습니다.

연결 유지를 하지 않고, HTTP 프로토콜을 사용하는 것이 Stateless 의 조건은 아닙니다. Stateless 역시 Stateful 서버처럼 C++ 과 TCP or UDP 등을 사용하여 연결을 유지하는 Stateless 게임서버를 개발 하는것도 가능합니다.

다만 웹서버 개발은 범용적으로 많이 사용 되어 왔으며, C++ 보다 훨씬더 편리한 개발, 수 많은 개발자 인력이 있습니다. 그리하여 웹서버 프로그래밍을 게임 서버에도 활용하게 된 것입니다.

Stateless 게임서버의 특징 2 – 서버 메모리에 데이터 보관 없음

Stateless 를 결정하는 기준은 바로 이것입니다.

” 서버 메모리에 데이터 (상태) 를 유지 하는가 ? “

Stateless 는 연결유지가 없이 필요한 경우에만 클라이언트와 서버가 연결,처리를 진행하기 때문에 특정 서버의 메모리에 유저의 데이터, 컨텐츠 데이터를 올려놓고 사용하지 않습니다.

연결이 끊어진 상태의 서버 입장에서는 어떤 유저가 플레이 중인지, 어떤 플레이를 하고 있는지 전혀 모르는 상황입니다. 서버는 필요시 마다 데이터베이스에서 데이터를 읽어오고, 로직 처리 후 데이터 변경 후 저장하는 과정을 반복수행 합니다.

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

Stateless 서버는 거의 대부분이 웹서버를 사용하고 있습니다. 그렇기에 프로그래밍 언어 또한 웹서버 프로그래밍 언어가 활용됩니다.

Node.js / Python / PHP / Java 등 일반적인 웹 프로그래밍 언어와 구조,설계,방법이 동일 합니다.

클라이언트가 웹 브라우저가 아닌 게임 클라이언트 이며, 서버의 로직이 게임 로직일 뿐 일반적인 웹서버 개발과 거의 비슷합니다.

현재의 웹프로그래밍 언어들은 모두 스크립트 언어로서 C++ 과 같은 컴파일 언어에 비하면 성능은 많이 떨어집니다. 하지만 개발과 유지보수에 편의성이 뛰어나기 때문에 대중적으로 많이 사용하는 기술 입니다.

Stateless 게임서버의 특징 4 – 데이터베이스

Stateful 게임서버와 반대로 데이터베이스 의존도와 활용도가 아주 높습니다. 이유는 연결 유지와 메모리의 데이터 보관이 없기 때문에 모든 데이터를 필요시 마다 DB 에서 읽고, 변경하고, 쓰고의 3단계를 항시 반복수행 해야 합니다.

그러다 보니 데이터베이스의 사용량이 굉장히 많으며 성능의 저하, 부담의 모든 부분이 데이터베이스에서 나타납니다.

예를 들어보면 …

  1. 게임 클라이언트에서 스테이지 클리어
  2. 클라이언트가 서버에 연결, 클리어 정보 전달
  3. 서버는 데이터베이스 에서 유저와 스테이지 관련 정보 로딩
  4. 서버는 해당 데이터로 클리어,보상 등 컨텐츠 로직 처리
  5. 서버는 처리된 데이터를 데이터베이스에 저장
  6. 최종 결과를 클라이언트에 전달
  7. 연결 종료
  8. 스테이지 클리어 결과 및 보상 표시

이처럼 특정 컨텐츠를 처리 할 때마다 위의 8단계 과정을 항시 반복수행 합니다.

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

Stateful 게임서버는 게임서버의 메모리가 최신데이터 이며, 로직 처리의 기준 이었습니다. 그리고 DB 는 이에대한 자료 보관목적의 용도 였습니다.

하지만 Stateless 에서는 게임서버에 상태,데이터가 없기 때문에 게임서버의 메모리는 이번 행동의 로직 처리를 위한 임시 저장소로 사용되며, 즉시 DB 에 저장후 메모리의 데이터는 사라집니다. 그러므로 DB 의 데이터가 최신 데이터이자 원본 데이터의 역할 입니다.

Stateless 게임서버의 특징 5 – 서버의 확장

이런 stateless 서버의 특징으로 인하여 Scale-Out 확장이 가능합니다. 서버 자체에는 로직 코드만이 있을 뿐 데이터가 없기 때문에 서버가 1대,2대,3대…1000 대 라고 해도, 어떤 서버에서 처리 되든 전혀 상관이 없이 같은 데이터의 결과를 보게 됩니다.

Stateless 의 경우는 서버의 대수를 늘려서 서버를 확장하기가 수월 합니다. 대신 DB 에 모든 데이터가 집중되고, DB 의 사용량이 많기 때문에 DB 의 성능, 분산, 설계가 굉장히 중요합니다.

댓글 남기기

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