BLOG

Amazon DynamoDB: 게임 사용 사례 및 설계 패턴
작성일: 2019-04-15

 

게임 회사들이 게임 상태(game state), 플레이어 데이터, 세션 이력, 플레이어 순위표(leaderboards)를 비롯한 게임 플랫폼 전반에서 Amazon DynamoDB를 쓰고 있습니다. DynamoDB를 쓰면 사용자 수백만 명이 동시에 몰리고 사용자 요구(requests)가 쇄도해도 안정적으로 크기가 조정되는(scale) 동시에 대기 시간이 한 자릿수 밀리초(1000분의 1초)로 확실히 짧아집니다. 게임 회사들에게는 큰 이득이죠. DynamoDB는 모든 것이 관리되는 서비스로, 운영상 오버헤드(overhead)가 없습니다. 게임 개발자들은 데이터베이스를 관리하는 노고를 덜고 게임 개발에 집중할 수 있습니다. 게임 제작자들도 DynamoDB 전역 테이블(global table)로 다중 네트워크, 활성-활성(active-active) 데이터를 복제할 수 있습니다. 게임 제작자들도 AWS 단일 영역에서 여러 영역으로 확장할 길을 찾고 있습니다.

 

게임 회사들은 보통 DynamoDB를 어떻게 사용하고 있을까요? DynamoDB를 쓰는 게임 회사들의 설계 패턴에는 어떤 것들이 있을까요?

 

용어들

 

다음 데이터 모델링 용어들을 아시나요?

 

 

게임 사용 사례 및 설계 패턴

 

사용 사례 설계 패턴
게임 상태, 플레이어 데이터 저장소 1:1 모델링, 1:M 모델링
플레이어 세션 기록 데이터 저장소 1:1 모델링, 1:M 모델링
플레이어 순위표 N:M 모델링

 

사용 사례: 게임 상태 및 플레이어 데이터 저장소

 

DynamoDB를 이용해 플레이어 게임 상태 및 기타 플레이어 데이터를 저장하면 게임 회사는 접근(access) 지연 시간을 밀리초로 유지하면서 많은 수의 동시 플레이어를 수용할 수 있습니다. 등록 플레이어가 전 세계에 3억 명 이상인 대형 비디오 게임 회사 Electronic Arts(EA)는 어떨까요? EA는 사용자 요구를 초당 10만 건 이상 처리하고 일일 활성 사용자 수백만 명을 수용할 수 있을 때 동시성이 높다고 생각합니다. EA는 데이터베이스 MySQL 클러스터에서 DynamoDB로 마이그레이션해 비용을 90% 절감했습니다. EA는 게임 상태, 사용자 데이터 및 게임 인벤토리 데이터를 여러 테이블에 저장하기 위해 DynamoDB를 사용합니다. EA는 사용자 ID를 분할 키 및 기본 키(1:1 모델링 패턴)로 사용합니다.

 

PennyPop은 대규모 멀티플레이 온라인 역할극 게임(특히 판타지 문학에 나오는 모험 속 인물들을 연기해 보는 게임) Battle Camp를 만드는 회사입니다. PennyPop은 DynamoDB를 이용해 분당 요구(requests) 몇 건으로 Battle Camp를 시작했는데, 초당 요구 8만 건 이상으로 규모를 확대했습니다. DynamoDB는 모든 것이 관리되는 서비스이기 때문에 PennyPop의 소규모 개발팀은 운영에 힘을 쏟지 않고 게임 개발에 집중할 수 있습니다. MySQL 데이터베이스를 호스팅하고 샤딩하는 것과 비교할 때 PennyPop은 DynamoDB를 이용하면서 비용을 최소 절반 이상 줄였습니다. 사내에서 동일한 환경을 운영했다면 PennyPop은 운영 인력을 3명에서 6명으로 두 배 늘려야 했을 겁니다.

 

설계 패턴: DynamoDB에 데이터를 저장하려면 게임 회사는 플레이어 ID로 게임 상태 및 기타 플레이어 데이터를 분할하고 키 값 접근 패턴(1:1 모델링)을 이용해야 합니다. 보다 세부적인 접근이 필요한 경우, 이 게임 회사들은 정렬 키(1:M 모델링)를 사용합니다. 정렬 키를 사용하면 플레이어의 데이터 집합(컴퓨터상의 데이터 처리에서 한 개의 단위로 취급하는 데이터의 집합) 중 여러 속성들이나 부분 집합에 따로따로 접근하고 업데이트할 수 있습니다. 전체 데이터 집합을 검색할 필요가 없습니다. DynamoDB 트랜잭션 API를 이용하면 다양한 속성이 담긴 여러 항목들을 트랜잭션으로 업데이트할 수 있습니다. 비용을 줄이기 위해 사용자 데이터를 압축하는 회사들도 있는데요. PennyPop은 gzip로 플레이어 데이터를 압축하고 base64 문자열로 저장합니다. 그러면 플레이어 데이터가 원래 크기의 10%로 줄어듭니다.

 

사용 사례: 플레이어 세션 이력 데이터 저장소

 

게임 제작자는 DynamoDB에 세션 이력 및 시간 별로 데이터를 저장해 플레이어, 날짜, 시간 별로 데이터를 빠르게 조회합니다. 플레이어 세션 기록을 DynamoDB에 저장하는 회사로 리오트 게임(Riot Games)이 있습니다. 리오트 게임은 국제 무대에서 활동하며 매일 테라바이트 단위의 데이터를 생성하는 플레이어들에게 서비스를 제공합니다. 리오트 게임의 Player Support 팀은 플레이어들이 게임에서 사는 것들과 마지막으로 로그인한 시간 등 특정 플레이어에 대한 모든 정보를 신속하게 검색할 수 있습니다. 이전에는 이 데이터가 Vertica에 저장됐었는데, 분석하기에는 좋았지만 단일 키 검색에는 유용하지 않았습니다. 조회를 하는 데에도 보통 몇 분씩 걸렸습니다. 리오트 게임은 조회 작업에서 효율을 높이기 위해 DynamoDB를 사용하기로 했습니다. 모든 데이터를 Vertica에서 DynamoDB로 복사했습니다. DynamoDB에서 모든 사용자의 데이터와 기록이 나타나게 했습니다. 데이터를 빠른 속도로 조회하기 위해서였습니다. DynamoDB를 쓰면 몇 분이 걸리던 조회 시간을 1초도 안 걸리게 단축할 수 있습니다.

 

설계 패턴: 게임 회사들은 보통 플레이어 ID를 분할 키로 쓰고 마지막으로 로그인한 날짜와 시간을 정렬 키로 씁니다(1:M 모델링). 플레이어 세션 이력 및 시간 별 데이터를 DynamoDB에 저장하기 위해섭니다. 이 스키마(schema)로 게임 회사들은 각 플레이어의 데이터에 효율적으로 접근할 수 있습니다. 데이터에 접근할 때 게임 회사들은 플레이어 ID와 날짜, 시간을 이용합니다. 특정 날짜와 시간에 대한 단일 레코드 또는 특정 날짜와 시간에 대한 레코드 집합을 선택하도록 쿼리를 쉽게 맞춤화할 수도 있습니다.

 

사용 사례: 순위표

 

DynamoDB를 사용하면 게임 제작자들이 간단한 순위표(leaderboards)를 쉽게 지원할 수 있습니다. 게임에서 최고 점수를 표시할 수가 있는 것이죠. 게임 회사가 플레이어들의 최고 점수를 비롯한 게임 상태를 DynamoDB에 저장하면 글로벌 보조 인덱스(secondary index)를 활용해 최고 점수를 얻는 기능을 구현할 수 있습니다.

 

설계 패턴: 순위표는 플레이어 ID로 분할된 테이블과 글로벌 보조 인덱스로 구현할 수 있습니다. 플레이어 ID에는 플레이어들의 게임 상태가 저장돼 있습니다. 최상위 점수도 속성들 중 하나로 게임 상태에 해당됩니다. 인덱스는 게임 ID 또는 이름을 분할 키로 쓰고 최상위 점수 속성은 정렬 키(N:M 모델링)로 씁니다. DynamoDB Developer Guide의 Global Secondary Indexes section이 이 내용을 설명합니다.

 

요약

 

지금까지 게임 회사들이 가장 흔히 쓰는 DynamoDB 사용 사례와 설계 패턴을 살펴봤는데요. DynamoDB는 게임 애플리케이션에서 일반적으로 필요로 하는 많은 요구사항들을 맞춰줄 수 있습니다. 강력하게 끝까지 일관성을 유지하고, 다중 항목 ACID 트랜잭션(multi-item ACID transactions)과 원자 카운터(atomic counters)를 지원하고, DAX(DynamoDB Accelerator)로 메모리 안에서 캐싱(caching)하기 때문입니다.

 

AWS의 게임 설계 패턴에 대해 더 깊이 알고 싶다면 Introduction to Scalable gaming Patterns on AWS를 보세요. AWS에서 게임을 개발할 때 들어가는 추가 자원(resources)이 궁금하시다면 Amazon Game Tech가 도움이 될 겁니다. DynamoDB 포럼에서 새 스레드(하나의 주제에 대해 회원들이 게시란에 올린 일련의 의견)를 시작해보시는 것도 추천합니다

 

원문 URL : https://aws.amazon.com/ko/blogs/database/amazon-dynamodb-gaming-use-cases-and-design-patterns/

** 메가존클라우드 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.