자동 확장 가능한 모바일 게임 서버 구축하기

이재홍 http://www.pyrasis.com 2014.03.24 ~ 2014.06.30

이번에는 인터넷 웹사이트가 아닌 게임 서버를 구축해보겠습니다. AWS는 웹사이트뿐만 아니라 게임 서버등 다양한 곳에 활용할 수 있습니다. 저는 지금까지 PC용 온라인 게임MMORPG와 모바일 게임을 개발해왔습니다. PC용 온라인 게임은 보통 TCP 프로토콜을 사용하며 자체적으로 패킷을 정의하여 사용합니다. 그리고 사용자층이 일정하고 예측이 가능한 장르라 대부분 클라우드 플랫폼을 사용하지 않습니다. 하지만 모바일 게임은 성공 여부를 예측하기 어렵고, 하루에도 최대 사용량과 최저 사용량의 격차가 크므로 요즘은 클라우드 플랫폼을 많이 사용하고 있습니다.

요즘 유행하는 모바일 게임은 일정한 패턴이 있습니다.

  • 퍼즐 또는 런(Run) 등 게임 방식이 간단하고 소셜 플랫폼을 활용한 순위형 게임
  • 카드나 캐릭터를 수집한 뒤 전투를 하는 게임
  • 자신의 요새나 성을 쌓고 서로 공격하는 게임
  • 자신의 소유물을 경영하는 게임
  • 스포츠 기반 수집 게임

모바일 게임의 서버 구성은 게임 기획에 따라 달라집니다. 모든 모바일 게임 형태에 대한 서버 구성을 설명하기에는 어려움이 있습니다. 그래서 모바일 게임 구축에 필수적인 요구사항들을 파악해보고 서버를 구축해보겠습니다.

모바일 게임의 요구사항을 정리해보면 다음과 같습니다.

  • 실시간으로 순위를 산출해야 한다.
  • 부분 유료화 아이템의 결제에 장애가 발생하면 안 된다.
  • 마케팅을 위한 로그를 저장해야 한다.
  • 사용자가 늘어났을 때 대비할 수 있어야 한다.

이제 요구사항에 맞게 사용할 AWS 리소스와 서비스 구조를 설계해보겠습니다.

  • 유저 정보, 게임 데이터, 결제 정보 저장은 안정성과 성능이 검증된 관계형 데이터베이스가 적합합니다. 특히 결제 정보는 정확성이 중요하므로 RDS에 MySQL을 사용하겠습니다. 사용자가 증가하면 DB 인스턴스 클래스를 변경하여 저장 용량을 늘리고, Read Replica와 다중 가용 영역(Multi-AZ) 복제를 사용하여 읽기/쓰기 성능을 높일 수 있습니다.
  • 앞에서 DynamoDB를 이용해서 전체 순위, 친구 순위를 산출해보았습니다 이번에는 ElastiCache의 Redis를 이용해서 순위를 산출해보겠습니다. Redis는 다양한 자료형을 지원하며 그중에 정렬에 특화된 자료형을 지원하기 때문에 실시간 순위 산출에 적합합니다. 또한, 사용자가 증가하면 캐시 노드 유형을 변경하여 저장 용량을 늘리고, Read Replica를 생성하여 읽기 성능을 높일 수 있습니다.
  • 결제 로그 및 각종 게임 로그 등 비정형 데이터를 저장할 때에는 NoSQL 데이터베이스인 DynamoDB가 적합합니다. DynamoDB는 원하는 대로 처리량을 높일 수 있으므로 사용자가 늘어났을 때 안정적으로 대응할 수 있습니다.
  • 게임 로직은 EC2 인스턴스를 사용하고, ELB와 Auto Scaling을 사용하여 부하를 분산하고, 게임 서버를 확장합니다.
  • 만약 구글 플레이나 애플 앱스토어를 통하지 않고 게임의 리소스(이미지, 사운드, 게임 데이터)를 부분적으로 업데이트하려면 S3와 CloudFront가 적합합니다.
  • 게임 서버를 회사 도메인의 서브 도메인으로 연결하려면 Route 53을 사용합니다.
  • 게임 서버의 소스 파일은 S3에 저장하겠습니다(GitHub, Bitbucket이나 자체 구축한 버전 관리 시스템 서버를 사용해도 됩니다).


그림 33-1 모바일 게임 서버 구성도

저는 프로젝트 이름은 ExampleGame으로 하고, 코드양을 줄이기 위해 Node.js에 JavaScript로 구현하겠습니다. 그리고 프로토콜은 HTTP를 기반으로 한 REST API 방식으로 하겠습니다. 실무에서는 각자 상황에 맞게 원하는 언어와 플랫폼을 사용하면 됩니다.

게임 서버에서 로그인과 세션 처리, 인증, 보안과 ExampleGame의 클라이언트를 구현하는 방법은 이 책의 주제를 벗어나므로 다루지 않겠습니다. 따라서 클라이언트 없이 가장 기본적인 기능만 구현하겠습니다.

  • 서버에 점수 보내기
  • 순위 산출하기
  • 아이템 구입하기
  • 로그 기록하기

REST
REST(Representational State Transfer)는 HTTP 메서드를 이용한 API 방식이며 요즘 많이 쓰고 있습니다. AWS의 API도 REST 방식이며 Facebook이나 기타 API들도 REST 방식을 사용하고 있습니다.

REST 방식을 따르는 API를 RESTful API라고 합니다.

리소스 GET PUT POST DELETE
http://example.com/resources 모든 아이템 목록 출력 모든 아이템을 다른 아이템으로 교체 새로운 아이템 생성 모든 아이템 삭제
http://example.com/resources/item10 개별 아이템 내용 출력 개별 아이템 내용 수정, 아이템이 없으면 생성 보통 사용되지 않음 개별 아이템 삭제

표 33-1 RESTful API 구조

예제 소스 코드는 저의 GitHub 저장소에서 받을 수 있습니다.
https://github.com/pyrasis/awsbook


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.