SlideShare une entreprise Scribd logo
1  sur  14
Télécharger pour lire hors ligne
MongoDB를 모바일
게임 개발에 사용
티쓰리엔터테인먼트
모바일 1팀
공통 기술 개발팀
최흥배 과장
 일본의 사이버에이전트 사의 사례
http://www.cyberagent.co.jp/
http://ameblo.jp/principia-ca/entry-10983188853.html
 아메바 블로그로 유명 http://www.ameba.jp/
MongoDB를 사용한 이유
 개발 효율 향상
모바일 게임은 단 기간에 개발해야 한다.
그러나 게임은 특성상 자주 변경이 발생한다.
스키마레스의 MongoDB는 데이터 구조 변경에 유연하게 대응 할 수 있다.
 신기능, 변경 릴리스 대응
모바일 게임은 주에 3,4회 릴리즈 하는 경우가 대다수이다.
그러나 컬럼 추가나 인덱스 추가를 온라인 상태에서 할 수 없으므로 점검이 필
요하게 된다.
MongoDB를 사용하면 점검이 하지 않고 추가가 가능하다.
 유연한 쿼리, 인덱스
계층 구조화한 문서 내부에도 인덱스를 확장할 수 있다.
KVS로도 이용 할 수 있어서 유연한 쿼리 검색을 할 수 있어서 매력적이다.
 초기 비용이 작고, 확장성을 보장
ReplicaSets(비동기 레플리케이션)과 Sharding(자동 데이터 분산)을 제공하고 있
음.
시스템 구성
서버 구성은 Web-App 서버 2대, token이나 정보 캐시용 memcached 2대, Mon
goDB 3대로 총 7대.
MongoDB는 ReplicaSets 구성으로 primary에 쓰기를 하고, 2대의 secondary에
서 읽기.
Sharding을 하지 않은 이유
 서버 대수가 필요하게 되어 비용이 증가하기 때문
 ReplicaSets을 3세스(3X3대), mongos 서버, config 서버가 필요하기 때문에 총
11대 필요하게 된다
만약 여유분까지 생각하면 더 필요하다
 미리 준비하는 것 보다 상황을 봐서 필요하게 될 때 투입하는 것이 좋다고 판단
문서 설계
 RDBMS와 달리 NoSQL에서는 정규화는 추천 되지 않는다
 데이터를 분할하지 않고 문서로 보존하는 쪽이 데이터가 같은 장소에 보존 되어
서버간 통신 횟수도 줄여준다
 문서 설계가 가장 중요하고, 가장 힘들다
 문서 설계에서는 'modifier 오퍼레이션'과 '데이터 배열에 의한 유지'를 유효하게
사용할 수 있는 설계로 변경한다
 또 이미지 바이너리 데이터의 캐시를 MongoDB에 하여 데이터 획득과 캐시 획
득을 한번 하도록 한다
modifier 오퍼레이션
 모바일 게임에서는 레벨업이나 경험치 증가 등 increment 조작이 빈번하게 일어
난다
 이것을 modifier 오퍼레이션을 이용하여 쉽게 대응할 수 있다
db.userStatus.findOne({"userId" : 2013001})
{
"_id" : ObjectId("4d82e95a7a92571409f258dd"),
"battery" : 80,
"point" : 10000,
"smile" : 82,
"sumModel" : 41,
"sumPicture" : 22451,
"sumSales" : 1250,
"userId" : 2013001
}
db.userStatus.findOne({"userId" : 2013001})
{
"_id" : ObjectId("4d82e95a7a92571409f258dd"),
"battery" : 70,
"point" : 10000,
"smile" : 82,
"sumModel" : 41,
"sumPicture" : 22452,
"sumSales" : 1250,
"userId" : 2013001
}
밧데리를 10 소비하고 사진 촬영을 한 경우
-> db.userStatus.update({"userId" : 2013001},{$inc : {"battery" : -
10,"sumPicture":1}})
modifier 오퍼레이션은 계층구조라도 atomic한 조작을 할 수 있다
area2의 퀘스트를 완료하여 레벨이 올라가서 'questlevel'과 'area2'의 숫자를 증
가하는 경우는 아래와 같다
db.user.quest.findOne()
{
"_id" : ObjectId("4e42208e97ed78c7a7f2f738"),
"userId" : 2013001,
"questLevel" : 4,
"quest" : {
"area1" : 3,
"area2" : 1,
"area3" : 2
}
}
db.user.quest.update({userId:2013001},{$inc : {questLevel:1,"quest.area2":1}})
db.user.quest.findOne()
{
"_id" : ObjectId("4e42208e97ed78c7a7f2f738"),
"userId" : 2013001,
"questLevel" : 5,
"quest" : {
"area1" : 3,
"area2" : 2,
"area3" : 2
}
}
데이터를 배열로 유지
 유저가 모델 촬영을 한 정보를 가지는 컬렉션을 만든다
 1명의 모델(modelId)가 복수의 area에 출현하기 때문에 모델의 상태(mcId)에 의
해 컴플리트 한지(compFlg), 거들떠 보았는지(talkFlg)를 배열로 유지한다
 이 데이터는 참조가 많기 때문에 userId와modelId를 key로서 얻을 수 있는 것이
장점이 된다
새로운 area에서 modelId:180 이라는 사람과 만난 경우 modelDetails 배열에 데
이터를 추가한다
db.user.model.update({"userId" : 1022962,"modelId" : 180},{$push :
{"modelDetails" : {"compFlg" : 0,"talkFlg" : 0,"mcId" : 200}}})
{
"_id" : ObjectId("4d7dcbe97ccbb19ad8ac09b9"),
"modelId" : 180,
"modelDetails" : [
{
"compFlg" : 0,
"talkFlg" : 1,
"mcId" : 188
},
{
"compFlg" : 0,
"talkFlg" : 1,
"mcId" : 189
},
{
"compFlg" : 0,
"talkFlg" : 0,
"mcId" : 200
}
],
"userId" : 1022962,
"telFlg" : 0,
"status" : 0
}
이미지 바이너리 데이터 보존
 게임 내에서 만들어진 잡지는 유저가 조작한 타이틀 이미지와 촬영한 모델 이미
지를 합성하여 만든다
 이미지를 읽을 때 발생하는 오버헤드를 줄이기 위해서 MongoDB에 이미지 바
이너리 데이터를 보존한다.
한번의 요청으로 필요한 데이터를 얻을 수 있다
db.user.edit.find({userId:3})
{
"_id" : ObjectId("4d8c77694ca814174e7e3854"),
"color" : "RED",
"companyDetailId" : NumberLong(0),
"companyId" : NumberLong(0),
"coverId" : "4d8c7ebd4ca85714cc7e3854",
"font" : 1,
"imgData" : BinData(2,"AAAAAA=="),
"mcId" : 184,
"nextVolImgData" : BinData(2,"YgYAAIlQTkc--省略--
AAElFTkSuQmCC"),
"picId" : 7,
"scl" : 100,
"status" : 2,
"time" : "Thu Jan 01 1970 09:00:00 GMT+0900 (JST)",
"titleImg" : BinData(2,"CwoAAIlQTkcNChoKA--省略--
AAAAAABJRU5ErkJggg=="),
"userEditDetailList" : [ ],
"userId" : 3,
"x" : 0,
"y" : 0
}

Contenu connexe

Tendances

홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
Seungjae Lee
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
 

Tendances (20)

[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
 
webservice scaling for newbie
webservice scaling for newbiewebservice scaling for newbie
webservice scaling for newbie
 
인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례
 
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
 
신입 개발자 생활백서 [개정판]
신입 개발자 생활백서 [개정판]신입 개발자 생활백서 [개정판]
신입 개발자 생활백서 [개정판]
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
 
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 

En vedette

ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
흥배 최
 

En vedette (10)

MongoDB World 2015 - A Technical Introduction to WiredTiger
MongoDB World 2015 - A Technical Introduction to WiredTigerMongoDB World 2015 - A Technical Introduction to WiredTiger
MongoDB World 2015 - A Technical Introduction to WiredTiger
 
Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]
 
NLog 소개
NLog 소개NLog 소개
NLog 소개
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
 
iFunEngine: 30분 만에 게임 서버 만들기
iFunEngine: 30분 만에 게임 서버 만들기iFunEngine: 30분 만에 게임 서버 만들기
iFunEngine: 30분 만에 게임 서버 만들기
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
 
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
 
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
 
RESTful API 제대로 만들기
RESTful API 제대로 만들기RESTful API 제대로 만들기
RESTful API 제대로 만들기
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 

Similaire à MongoDB 모바일 게임 개발에 사용

모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
Dae Kim
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
cranbe95
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
Jeongsang Baek
 

Similaire à MongoDB 모바일 게임 개발에 사용 (20)

[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji DonghyunCoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수
200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수
200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수
 
100만 달러짜리 빠른앱 만드는 비법
100만 달러짜리 빠른앱 만드는 비법100만 달러짜리 빠른앱 만드는 비법
100만 달러짜리 빠른앱 만드는 비법
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
 
What's new in IE11
What's new in IE11What's new in IE11
What's new in IE11
 
[E-commerce & Retail Day] 인공지능서비스 활용방안
[E-commerce & Retail Day] 인공지능서비스 활용방안[E-commerce & Retail Day] 인공지능서비스 활용방안
[E-commerce & Retail Day] 인공지능서비스 활용방안
 
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
 
Meteor IoT
Meteor IoTMeteor IoT
Meteor IoT
 
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
 
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
 
MEAN Stack 기반 모바일 서비스 개발 overview
MEAN Stack 기반 모바일 서비스 개발 overviewMEAN Stack 기반 모바일 서비스 개발 overview
MEAN Stack 기반 모바일 서비스 개발 overview
 
[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습
 
프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트 프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트
 
Redis
RedisRedis
Redis
 
GraphQL in Action - REST와 이별할 때 생각해야 하는 것들
GraphQL in Action - REST와 이별할 때 생각해야 하는 것들GraphQL in Action - REST와 이별할 때 생각해야 하는 것들
GraphQL in Action - REST와 이별할 때 생각해야 하는 것들
 
[Pgday.Seoul 2019] Advanced FDW
[Pgday.Seoul 2019] Advanced FDW[Pgday.Seoul 2019] Advanced FDW
[Pgday.Seoul 2019] Advanced FDW
 

Plus de 흥배 최

KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
흥배 최
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
흥배 최
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
흥배 최
 
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
흥배 최
 
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
흥배 최
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
흥배 최
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
흥배 최
 
[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index
흥배 최
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
흥배 최
 
MinWin에 대해서
MinWin에 대해서MinWin에 대해서
MinWin에 대해서
흥배 최
 

Plus de 흥배 최 (20)

Bash on Ubuntu on Windows
Bash on Ubuntu on WindowsBash on Ubuntu on Windows
Bash on Ubuntu on Windows
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Wtl 개요와 설치
Wtl 개요와 설치Wtl 개요와 설치
Wtl 개요와 설치
 
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
닷넷 Apache avro
닷넷 Apache avro닷넷 Apache avro
닷넷 Apache avro
 
Mongodb 관리
Mongodb 관리Mongodb 관리
Mongodb 관리
 
Mongodb 개발 포인트
Mongodb 개발 포인트Mongodb 개발 포인트
Mongodb 개발 포인트
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
 
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
 
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 
[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
 
[Final]조진현 direct write
[Final]조진현 direct write[Final]조진현 direct write
[Final]조진현 direct write
 
MinWin에 대해서
MinWin에 대해서MinWin에 대해서
MinWin에 대해서
 

Dernier

Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
Wonjun Hwang
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
Wonjun Hwang
 

Dernier (6)

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 

MongoDB 모바일 게임 개발에 사용

  • 1. MongoDB를 모바일 게임 개발에 사용 티쓰리엔터테인먼트 모바일 1팀 공통 기술 개발팀 최흥배 과장
  • 2.  일본의 사이버에이전트 사의 사례 http://www.cyberagent.co.jp/ http://ameblo.jp/principia-ca/entry-10983188853.html  아메바 블로그로 유명 http://www.ameba.jp/
  • 3. MongoDB를 사용한 이유  개발 효율 향상 모바일 게임은 단 기간에 개발해야 한다. 그러나 게임은 특성상 자주 변경이 발생한다. 스키마레스의 MongoDB는 데이터 구조 변경에 유연하게 대응 할 수 있다.  신기능, 변경 릴리스 대응 모바일 게임은 주에 3,4회 릴리즈 하는 경우가 대다수이다. 그러나 컬럼 추가나 인덱스 추가를 온라인 상태에서 할 수 없으므로 점검이 필 요하게 된다. MongoDB를 사용하면 점검이 하지 않고 추가가 가능하다.  유연한 쿼리, 인덱스 계층 구조화한 문서 내부에도 인덱스를 확장할 수 있다. KVS로도 이용 할 수 있어서 유연한 쿼리 검색을 할 수 있어서 매력적이다.  초기 비용이 작고, 확장성을 보장 ReplicaSets(비동기 레플리케이션)과 Sharding(자동 데이터 분산)을 제공하고 있 음.
  • 4. 시스템 구성 서버 구성은 Web-App 서버 2대, token이나 정보 캐시용 memcached 2대, Mon goDB 3대로 총 7대. MongoDB는 ReplicaSets 구성으로 primary에 쓰기를 하고, 2대의 secondary에 서 읽기.
  • 5. Sharding을 하지 않은 이유  서버 대수가 필요하게 되어 비용이 증가하기 때문  ReplicaSets을 3세스(3X3대), mongos 서버, config 서버가 필요하기 때문에 총 11대 필요하게 된다 만약 여유분까지 생각하면 더 필요하다  미리 준비하는 것 보다 상황을 봐서 필요하게 될 때 투입하는 것이 좋다고 판단
  • 6. 문서 설계  RDBMS와 달리 NoSQL에서는 정규화는 추천 되지 않는다  데이터를 분할하지 않고 문서로 보존하는 쪽이 데이터가 같은 장소에 보존 되어 서버간 통신 횟수도 줄여준다  문서 설계가 가장 중요하고, 가장 힘들다  문서 설계에서는 'modifier 오퍼레이션'과 '데이터 배열에 의한 유지'를 유효하게 사용할 수 있는 설계로 변경한다  또 이미지 바이너리 데이터의 캐시를 MongoDB에 하여 데이터 획득과 캐시 획 득을 한번 하도록 한다
  • 7. modifier 오퍼레이션  모바일 게임에서는 레벨업이나 경험치 증가 등 increment 조작이 빈번하게 일어 난다  이것을 modifier 오퍼레이션을 이용하여 쉽게 대응할 수 있다
  • 8. db.userStatus.findOne({"userId" : 2013001}) { "_id" : ObjectId("4d82e95a7a92571409f258dd"), "battery" : 80, "point" : 10000, "smile" : 82, "sumModel" : 41, "sumPicture" : 22451, "sumSales" : 1250, "userId" : 2013001 }
  • 9. db.userStatus.findOne({"userId" : 2013001}) { "_id" : ObjectId("4d82e95a7a92571409f258dd"), "battery" : 70, "point" : 10000, "smile" : 82, "sumModel" : 41, "sumPicture" : 22452, "sumSales" : 1250, "userId" : 2013001 } 밧데리를 10 소비하고 사진 촬영을 한 경우 -> db.userStatus.update({"userId" : 2013001},{$inc : {"battery" : - 10,"sumPicture":1}})
  • 10. modifier 오퍼레이션은 계층구조라도 atomic한 조작을 할 수 있다 area2의 퀘스트를 완료하여 레벨이 올라가서 'questlevel'과 'area2'의 숫자를 증 가하는 경우는 아래와 같다 db.user.quest.findOne() { "_id" : ObjectId("4e42208e97ed78c7a7f2f738"), "userId" : 2013001, "questLevel" : 4, "quest" : { "area1" : 3, "area2" : 1, "area3" : 2 } } db.user.quest.update({userId:2013001},{$inc : {questLevel:1,"quest.area2":1}}) db.user.quest.findOne() { "_id" : ObjectId("4e42208e97ed78c7a7f2f738"), "userId" : 2013001, "questLevel" : 5, "quest" : { "area1" : 3, "area2" : 2, "area3" : 2 } }
  • 11. 데이터를 배열로 유지  유저가 모델 촬영을 한 정보를 가지는 컬렉션을 만든다  1명의 모델(modelId)가 복수의 area에 출현하기 때문에 모델의 상태(mcId)에 의 해 컴플리트 한지(compFlg), 거들떠 보았는지(talkFlg)를 배열로 유지한다  이 데이터는 참조가 많기 때문에 userId와modelId를 key로서 얻을 수 있는 것이 장점이 된다
  • 12. 새로운 area에서 modelId:180 이라는 사람과 만난 경우 modelDetails 배열에 데 이터를 추가한다 db.user.model.update({"userId" : 1022962,"modelId" : 180},{$push : {"modelDetails" : {"compFlg" : 0,"talkFlg" : 0,"mcId" : 200}}}) { "_id" : ObjectId("4d7dcbe97ccbb19ad8ac09b9"), "modelId" : 180, "modelDetails" : [ { "compFlg" : 0, "talkFlg" : 1, "mcId" : 188 }, { "compFlg" : 0, "talkFlg" : 1, "mcId" : 189 }, { "compFlg" : 0, "talkFlg" : 0, "mcId" : 200 } ], "userId" : 1022962, "telFlg" : 0, "status" : 0 }
  • 13. 이미지 바이너리 데이터 보존  게임 내에서 만들어진 잡지는 유저가 조작한 타이틀 이미지와 촬영한 모델 이미 지를 합성하여 만든다  이미지를 읽을 때 발생하는 오버헤드를 줄이기 위해서 MongoDB에 이미지 바 이너리 데이터를 보존한다. 한번의 요청으로 필요한 데이터를 얻을 수 있다
  • 14. db.user.edit.find({userId:3}) { "_id" : ObjectId("4d8c77694ca814174e7e3854"), "color" : "RED", "companyDetailId" : NumberLong(0), "companyId" : NumberLong(0), "coverId" : "4d8c7ebd4ca85714cc7e3854", "font" : 1, "imgData" : BinData(2,"AAAAAA=="), "mcId" : 184, "nextVolImgData" : BinData(2,"YgYAAIlQTkc--省略-- AAElFTkSuQmCC"), "picId" : 7, "scl" : 100, "status" : 2, "time" : "Thu Jan 01 1970 09:00:00 GMT+0900 (JST)", "titleImg" : BinData(2,"CwoAAIlQTkcNChoKA--省略-- AAAAAABJRU5ErkJggg=="), "userEditDetailList" : [ ], "userId" : 3, "x" : 0, "y" : 0 }