SlideShare a Scribd company logo
중앙 서버 없는 게임 로직
<야생의 땅: 듀랑고>
0. 듀랑고의 서버
1. 실시간 동기화
2. 농사와 날씨
3. 협동 건설
4. 사유지
5. 부족
최호영
테크니컬 디자이너, 8년차 게임 프로그래머
중앙 서버 없는 게임 로직
야생의 땅: 듀랑고

Recommended for you

Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture

NCsoft의 NCDC 2010과 Nexon의 NDC 10에서 발표한 '차세대 MMORPG 서비스 아키텍처'의 발표 파일입니다.

nosqlmmorpggame server
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem

멀티플레이어 게임 동기화 이야기 (최종일관성, 서버 되감기, 결정성)

synccap theoremnetworking
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략

실시간 게임 서버 최적화 전략 C++ Korea group 2020년 2월 15일 미니 세미나.

game developmentwin32
“공룡시대야생환경에던져진현대인이되어,
로망있는생존,탐험,사냥,개척,사회건설을플레이하는
새로운체험의모바일MMORPG”비전
게 임 의
탐험, 개척
탐험의 매력은 이 세상의 모든 곳을 눈으로 확인하고 그곳에 발자국을 찍는 것
개척의 매력은 주인이 없는 거친 땅을 다듬어 나의 소유로 만드는 것
넓은 땅, 하나의 세계
되도록 넓은 땅을 유저에게 제공하고 싶다
어떤 유저든지 원한다면 서로 만날 수 있게 해주고 싶다
분산 서버
안정성과 부하의 분산을 위한 구조
부분적 장애가 전체 서비스에 영향을 주지 않음

Recommended for you

[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기

From NDC 2016 (2016.04.26)

테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템

game targeting systemmmorpg targetingtargeting
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...

서비스 런칭을 위해 라이온하트와 카카오게임즈가 어떻게 최적 성능의 인스턴스를 선택하고, Windows 운영 체제를 최적화하며, 왜 Amazon Aurora를 기본 데이터베이스로 채택하였는지를 설명합니다. 또한, 출시부터 운영까지의 과정에서 MMORPG가 어떻게 AWS 상에서 설계되고, 게임 서버 성능을 극대할 수 있었는지에 대해 전달해드립니다.

듀랑고의 서버
객체가 중심이 되는 서버
• 하나의 지역을 물리적인 서버가 담당하는 것은
땅의 크기가 서버의 성능에 의해 제한될 수 밖에 없다
• 서버가 어떤 지역을 담당하지 않는다
• 서버는 모종의 규칙에 의해 배정된 객체를 담당한다
최적화에 유리한 방향으로
객체
다른 서버의 객체

Recommended for you

NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기

〈야생의 땅: 듀랑고〉는 메인 DB로 Couchbase를 쓰고 있습니다. Couchbase에서 게임을 개발하면서 있었던 제약과 그 제약을 ��결하기 위한 방법들을 정리해 보았습니다.

nosqlcouchbasemmorpg
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조

게임 서버 개발을 다루는 대학 수업 과목의 수업 내용 중 하나를 공개합니다. 분산서버 개발에 대한 기초 내용을 다루고 있습니다.

게임서버
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
각 객체 시야
각 객체 시야의 합
다른 서버 객체의 환영
엄밀하게는 서버-서버간 차이가 아닌 서버-클라이언트간 차이지만 이해를 돕기 위해 가져옴
내가 움직임 ➔ 서버에서 처리해 준 결과

Recommended for you

임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기

쿠키런 서버를 1년동안 개발 및 운영해온 개발자의 이야기. 출시 전의 준비사항부터 출시 후 게임이 성공적인 궤도에 도달할 때 까지 주말을 반납하며 분투했던 개발자의 솔직한 심정과 후기를 들어본다.

ndc2014gamesserver
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기

자체 엔진 개발하기.

장점
서버에 소속된 객체의 시야 외에는 관심이 없어
전체 세계의 크기와 상관 없는 구조
➔ 이론적으로 무한한 크기의 세계를 표현 가능
특정 서버에 문제가 생겼을 때 재 접속하면
바로 그 위치에서 정상적인 플레이 가능
➔ 안정성의 향상
100 ㎢0.25 ㎢ 1 ㎢ 4 ㎢
836개의 섬
2016년 4월 LBT 기준
실시간 동기화
동기화
• 동기화가 잦을 수록 DB에 부담이 된다
• 동기화가 잦을 수록 패킷량이 늘어난다
• 지나치게 잦은 동기화는 최적화의 대상
• 하지만 플레이가 불가능하진 않다

Recommended for you

[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018

Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP

Windows 8 및 Windows Server 2012의 새로운 Network Extensions인 RIO에 대한 소개와 성능 평가, 그리고 샘플 코드입니다.

windows rionetwork extensionsiocp
분산 환경에서의 동기화
• 객체에서 환영으로 서버간 동기화가 이루어진다
• 같은 곳을 보는 서버가 많을 수록 N배 부담
• 동기화에서 느끼는 부담이 늘어났다
2015년 12월 LBT 1일차
• 오픈 직후는 괜찮은 듯 보임
• 접속자가 늘어나자 급격히 서버 랙 증가
• 모니터링 결과 엄청난 양의 동기화 감지
서버 지연의 원인
• 플레이어는 이동할 때마다 조금씩 에너지를 깎는다
• 깎을 때 마다 동기화가 발생한다
• 이동하는 모든 플레이어가 동기화를 유발
• 30명의 플레이어 기준으로 분당 약 10000회의 동기화를 시도
최적화
• 동기화 당 부하를 줄여보자
• serialize, deserialize를 가볍게 하기
• 최소한의 정보만 동기화
• 게임 로직 레벨의 최적화는 아닌 것 같다
동기화 자체를 줄여보자

Recommended for you

게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델

NHN NEXT 게임 서버 프로그래밍 강의 자료입니다. 최소한의 필요한 이론 내용은 질문 위주로 구성되어 있고 (답은 학생들 개별로 고민해와서 피드백 받는 방식) 해당 내용에 맞는 실습(구현) 과제가 포함되어 있습니다. 참고로, 서버 아키텍처에 관한 과목은 따로 있어서 본 강의에는 포함되어 있지 않습니다.

nhn next게임서버 프로그래밍
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

이 발표는 [야생의 땅: 듀랑고]의 지형 배포 시스템과 생태계 시뮬레이션 자동화 시스템에 대한 이야기를 다룹니다. 듀랑고의 각 섬은 크기와 지형, 기후 조건이 다양하고 섬의 개수가 많아서 수동으로 관리하는 것은 사실상 불가능합니다. 몇번의 사내 테스트와 베타 테스트를 거치면서 이러한 문제를 해결해주는 자동화된 도구의 필요성이 절실해졌고, 작년에 NDC에서 발표했던 생태계 시뮬레이터와 Docker, 그리고 아마존 웹서비스(AWS)를 이용하여 수많은 섬들을 자동으로 생성하고 관리하는 자동화 시스템을 구축하게 되었습니다. 그 과정에서 했던 고민들, 기존의 애플리케이션을 "Dockerizing" 했던 경험, AWS의 각 서비스들을 적절히 활용했던 이야기, AWS의 각 지역별 요금이 상이하다는 점을 이용해서 비용을 절감한 사례, 그리고 자동화 시스템의 문제점과 앞으로의 방향에 대해서 이야기 할 계획입니다.

ndc_16ndcnexon
회
회1
10
10초간 초당 -1일 때 동기화 횟수
1초마다 1씩 에너지를 감소시키는 방법
10초 동안 총 10의 에너지를 지속적으로 감소시키는 방법
➔ 아래 방법이 훨씬 효율적이다. 그런데 왜 잘 안쓰게 될까?
x N
x N
10 15 20 30 초
10초부터 10초간 초당 -10
15초부터 10초간 초당 +5
0초부터 ∞초간 초당 +1
이걸 언제 다 계산하고 있어
what-studio/gauge
https://github.com/what-studio/gauge
변화량을 입력하면 그래프 방식으로 데이터를 보여주는 라이브러리

Recommended for you

NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지
NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지
NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지

NDC 2015 - 이광영 모바일 게임에 밀도높은 MMO 전투를 허하라 : [야생의 땅: 듀랑고] 전투 시스템 개발 일지

게임game게임 디자인
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)

넥슨코리아 사내 발표자료로 왓 스튜디오에서 파이썬으로 《야생의 땅: 듀랑고》 서버를 비롯한 여러가지 도구를 만든 경험을 공유합니다. - 게임서버와 각종 툴, 테스트/빌드/배포 시스템을 만들 때 사용한 재료 - 파이썬 코드 품질 개선, 디버깅, 프로파일링, 최적화 - 파이썬 오픈소스 생태계와 왓 스튜디오가 하는 오픈소스 활동

python
Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러

PyCon KR 2015에서 Profiling에 대해 이야기 했습니다. [Profiling]: https://github.com/what-studio/profiling [발표 소개]: http://www.pycon.kr/2015/program/45

pythonpyconkr
그래프 동기화
(since, until, velocity),
(since, until, velocity),
(since, until, velocity),
…
(광고) what-studio/gauge를 이용하면 당신도 쉽게 그래프 동기화를 ...
그래프 동기화
• 추가적인 변화가 생기면 다시 동기화 해서 덮어 씌운다
• 현재 시각(at)을 넣으면 언제 어디서나 현재 값을 알 수 있다
10 15 20 30 초
15초부터 10초간 초당 +5
그래프 동기화를 쓸 때 주의할 점
until이 미정인 경우가 있다
➔ 움직이는 동안 에너지 소비
➔ 접속 중일 때만 피로도가 오름
끝나는 이벤트를 잡는데 실패하면 영원히 지속된다
변칙적 운용
until을 정해진 시간만큼 지정해 둔다
일정시간마다 until을 갱신한다
➔ 실수로 이벤트를 놓쳤다면 until만큼만 동작
언제 끝날지 모르는 이동중 에너지 소비 문제 해결
접속 중일 때만 증가해야 하는 피로도 문제 해결

Recommended for you

KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기

KGC 2016 강연자료

kgc2016kgcsupersocket
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화

창의적이고 고품질의 게임 개발 결과물을 낼 수 있게 돕는 조직 내부의 개방적 업무 문화에 대한 강연입니다. 강연자가 책임자로 몸담고 있는 왓 스튜디오가 &lt;야생의>를 만들면서 겪는 예시들을 들어서 설명합니다. 꿈과 열정에 기반한 자발적 업무 문화, 개인이 아닌 집단이 창의적인 결과물을 내게 일하는 방법, 지향점의 공유와 정렬, 효율적이고 개방적인 조직 구조, 의사소통에 쓰이는 수단들과 특성, 왓 스튜디오라는 집단이 굴러가며 &lt;야생의> 같은 독특한 게임을 만들어가는 시스템 등에 대한 소개가 있을 예정입니다.

stone soup창의성게임개발
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

이 발표는 넥슨의 신규 개발 게임인 듀랑고의 생태계에 대한 간략한 소개와 OpenCL 을 이용한 병렬 처리에 관한 전반적인 기술적 내용을 다룹니다. 게임 속의 세계에서 지형과 기후, 지질 조건에 맞게 여러 종류의 식물과 광물들을 알맞은 곳에 배치시키는 것이 생태계 시뮬레이터의 역할인데, 이 시뮬레이터는 방대한 양의 계산을 수행합니다. 초기에 만들어진 프로토타입은 이러한 계산을 수행하는데 30분이 넘게 걸렸지만, 병렬처리, 알고리즘 시간복잡도 개선 등의 여러가지 방법들을 통해 그 시간을 11초까지 단축시켰습니다. 구체적으로 어떤 방법들을 시도했었고, 어떤 방법들이 효과가 있었는지 여러분과 그 경험담을 공유하고자 합니다.

cudacsrmatrix
가까운 미래의 예측
수치의 지속적인 증감
상태 효과로 인한 일시적인 변화
일정시간 동안 모션의 변화
• 언제부터(since) 언제까지(until) 변화가 지속될 지가 명확하다
• 변화를 매 순간 계산하지 말고 미리 예측하여 추이 자체를 동기화하자
플레이어 30명의 분당 동기화 횟수
이동 중 에너지 감소 문제 수정 후
5약 배 절약
1차와 2차 LBT의 서버 비용 차이
물론 다른 개선 요소들도 반영된 결과긴 하지만…
약10000회 ➔ 1000회 이하
농사와 날씨
신기루
자연물과 건축물은
눈에만 보이고 실체가 없다

Recommended for you

아키에이지 원정대 구성_전략
아키에이지 원정대 구성_전략아키에이지 원정대 구성_전략
아키에이지 원정대 구성_전략
232 deview2013 oss를활용한분산아키텍처구현
232 deview2013 oss를활용한분산아키텍처구현232 deview2013 oss를활용한분산아키텍처구현
232 deview2013 oss를활용한분산아키텍처구현

The document summarizes topics related to distributed and scalable server architecture. It discusses consistent hashing for load balancing across servers, using ZooKeeper as a distributed coordinator to manage server nodes, and implementing a reverse proxy server in Vert.x. It also covers shared data management using Redis clusters, building modular applications, and managing large numbers of connections.

Redux vs Alt
Redux vs AltRedux vs Alt
Redux vs Alt

Quick introduction into react and flux followed by a comparison of redux and alt flux frameworks and a simple hello world application implemented in each of them. Last two slides present a microservices approach to client side applications as one of approaches how to make transitions between frameworks easier.

reactfluxcomparison
신기루 그리드
사과나무
갈대 갈대
갈대 갈대물물
물
자연물은 위치와 종류만 저장
건축물은 외형 패킷을 패킹하여 저장
신기루의 실체화
신기루와 인터랙션을 하는 순간 실체화
자연물은 아무도 건드리지 않았을 땐 DB에도 존재하지 않는다
신기루의 장점
실체화 한 뒤에 일정 시간이 지나도록 인터랙션이 없으면 다시 신기루화
➔ 메모리 사용량을 최소화
움직이지 않는 객체들도 주변 움직임에 관심을 가지고 있음
➔ 메모리에 있지 않으면 관심이 없어지므로 동기화 비용 감소
시간이 변하면 외형이 변하는 것들
외형이 전부 캐싱 되어있기 때문에 난감한 경우가 있다
• 불타버린 모닥불
• 내구도가 다된 건축물
• 다 자란 작물
• 외형 캐시에 만료 시간을 넣자
• 만료 시간이 지난 캐시는 버리고 DB에서 정보를 불러와 새로 생성한다

Recommended for you

ProudNet 1.7 소개
ProudNet 1.7 소개ProudNet 1.7 소개
ProudNet 1.7 소개

프라우드넷 1.7에 추가된 기능에 대한 소개자료입니다. Wi-fi와 LTE를 왔다갔다해도 연결이 안 끊어지는 기능과 리눅스 지원 등 여러가지를 소개합니다.

게임서버
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용
mongodb
웹서버와 프라우드넷 서버간 상호작용 가이드
웹서버와 프라우드넷 서버간 상호작용 가이드웹서버와 프라우드넷 서버간 상호작용 가이드
웹서버와 프라우드넷 서버간 상호작용 가이드

웹서버 등 여타 서버와 프라우드넷 서버간 상호작용의 예와 방법을 간략히 소개합니다.

game server
• 해당 객체를 보고 있는 모든 서버에서 각자 알아서 처리
• 외형 캐시가 교체되면 연결되어있는 클라이언트들에게 전송
농사
70%토양 적합성
• 작물이 성공적으로 자랄 확률은 유저의 행동에 의해서 결정됨
• 하지만 각 처리를 서버에서 하기 때문에 서버마다 결과가 달라질 수 있다
70% 70% 70% 70%
!?
결정론적 작물
언제 어디서 결과를 확인하더라도 같은 결과가 나와야 한다
작물이 다 자라는 시각을 랜덤 시드로 하여 결과를 판별한다
Random(성장 완료 시각).random() = 0.751
0.751 ➔ 성공
70% 70% 70% 70%
0.751 ➔ 성공 0.751 ➔ 성공 0.751 ➔ 성공

Recommended for you

Unity에서 회전하는 cube 만드는 법
Unity에서 회전하는 cube 만드는 법Unity에서 회전하는 cube 만드는 법
Unity에서 회전하는 cube 만드는 법

유니티의 Hello World 쯤 될라나요...

unity3d
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민

프라우드넷의 WiFi &lt;=> 4G 전환시 연결이 유지되게 하는 기능과 P2P 네트워킹 기능에 대한 소개

프라우드넷의 IL2CPP 적응 기록-정종채
프라우드넷의 IL2CPP 적응 기록-정종채프라우드넷의 IL2CPP 적응 기록-정종채
프라우드넷의 IL2CPP 적응 기록-정종채

유니티엔진의 iOS 64bit는 Mono 대신 IL2CPP를 씁니다. 그런데 IL2CPP는 (계속 해결되고는 있지만 있지만) 기존 코드 호환성에 제약이 있습니다. 프라우드넷 내부는 이를 어떻게 해결하고 있는지 소개합니다.

결정론적 날씨
같은 지역이면 어떤 서버에서도 같은 날씨여야 한다
다른 시간대면 랜덤하게 다른 날씨일 수 있다
Random(지리적 위치 + 현재 시각 / 날씨 변화 주기).random()
➔ 시기적으로 랜덤이지만 지리적으로는 언제나 같은 결과를 얻어온다
협동 건설
개척, 건설
건설은 개척의 핵심 요소
여럿이 모여 마을을 이루고
사회를 이룬다
건설
현실 속에서 건설은 제작/채집보다 훨씬 오래 걸리는 일
빠른 건설 허용은 난개발을 가져온다
시간은 어느정도 길게 하지만 협동을 통해서 극복할 수 있게 하고 싶다

Recommended for you

라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성

2016년 3월 게임코디 게릴라 컨퍼런스(GCGC)에서 발표된 내용입니다.

KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론

분산 서버 설계는 원리 이해가 중요하다. 이를 모르고서는 잘못된 설계로 인해 고생은 고생대로 하고 결과는 결과대로 나쁠 수 있다. 본 강연에서는 분산 게임 서버 구조를 짜기 전에 반드시 이해해야 하는 원리를 설명한다.

game server
야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계
야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계
야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계

2015년 NDC에서 발표한 내용입니다. 야생의 땅 듀랑고에서 샌드박스 MMO 월드에 서버 CPU자원을 효율적으로 사용하는 시뮬레이션을 추가하기 위한 디자인 전략과, 샌드박스 MMO의 하드코어함을 완화하기 위한 부동산 정책 디자인에 대한 내용이 있습니다.

durangogame design듀랑고
원기옥의 프로토타입
누군가가 건설을 시작하면 동료들이 옆에서 같이 건설을 한다
여러 명의 건설력을 합하여서 완성하는 속도가 빨라진다
원기옥 시스템에 숨어있는 피쳐들
건설할 때는 지속적으로 에너지가 감소
건설할 때는 지속적으로 도구의 내구도가 감소
오래 걸리는 작업이므로 잠시 접속을 끊어도 건설은 계속 진행되도록
쉬운, 그러나 할 수 없는 방법
루프를 돌면서
➔ 도구의 내구도를 깎고
➔ 플레이어의 에너지를 소모한 후에
건설의 진행도를 올린다
✘ 간단하지만 장시간 루프를 돌려줄 주체가 없다
✘ 루프를 통해서 완성도를 올리는 방법은
지속적인 동기화를 유발하기 때문에 최적화면에서 좋지 않다
여러 개의 서버가 동시에 관여 중
그래프 동기화의 활용
건설력 ➔ velocity
도구의 내구도 + 남은 에너지 ➔ until
✔ 진행을 처음부터 끝까지 그래프로 나타낼 수 있다
✔ 참여자가 새로 참여할 때 마다 그래프를 새로 그리면 되...겠죠?

Recommended for you

NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들

Nexon Developers Conference 2016 에서 발표한 자료입니다. * 발표자 소개 * &lt;플레로>에서 &lt;에브리타운>의 개발 및 라이브 서비스를 담당하고 있는 경력 12년 차 기획자 겸 PD입니다. NDC 2014 에서 &lt;엄마와>으로 발표한 이력이 있으며, 이후로 약 2년간 -론칭 후 기간으로는 약 3년간- 라이브 서비스를 지속시킨 경험으로 얻은 (NDC 2014에서 발표한 내용과는 또 다른) 것들을 NDC 2016을 통해 공유하고자 합니다. * 세션소개 * 우리는 대개 '론칭'을 목표로 한 게임 개발/사업에만 집중합니다. 그러나 매우 잘 만든 게임들이 성공적인 론칭 이후 서비스 단계에서의 미스로 기대만큼의 성적을 거두지 못하는 경우가 종종 발생하는데, 이는 '론칭 이전의 게임 개발'과 '론칭 이후의 게임 개발'이 개념적으로 전혀 다르다는 것을 증명합니다. 론칭 이후의 게임 개발, 즉 '라이브 서비스'는 아무리 개발 부서의 실력이 뛰어나다 하더라도 개발 外 부서와의 시너지가 없다면 성공적으로 이어가기가 매우 어려우며, 그중에서도 특히 사업부서와 개발부서의 협업에 대한 중요성은 아무리 강조해도 지나치지 않습니다. 하지만 남녀관계가 흔히 '서로 다른 별에서 온 사람들'로 비유되듯, 두 부서 사이에는 많은 애로사항이 있으며 심지어 서로 간의 갈등의 골이 깊은 경우도 있습니다. 이 세션에서는 약 3년이라는 짧지 않은 시간 동안 비교적 성공적인 라이브 서비스를 지속해 온 '에브리타운 for kakao'의 사례를 통해, 무탈한 라이브 서비스를 위한 개발부서와 사업부서 간의 협업 방식과 그 필요성, 그리고 시너지를 내기 위한 노하우 등을 공유하고자 합니다.

ndc_2016ndc16ndc_16
멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면

코딩 소림사 정기 세미나

devops
NDC17 장창완(최종)
NDC17 장창완(최종)NDC17 장창완(최종)
NDC17 장창완(최종)

<마비노기 영웅전>의 사례에 기반하여 다음의 내용을 설명합니다. 1. 국내 및 해외에서 라이브 서비스 중에 발생하는 작업장 이슈에 대응하기 위해서 실시간 로그 수집 프로세스를 구축하면서 고민하였던 내용과 2. 수집한 로그 데이터를 활용하여 온라인 액션 게임에서 캐릭터 애니메이션 패턴간의 유사도(TF-IDF, Cosine Similarity)를 분석하여 현업 실무의 어뷰징 탐지에 활용한 사례를 공유합니다. 라이브 서비스 환경에서 국내 및 해외의 실시간 로그 수집에 대해서 고민하시는 개발자나 온라인 게임에서의 봇탐지에 관심있는 분석가들에게 유용한 사례를 소개해드릴 수 있을 것으로 생각합니다.

참여자 중 한 명이 참여를 중단
➔ 완성이 더 늦어짐
➔ 남은 참여자의 에너지 소모와, 도구의 내구도 소모가 늘어남
➔ 모두의 에너지 소비 그래프와 내구도 소모 그래프를 다시 그린다
모든 참여자의 에너지 소비 그래프와 내구도 소비 그래프를 다시 그린다
➔ 다시 그리는 중에 누가 또 나가면?
➔ 다시 그리던거 마무리 하고, 또 ... 다시 그린다...
➔ 근데 참여자 중 한명이 오프라인이라면?
무엇이 혼란한가?
분산된 환경에서는 객체들이 다른 프로세스에 흩어져 있다
행동의 여파가 여러 객체에 동시에 영향을 주는 경우 적용에 시간이 걸린다
그 행동이 동시에 여러 곳에서 요청이 온다면?
심지어 메모리에 올라와 있지도 않은 객체가 포함되었다면?
디자인 방향의 선회
✘ 건설하는 동안 플레이어의 행동을 제한한다
✘ 게임 진행의 흐름을 끊는다
➔ 모바일 게임의 특성과 맞지 않다
앞에 붙어서 건설을 하는 시간 자체는 짧게
하지만 협동의 느낌은 나게

Recommended for you

Agile의 의미와 Agile 계획 수립(Gdc2007)
Agile의 의미와 Agile 계획 수립(Gdc2007)Agile의 의미와 Agile 계획 수립(Gdc2007)
Agile의 의미와 Agile 계획 수립(Gdc2007)

GDC 2007에서 있었던 Agile Game Development Tutorial의 일부인 'Agile의 의미'와 'Agile 계획 수립'의 한글 번역입니다: 강연자는 Mike Cohn으로, '사용자 스토리'와 'Agile Estimating and Planning'의 저자입니다. Agile 개발에서 (사용자 스토리의) 일정을 추정하는 방법에 대해서 다루고 있습니다. 자세한 것은 http://betterways.tistory.com/177 참조

[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템

본 세션에서는 Protocol:hyperspace Diver의 개발 과정 전반에 대한 포스트 모템을 수행하며 기획적인 부분을 바탕으로 제기된 요구사항에 대응하기 위한 기술적인 이슈에 어떻게 대응하였는지를 살펴볼 예정입니다. 게임을 기획하며 게임에 어떤 기능들이 요구되었으며, 엔진 레벨에서부터 모바일 게임을 개발하는 과정에서 이런 요구사항들에 어떻게 대응하였는지를 살펴봅니다. 게임을 위한 전체적인 설계 및 문제 해결 전략과 각각의 문제 해결 과정에서 세부 내용에 대한 기술적 노하우를 공유합니다.

How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance

Remove SPOF, Using coordinator, Using object storage, circuit breaker, blue/green, canary, feature flag

개선된 원기옥
1명이 건설 (짧은 시간)
➔ 건축물이 완성되기를 기다림 (긴 시간)
➔ 친구가 ‘도와주기’를 하면 기다리는 시간 감소
➔ 정해진 시간이 지나면 완성
✔ 실제 앞에 붙어있어야 하는 시간이 짧다
✔ 비 동기적인 액션으로 동료가 완성 시간을 줄여줄 수 있다
동시에 여러 객체를 변조하는 일은 회피하자
2개 이상의 객체에 동시에 영향을 주는 작업은 구현 비용이 비싸다
비싸게 지불하고 구현했더라도 버그 가능성이 너무 높다
유지 보수도 복잡하다
디자이너와 충분한 협의를 통해 디자인 자체를 회피하는 방향으로 선회하자
사유지
사유지
@YoshiCoin 님의 만화

Recommended for you

임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
모바일 SNG 비동기 네트워크 통신 사례
모바일 SNG 비동기 네트워크 통신 사례모바일 SNG 비동기 네트워크 통신 사례
모바일 SNG 비동기 네트워크 통신 사례

- async Action - Network Queue - Request Numbering - Batching Requests

mobilenetworkasync
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템

Protocol:hyperspace Diver 개발 포스트모템 IGC2017에서 발표한 세션의 자료를 공유합니다. 이전 NDC17에서 발표한 내용과는 초점을 조금 다르게 잡고 새롭게 구성한 것입니다.

igcigc2017nextfloor
사유지 권한
친구 / 외부인 / 부족원(추후 제공 예정) 에게
권한을 일부 혹은 전부 허용해줄 수 있다
가족 간에도 범죄가 생기는 무서운 시대
내 사유지에서 무슨 일이 일어나는지 나는 알아야겠다!!
ytn
newsis
데일리한국
오마이뉴스
사유지 이력 시스템
실시간 알림의 필요성
• 이력 시스템은 문제를 발견하기 전까지 이용하지 않게 된다
• 문제를 발견한 이후에는 늦을 수 있다
• 내 사유지에서 일어나는 행동에 대한 빠른 피드백을 위해
실시간으로 알림이 필요하다

Recommended for you

[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규
[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규
[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규

스피커덱에서 좀더 좋은 화질의 버전을 보실 수 있습니다: http://bit.ly/gamelivedev2

모바일 엔진 개발기
모바일 엔진 개발기모바일 엔진 개발기
모바일 엔진 개발기

kasas

kasastudy
모바일 Rpg 게임서버 리팩토링
모바일 Rpg 게임서버 리팩토링모바일 Rpg 게임서버 리팩토링
모바일 Rpg 게임서버 리팩토링

DB에서 Stored Procedure로 만들어진 게임로직을 Java Web으로 리팩토링하는 과정을 서술해보았습니다.

mobile rpgjavagame server
오프라인인 캐릭터에게 알림
• 접속 중일 때는 해당 캐릭터에게 알림을 보내면 그만
• 접속 중이 아닐 때는 어떻게 해야 할까?
• 해당 캐릭터의 DB 속 데이터를 직접 수정해야 한다
• 여러 명이 동시에 사유지에서 활동할 경우 동시에 알림을 보낼 수도 있다
• 여러 명의 요청을 안전하게 처리할 수 있어야 한다
요청자가 서로 다른 서버에 있을 수 있음
낙관적 트랜잭션
니가 알고 있던 건
최신이 아니야
동작이 단순하고 가볍다
하나의 문서만을 대상으로 할 수 있다
낙관적 트랜잭션의 어려움
트랜잭션 시 수행하는 코드는 언제나 재실행이 가능해야 한다
실행은 사이드 이펙트가 없어야 한다
객체는 복잡하고 다양한 로직을 가지고 있다
객체를 대상으로는 낙관적 트랜잭션을 금지
사이드 이펙트가 누적될 수 있다
계속해서 다시 시도해야 할 수 있다
객체의 소유권
• 서버에게 객체의 담당 시킬 뿐 아니라 소유권한 까지 넘긴다
• 어떤 객체에게 영향을 주고 싶으면 소유한 서버에게 문의해야 한다
• 하지만 접속 중이 아닐 때에는?

Recommended for you

온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
ndc2011
스크럼을 이용한 게임 개발
스크럼을 이용한 게임 개발스크럼을 이용한 게임 개발
스크럼을 이용한 게임 개발

사내 발표를 위해 제작한 자료입니다. 기존에 작성한 '스크럼 이걸 왜 하나요'가 스크럼에 대한 일반적인 시각에서의 소개였다면 이번 자료는 게임 개발에 접목시켜보았습니다. 조금이나마 도움 되셨으면 좋겠습니다.

스크럼프로세스애자일
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수

저스틴 존슨 교수님 강의 정리 10강 신경망 학습하기 파트 1 - 1. 활성화 함수

 
by jdo
DB에 태스크 큐
객체마다 태스크 큐를 DB에 만든다
작업을 큐잉해 둔다
owner.queue_task(
Player.notify_estate_event, *args, **kwargs)
그 객체가 접속 중 이라면 rpc를 통해서 알려준다
접속 중이 아니었다면 접속할 때 내 큐를 확인해서 수행한다
사유지 알림
• 행동을 하는 객체는 사유지의 주인에게 꼬박꼬박 보고를 한다
• 오프라인일 때 일어났던 일은 접속할 때 알려주고
• 온라인일 때 일어난 일은 바로 알려준다
부족
부족 시스템
아직 시스템에서 지원을 하고 있진 않음
기반은 작업해 두었지만 더 완성도를 높여서 보여드리고 싶은 마음에
아직 공개한 적은 없음

Recommended for you

애자일 프랙티스
애자일 프랙티스애자일 프랙티스
애자일 프랙티스

애자일 프랙티스

애자일애자일 프랙티스agile
MSA와 infra
MSA와 infraMSA와 infra
MSA와 infra

소프트웨어 개발을 하면서 인프라에 대해 구체적으로 정리한 적이 없었던 것 같은데, MSA에 대한 인프라를 정리하면서 가볍게 작성한 내용입니다.

msainfrastructureinformation technology
만능 개발자를 위한 아틀리에 시스템
만능 개발자를 위한 아틀리에 시스템만능 개발자를 위한 아틀리에 시스템
만능 개발자를 위한 아틀리에 시스템

KGC2010 강연자료 : 만능(올파트)개발자를 위한 '아틀리에 시스템'

gamedevelopment
부족과 플레이어의 관계는 서로 참조
가입이나 탈퇴는 양쪽 문서를 모두 수정해야 한다
d부족 A
c
a
b
가입과 탈퇴 시 양쪽 문서가 동시에 수정됨이 보장되지 않는다면
예상할 수 없는 문제들이 속출
d부족 A
c
a
b
ACID 트랜잭션
• 안전한 트랜잭션을 위한 특징
Atomicity 부분적으로만 실행되지 않는다
Consistency 실행에 성공하면 언제나 일관된 상태로 유지된다
Isolation 수행 중 다른 트랜잭션이 끼어들 수 없다
Durability 성공한 트랜잭션은 영구히 반영된다
• 하지만 우리는 분산에 더 적합한 NoSQL을 사용
• NoSQL에서는 보장하기 힘들다
BASE 트랜잭션
• ACID를 NoSQL에서 근사하게 보장해 주기 위한
애플리케이션 레벨의 방법
Basically Available
Soft state
Eventual consistency
• 트랜잭션에 내용을 따로 문서로 작성
• 애플리케이션 레벨에서 해당 문서를 참조하여 결과적으로 일관성을 보장함
• 애플리케이션 레벨의 처리이기 때문에 로직 자체에서 신경 써야 할 점이 많다

Recommended for you

Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지

Android와 Flutter의 개발적인 큰 차이점 5가지를 소개합니다. 더 궁금한게 있으신분은 bs.nam@lawfully.com 으로 메일 주세요 :)

androiddifferenceflutter
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활

200819 NAVER TECH CONCERT - 장수한 성능을 고민하는 슬기로운 개발자 생활

Slipp 발표 자료 20151212
Slipp 발표 자료 20151212Slipp 발표 자료 20151212
Slipp 발표 자료 20151212

2015년 12월 12일 Slipp Conference에서 발표한 자료입니다

가입과 탈퇴
가입과 탈퇴는 두개의 문서를 동시에 수정하는 작업
하지만 BASE 트랜잭션은 고민을 많이 해야하고 구현이 복잡하다
BASE 트랜잭션을 안쓰고 낙관적 트랜잭션만으로 해결할 순 없을까?
가볍지만 하나의 문서를 대상으로만 가능
가입 신청
가입을 신청할 때 부족 문서에 기록하지 말자
➔ 낙관적 트랜잭션만으로 가능
플레이어가 부족을 가리키는 단방향 관계 형성
DB에 쿼리를 통해서 부족은 가입하길 원하는 플레이어를 검색
가입과 강제퇴출
부족장이 가입을 승인할 땐 부족이 플레이어를 가리키게 한다
➔ 낙관적 트랜잭션만으로 가능
부족장이 부족이 플레이어를 가리키지 않게 하면 강제 퇴출
하지만 이럴 경우 가입 신청한 상황과 구분이 되지 않는다!
토큰의 도입
가입 신청과 수락 시에 토큰을 같이 기록한다
토큰은 유니크한 값이 발급된다
A17D3
A17D3

Recommended for you

강제 퇴출
강제로 퇴출 시에는 토큰을 만료만 시킨다
양쪽 토큰이 일치하더라도 토큰이 만료되었을 경우는 인정하지 않는다
A17D3
A17D3:만료됨
4F82K
탈퇴
자진 탈퇴할 때는 조용히 나의 가리킴만 삭제
기존의 부족 쪽 토큰은 데이터는 있지만 사실상 의미가 없다
재 가입신청을 할 때는 토큰이 바뀌어 있으므로 기존의 부족 쪽 토큰은 무효
A17D3
초대
• 초대를 보낼 때에는 부족 쪽에서 발행하여 토큰을 초대장과 함께 보낸다
• 초대장을 보내는 순간 이미 부족은 플레이어를 가리키고 있다
• 내가 해당 토큰으로 부족을 가리키면 초대 수락
A17D3
A17D3
낙관적 트랜잭션만으로 해결
가입 신청/ 탈퇴/ 초대 수락
➔ 플레이어 데이터만 수정
가입 수락/ 강제 탈퇴 / 초대
➔ 부족 데이터만 수정
일반적인 로그인 세션과 다르지 않다
간단한 구조 변경을 통해 가벼운 낙관적 트랜잭션으로 해결

Recommended for you

중앙 서버 없는 게임 로직
중앙 서버가 없다는 것은?
원탁의 기사는 보기에는 좋지만
실제로는 일의 절차가 복잡하고 느릴 수 있다
이미 활용되고 있는 서비스 형태
• 이미 웹 서비스 외 여러 분야에서 다양하게 활용되고 있다
• 서비스의 안정성과 가용성을 위해선 어쩌면 당연한 선택
• 단지 MMORPG에서 활용된 적은 많지 않은 것 같다
오늘 소개한 전략들도 상당수 여기서 힌트를 얻음
분산 구조에 대응하는 전략
• 복잡한 계산은 최대한 한곳에서, 다른 서버에서는 결과만 받아보자
• 모든 서버에서 계산은 해야 한다면 어디에서 하든지 결과가 동일하게
• 동기화를 최대한 하지 않는다
• 다른 서버의 객체에 동시에 적용되어야 하는 작업을 최소화 한다

Recommended for you

시행착오
• 처음엔 별 생각 없이 익숙한 방식으로 작업하다가 재 작업을 많이 함
• 일반적인 멘탈 구조와 달라 작업할 때 조심을 많이 해야 함
하지만 오늘 살펴본 사례에서 볼 수 있듯이
생각보다 해결 방법은 간단하고
일반론 안에서 해결이 가능하다
고비용 = 적응 비용
많은 사람이 시도하여
이미 다양한 경험이 공유되어 있었다면
우리도 시행착오를 줄일 수 있었을 것 같습니다
Q
A
감사합니다
Q&A

Recommended for you

NDC16 <야생의 땅: 듀랑고>의 거친 환경에서 살아가는 동물 AI
세션에서 설명 드린 것을 참고하시면 좋을 것 같습니다.
저희는 PVE와 PVP 모두 콜로세움이라는 노드를 통해 해결합니다
모든 전투와 관련된 행동들이 해당 노드에서 결정, 수행되기 때문에
전투에 관해서 만큼은 다른 서버에 있다고 하여 시간차가 발생하지
않습니다
Q
A
만약 PVP가 구현된다면, 예측 불가능한 인터랙션이 매우 많이 발생
하여 서로 다른 서버에 있는 유저들 사이에서 많은 부담이 발생할 것
같습니다. 혹시 구현 계획과 그 대책이 있나요?
여러 플레이어들과 공룡을 사냥할 때 신속한 동기화가 필요할텐데
이럴 경우 동기화의 퍼포먼스, 그리고 말��하신 동기화로 인한 부하
가 커질텐데 그런 부분은 어떻게 해결하셨나요?Q
객체는 서버에게 소유권이 이전 되어있기 때문에
다른 서버에 있는 객체 둘이 어느 목표 대상물에게 접근하려면
둘 다 목표 대상물을 소유한 서버에 rpc를 통해서
요청을 보내는 수 밖에 없습니다.
해당 서버 안에서는 객체 단위로 rpc 요청이 직렬화 되기 때문에
요청 받은 순서대로 처리하게 됩니다.
Q
A
동시에 다른 서버에 있는 유저가 같은 객체와 인터랙트하는 경우에
는 두 유저가 모두 인터랙트를 할 수 있는지? 동기화는 어떻게 처리
되는지요?
병목이 생기는 부분을 분산할 예정입니다.
Q
A
서버간 동기화로 인해 패킷이 늘어나면, 물리적 네트워크 처리량이
병목이 되지 않나요? 패킷양으로 인해 물리적 네트워크 처리량에 병
목이 온다면, 어떻게 해결할 계획이신가요?
인스턴트를 새로 만드는 비용은 언제나 최소한으로 맞추기 위해
노력을 했습니다. 기본적인 정보만 미리 세팅하고 상세한 정보들은
필요할 때 만들거나 읽어오도록 하였기 때문에 코스트가
크지 않습니다
Q
A
신기루그리드를 누군가 터치했을 때 인스턴스를 새로만든다면 새로
만드는 연산에 비용코스트가 크지 않나요?

Recommended for you

서버는 지리적으로는 영향력이 없기 때문에 문제가 생긴 서버에게
속한 객체가 정상적으로 동기화 되지 않는다는 문제점 정도는
있을 것이지만, 그 지역 자체에는 아무런 영향이 없습니다.
Q
A
특정 서버만이 오류가 있을 때 게임지리적으로 같은 곳에 객체가 존
재하는 다른 서버도 같이 영향을 받을텐데 이는 어떻게 해결하실 생
각인가요?
아직 글로벌 서비스에 대한 준비가 완벽하지 않아서
확실하게 답변 드릴 수 있는 부분이 아닌 것 같습니다.
모바일 통신 환경에서는 기본적으로 latency가 클 수 밖에 없기 때문에
항상 높은 latenc를 가정하고 게임을 디자인하고 있습니다.
Q
A
서로 다른 지역에서 플레이 하는 사람은 해당 지역의 서버에 접속을
하나요? 그렇다면 서버간 통신 latency가 큰 경우에 어떤 문제가 생
길 수 있나요?
최초로 active 상태가 되는 것은 유저의 선택 (인터랙션)에 의해서
이루어 집니다. 단순히 내부적 상태가 변하는 것은 저희도 이 때
처리하고 있습니다만, 이 세션에서 설명드린 부분은 시간에 따라
외형이 변하는 객체들 입니다. 모닥불이 활활 타고 있는 것 같지만
실제로는 꺼져있는 상태는 유저에게 혼란을 줄 수 있어 그렇게 할 수
없었습니다.
Q
A
시간에 따라 상태가 변경되는 지형물은 스케줄러에 등록해놓고 매번
처리하지말고, 최초 로 active상태가 될때 누적된 처리를 한번에 해
주면 어떤 문제가 있나요?
일단 분산된 서버라는 것 자체가 원래 있던 서버에 접속할 필요가
없게 만들어야 합니다. 재접속 할 때에는 원래 접속했던 서버에
접속할 확률이 낮기 때문에 언제나 관련된 정보는 DB에 저장해 두고
필요할 때마다 꺼내기 쉽게 해 놓았습니다.
Q
A
중앙서버가 없다면 비원활 네트워크 상황이 발생했을 경우, 원래 로
그인했던 게임서버에 재접속이 된다는 보장이 없을 텐데, 다른 게임
서버에 재접속 됐을 경우 예전 게임서버에 남아있는 유저의 정보와,
새로 로그인되는 유저의 정보는 어떻게 처리되는지 궁금합니다.

Recommended for you

유저의 이동은 BASE 트랜잭션으로 저장하지 않고
각 소유권이 인정된 서버에서 알아서 처리하기 때문에
Eventual consistency 로 처리하지 않습니다.
그리고 각 개체는 겹쳐있는 것을 허용하기 때문에 충돌이 일어나지
않습니다.
Q
A
서로 다른 서버에 있는 두 유저가 동시에 같은 장소로 이동할 경우
Eventual Consistency로 처리 되면 위치가 충돌하지 않을까요?
쉽게 답변드릴 수 없는 부분인 것 같습니다.
Q
A
듀랑고 정도의 서버 프로그래밍의 예상 개발시간 소요는
어느정도일까요
iOS 노티피케이션은 큐를 통해서 처리하지 않습니다.
큐에 작업을 넣을 때 필요한 경우 푸쉬(노티피케이션)을 따로
보내고 있습니다.
Q
A
오프라인인 유저가 접속해야 있던 큐를 처리하면, 오프라인인 유저
는 iOS 노티피케이션을 받을 수 없나요?
누군가가 해당 지역을 처음으로 목격했을 때 로드됩니다.
해당 서버에서 그 지역에 관심 있는 객체가 하나도 존재하지 않게 되면
다시 누군가 목격할 때 까지는 메모리에서 해제합니다.
Q
A
외형 캐시가 서버에 로드되는 시점이 언제인가요?

Recommended for you

DB의 특정 노드에 장애가 난 상태에서 일부 DB 작업이 실패하는데
전체 서비스가 망가지진 않지만 일부 동작이 망가질 순 있습니다.
DB 자체는 persistent 합니다.
Q
A
오프라인 유저에 대한 지연된 업데이트를 위해 DB큐를 둔다고 하셨
는데요. 해당 큐에 장애가 나는 경우에도 대비되어있나요?
오프라인 유저의 지연 업데이트를 위한 DB큐도 백업이 있나요? 해
당 DB큐에 장애가나면 데이터가 날아가버리지 않나요?Q
게임 서버는 파이썬으로만 구성되어있습니다.
게임 서버 이외의 워커들엔 C#도 쓰고 있습니다.
Q
A
듀랑고 서버는 파이썬으로만 구성 되어 있나요?
네 그렇습니다. 다만 3로 옮기는 것을 고려 중 입니다.
Q
A
파이썬 2.7에 gevent를 계속 사용하고 있나요?
파이썬의 라이브러리 생태계가 아주 잘 이루어져 있기 때문이었습니다
Q
A
서버 개발 언어로 분산에 최적화된 여러 언어가 아닌(얼랭이라던가)
파이썬을 고른 이유는 무엇인가요?

Recommended for you

저희는 NoSQL인 Couchbase를 사용하고 있습니다.
Q
A
db는 awa의 rds를 쓰시나요? 다이나모를 쓰시나요 rds를 쓰신다
면 어떤 엔진을 쓰시고 그 엔진을 쓰신 이유가 있다면?
네 그렇습니다.
Q
A
사용하는 파이썬 구현체는 무엇인가요? (only cpython?)
아직 확정되지 않은 부분이라 답변 드리지 못함을 양해 부탁드립니다.
Q
A
랭킹시스템이 들어간다면 어떻게 구현을 하실 생각인가요?

More Related Content

What's hot

〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
Heungsub Lee
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
Ho Gyu Lee
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
Jongwon Kim
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
Seungmo Koo
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
YEONG-CHEON YOU
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
Amazon Web Services Korea
 
NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기
Hoyoung Choi
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조
Hyunjik Bae
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
devCAT Studio, NEXON
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
Brian Hong
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
YEONG-CHEON YOU
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
KyeongWon Koo
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
devCAT Studio, NEXON
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
Seungmo Koo
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
Seungmo Koo
 
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
devCAT Studio, NEXON
 

What's hot (20)

〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
 
NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
 

Viewers also liked

[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
Sumin Byeon
 
NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지
NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지
NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지
Kwangyoung Lee
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)
Heungsub Lee
 
Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러
Heungsub Lee
 
KGC 2016 오��소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
흥배 최
 
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
Eunseok Yi
 
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21��기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Sumin Byeon
 
아키에이지 원정대 구성_전략
아키에이지 원정대 구성_전략아키에이지 원정대 구성_전략
아키에이지 원정대 구성_전략
Gray-Soul
 
232 deview2013 oss를활용한분산아키텍처구현
232 deview2013 oss를활용한분산아키텍처구현232 deview2013 oss를활용한분산아키텍처구현
232 deview2013 oss를활용한분산아키텍처구현
NAVER D2
 
Redux vs Alt
Redux vs AltRedux vs Alt
Redux vs Alt
Uldis Sturms
 
ProudNet 1.7 소개
ProudNet 1.7 소개ProudNet 1.7 소개
ProudNet 1.7 소개
Hyunjik Bae
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용
흥배 최
 
웹서버와 프라우드넷 서버간 상호작용 가이드
웹서버와 프라우드넷 서버간 상호작용 가이드웹서버와 프라우드넷 서버간 상호작용 가이드
웹서버와 프라우드넷 서버간 상호작용 가이드
Hyunjik Bae
 
Unity에서 회전하는 cube 만드는 법
Unity에서 회전하는 cube 만드는 법Unity에서 회전하는 cube 만드는 법
Unity에서 회전하는 cube 만드는 법
Hyunjik Bae
 
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
Hyunjik Bae
 
프라우드넷의 IL2CPP 적응 기록-정종채
프라우드넷의 IL2CPP 적응 기록-정종채프라우드넷의 IL2CPP 적응 기록-정종채
프라우드넷의 IL2CPP 적응 기록-정종채
Hyunjik Bae
 
라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성
Hyunjik Bae
 
KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론
Hyunjik Bae
 
야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계
야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계
야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계
승명 양
 
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
Young Keun Choe
 

Viewers also liked (20)

[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
 
NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지
NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지
NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)
 
Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
 
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
 
아키에이지 원정대 구성_전략
아키에이지 원정대 구성_전략아키에이지 원정대 구성_전략
아키에이지 원정대 구성_전략
 
232 deview2013 oss를활용한분산아키텍처구현
232 deview2013 oss를활용한분산아키텍처구현232 deview2013 oss를활용한분산아키텍처구현
232 deview2013 oss를활용한분산아키텍처구현
 
Redux vs Alt
Redux vs AltRedux vs Alt
Redux vs Alt
 
ProudNet 1.7 소개
ProudNet 1.7 소개ProudNet 1.7 소개
ProudNet 1.7 소개
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용
 
웹서버와 프라우드넷 서버간 상호작용 가이드
웹서버와 프라우드넷 서버간 상호작용 가이드웹서버와 프라우드넷 서버간 상호작용 가이드
웹서버와 프라우드넷 서버간 상호작용 가이드
 
Unity에서 회전하는 cube 만드는 법
Unity에서 회전하는 cube 만드는 법Unity에서 회전하는 cube 만드는 법
Unity에서 회전하는 cube 만드는 법
 
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
 
프라우드넷의 IL2CPP 적응 기록-정종채
프라우드넷의 IL2CPP 적응 기록-정종채프라우드넷의 IL2CPP 적응 기록-정종채
프라우드넷의 IL2CPP 적응 기록-정종채
 
라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성
 
KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론
 
야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계
야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계
야생의 땅: 듀랑고의 시뮬레이션 MMO 샌드박스 설계
 
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
 

Similar to 중앙 서버 없는 게임 로직

멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면
Byeongsu Kang
 
NDC17 장창완(최종)
NDC17 장창완(최종)NDC17 장창완(최종)
NDC17 장창완(최종)
창완 장
 
Agile의 의미와 Agile 계획 수립(Gdc2007)
Agile의 의미와 Agile 계획 수립(Gdc2007)Agile의 의미와 Agile 계획 수립(Gdc2007)
Agile의 의미와 Agile 계획 수립(Gdc2007)
Kay Kim
 
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
강 민우
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
DaeMyung Kang
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
devCAT Studio, NEXON
 
모바일 SNG 비동기 네트워크 통신 사례
모바일 SNG 비동기 네트워크 통신 사례모바일 SNG 비동기 네트워크 통신 사례
모바일 SNG 비동기 네트워크 통신 사례
성수 이
 
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
Young Soo Kim
 
[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규
[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규
[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규
ChangKyu Song
 
모바일 엔진 개발기
모바일 엔진 개발기모바일 엔진 개발기
모바일 엔진 개발기
changehee lee
 
모바일 Rpg 게임서버 리팩토링
모바일 Rpg 게임서버 리팩토링모바일 Rpg 게임서버 리팩토링
모바일 Rpg 게임서버 리팩토링
기환 천
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
Seungjae Lee
 
스크럼을 이용한 게임 개발
스크럼을 이용한 게임 개발스크럼을 이용한 게임 개발
스크럼을 이용한 게임 개발
Insub Lee
 
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
jdo
 
애자일 프랙티스
애자일 프랙티스애자일 프랙티스
애자일 프랙티스
한 경만
 
MSA와 infra
MSA와 infraMSA와 infra
MSA와 infra
Je Hun Kim
 
만능 개발자를 위한 아틀리에 시스템
만능 개발자를 위한 아틀리에 시스템만능 개발자를 위한 아틀리에 시스템
만능 개발자를 위한 아틀리에 시스템
KwangSam Kim
 
Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지
Bansook Nam
 
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
NAVER Engineering
 
Slipp 발표 자료 20151212
Slipp 발표 자료 20151212Slipp 발표 자료 20151212
Slipp 발표 자료 20151212
Jinsoo Jung
 

Similar to 중앙 서버 없는 게임 로직 (20)

멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면
 
NDC17 장창완(최종)
NDC17 장창완(최종)NDC17 장창완(최종)
NDC17 장창완(최종)
 
Agile의 의미와 Agile 계획 수립(Gdc2007)
Agile의 의미와 Agile 계획 수립(Gdc2007)Agile의 의미와 Agile 계획 수립(Gdc2007)
Agile의 의미와 Agile 계획 수립(Gdc2007)
 
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
 
모바일 SNG 비동기 네트워크 통신 사례
모바일 SNG 비동기 네트워크 통신 사례모바일 SNG 비동기 네트워크 통신 사례
모바일 SNG 비동기 네트워크 통신 사례
 
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
 
[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규
[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규
[NDC13] 70명이 커밋하는 라이브 개발하기 (해외 진출 라이브 프로젝트의 개발 관리) - 송창규
 
모바일 엔진 개발기
모바일 엔진 개발기모바일 엔진 개발기
모바일 엔진 개발기
 
모바일 Rpg 게임서버 리팩토링
모바일 Rpg 게임서버 리팩토링모바일 Rpg 게임서버 리팩토링
모바일 Rpg 게임서버 리팩토링
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 
스크럼을 이용한 게임 개발
스크럼을 이용한 게임 개발스크럼을 이용한 게임 개발
스크럼을 이용한 게임 개발
 
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
[컴퓨터비전과 인공지능] 10. 신경망 학습하기 파트 1 - 1. 활성화 함수
 
애자일 프랙티스
애자일 프랙티스애자일 프랙티스
애자일 프랙티스
 
MSA와 infra
MSA와 infraMSA와 infra
MSA와 infra
 
만능 개발자를 위한 아틀리에 시스템
만능 개발자를 위한 아틀리에 시스템만능 개발자를 위한 아틀리에 시스템
만능 개발자를 위한 아틀리에 시스템
 
Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지
 
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
 
Slipp 발표 자료 20151212
Slipp 발표 자료 20151212Slipp 발표 자료 20151212
Slipp 발표 자료 20151212
 

중앙 서버 없는 게임 로직

  • 1. 중앙 서버 없는 게임 로직 <야생의 땅: 듀랑고> 0. 듀랑고의 서버 1. 실시간 동기화 2. 농사와 날씨 3. 협동 건설 4. 사유지 5. 부족
  • 6. 탐험, 개척 탐험의 매력은 이 세상의 모든 곳을 눈으로 확인하고 그곳에 발자국을 찍는 것 개척의 매력은 주인이 없는 거친 땅을 다듬어 나의 소유로 만드는 것
  • 7. 넓은 땅, 하나의 세계 되도록 넓은 땅을 유저에게 제공하고 싶다 어떤 유저든지 원한다면 서로 만날 수 있게 해주고 싶다
  • 8. 분산 서버 안정성과 부하의 분산을 위한 구조 부분적 장애가 전체 서비스에 영향을 주지 않음
  • 10. 객체가 중심이 되는 서버 • 하나의 지역을 물리적인 서버가 담당하는 것은 땅의 크기가 서버의 성능에 의해 제한될 수 밖에 없다 • 서버가 어떤 지역을 담당하지 않는다 • 서버는 모종의 규칙에 의해 배정된 객체를 담당한다 최적화에 유리한 방향으로
  • 16. 엄밀하게는 서버-서버간 차이가 아닌 서버-클라이언트간 차이지만 이해를 돕기 위해 가져옴 내가 움직임 ➔ 서버에서 처리해 준 결과
  • 17. 장점 서버에 소속된 객체의 시야 외에는 관심이 없어 전체 세계의 크기와 상관 없는 구조 ➔ 이론적으로 무한한 크기의 세계를 표현 가능 특정 서버에 문제가 생겼을 때 재 접속하면 바로 그 위치에서 정상적인 플레이 가능 ➔ 안정성의 향상
  • 18. 100 ㎢0.25 ㎢ 1 ㎢ 4 ㎢ 836개의 섬 2016년 4월 LBT 기준
  • 20. 동기화 • 동기화가 잦을 수록 DB에 부담이 된다 • 동기화가 잦을 수록 패킷량이 늘어난다 • 지나치게 잦은 동기화는 최적화의 대상 • 하지만 플레이가 불가능하진 않다
  • 21. 분산 환경에서의 동기화 • 객체에서 환영으로 서버간 동기화가 이루어진다 • 같은 곳을 보는 서버가 많을 수록 N배 부담 • 동기화에서 느끼는 부담이 늘어났다
  • 22. 2015년 12월 LBT 1일차 • 오픈 직후는 괜찮은 듯 보임 • 접속자가 늘어나자 급격히 서버 랙 증가 • 모니터링 결과 엄청난 양의 동기화 감지
  • 23. 서버 지연의 원인 • 플레이어는 이동할 때마다 조금씩 에너지를 깎는다 • 깎을 때 마다 동기화가 발생한다 • 이동하는 모든 플레이어가 동기화를 유발 • 30명의 플레이어 기준으로 분당 약 10000회의 동기화를 시도
  • 24. 최적화 • 동기화 당 부하를 줄여보자 • serialize, deserialize를 가볍게 하기 • 최소한의 정보만 동기화 • 게임 로직 레벨의 최적화는 아닌 것 같다 동기화 자체를 줄여보자
  • 25. 회 회1 10 10초간 초당 -1일 때 동기화 횟수 1초마다 1씩 에너지를 감소시키는 방법 10초 동안 총 10의 에너지를 지속적으로 감소시키는 방법 ➔ 아래 방법이 훨씬 효율적이다. 그런데 왜 잘 안쓰게 될까? x N x N
  • 26. 10 15 20 30 초 10초부터 10초간 초당 -10 15초부터 10초간 초당 +5 0초부터 ∞초간 초당 +1
  • 27. 이걸 언제 다 계산하고 있어
  • 29. 그래프 동기화 (since, until, velocity), (since, until, velocity), (since, until, velocity), … (광고) what-studio/gauge를 이용하면 당신도 쉽게 그래프 동기화를 ...
  • 30. 그래프 동기화 • 추가적인 변화가 생기면 다시 동기화 해서 덮어 씌운다 • 현재 시각(at)을 넣으면 언제 어디서나 현재 값을 알 수 있다 10 15 20 30 초 15초부터 10초간 초당 +5
  • 31. 그래프 동기화를 쓸 때 주의할 점 until이 미정인 경우가 있다 ➔ 움직이는 동안 에너지 소비 ➔ 접속 중일 때만 피로도가 오름 끝나는 이벤트를 잡는데 실패하면 영원히 지속된다
  • 32. 변칙적 운용 until을 정해진 시간만큼 지정해 둔다 일정시간마다 until을 갱신한다 ➔ 실수로 이벤트를 놓쳤다면 until만큼만 동작 언제 끝날지 모르는 이동중 에너지 소비 문제 해결 접속 중일 때만 증가해야 하는 피로도 문제 해결
  • 33. 가까운 미래의 예측 수치의 지속적인 증감 상태 효과로 인한 일시적인 변화 일정시간 동안 모션의 변화 • 언제부터(since) 언제까지(until) 변화가 지속될 지가 명확하다 • 변화를 매 순간 계산하지 말고 미리 예측하여 추이 자체를 동기화하자
  • 34. 플레이�� 30명의 분당 동기화 횟수 이동 중 에너지 감소 문제 수정 후 5약 배 절약 1차와 2차 LBT의 서버 비용 차이 물론 다른 개선 요소들도 반영된 결과긴 하지만… 약10000회 ➔ 1000회 이하
  • 37. 신기루 그리드 사과나무 갈대 갈대 갈대 갈대물물 물 자연물은 위치와 종류만 저장 건축물은 외형 패킷을 패킹하여 저장
  • 38. 신기루의 실체화 신기루와 인터랙션을 하는 순간 실체화 자연물은 아무도 건드리지 않았을 땐 DB에도 존재하지 않는다
  • 39. 신기루의 장점 실체화 한 뒤에 일정 시간이 지나도록 인터랙션이 없으면 다시 신기루화 ➔ 메모리 사용량을 최소화 움직이지 않는 객체들도 주변 움직임에 관심을 가지고 있음 ➔ 메모리에 있지 않으면 관심이 없어지므로 동기화 비용 감소
  • 40. 시간이 변하면 외형이 변하는 것들 외형이 전부 캐싱 되어있기 때문에 난감한 경우가 있다 • 불타버린 모닥불 • 내구도가 다된 건축물 • 다 자란 작물 • 외형 캐시에 만료 시간을 넣자 • 만료 시간이 지난 캐시는 버리고 DB에서 정보를 불러와 새로 생성한다
  • 41. • 해당 객체를 보고 있는 모든 서버에서 각자 알아서 처리 • 외형 캐시가 교체되면 연결되어있는 클라이언트들에게 전송
  • 43. • 작물이 성공적으로 자랄 확률은 유저의 행동에 의해서 결정됨 • 하지만 각 처리를 서버에서 하기 때문에 서버마다 결과가 달라질 수 있다 70% 70% 70% 70% !?
  • 44. 결정론적 작물 언제 어디서 결과를 확인하더라도 같은 결과가 나와야 한다 작물이 다 자라는 시각을 랜덤 시드로 하여 결과를 판별한다 Random(성장 완료 시각).random() = 0.751 0.751 ➔ 성공 70% 70% 70% 70% 0.751 ➔ 성공 0.751 ➔ 성공 0.751 ➔ 성공
  • 45. 결정론적 날씨 같은 지역이면 어떤 서버에서도 같은 날씨여야 한다 다른 시간대면 랜덤하게 다른 날씨일 수 있다 Random(지리적 위치 + 현재 시각 / 날씨 변화 주기).random() ➔ 시기적으로 랜덤이지만 지리적으로는 언제나 같은 결과를 얻어온다
  • 47. 개척, 건설 건설은 개척의 핵심 요소 여럿이 모여 마을을 이루고 사회를 이룬다
  • 48. 건설 현실 속에서 건설은 제작/채집보다 훨씬 오래 걸리는 일 빠른 건설 허용은 난개발을 가져온다 시간은 어느정도 길게 하지만 협동을 통해서 극복할 수 있게 하고 싶다
  • 49. 원기옥의 프로토타입 누군가가 건설을 시작하면 동료들이 옆에서 같이 건설을 한다 여러 명의 건설력을 합하여서 완성하는 속도가 빨라진다
  • 50. 원기옥 시스템에 숨어있는 피쳐들 건설할 때는 지속적으로 에너지가 감소 건설할 때는 지속적으로 도구의 내구도가 감소 오래 걸리는 작업이므로 잠시 접속을 끊어도 건설은 계속 진행되도록
  • 51. 쉬운, 그러나 할 수 없는 방법 루프를 돌면서 ➔ 도구의 내구도를 깎고 ➔ 플레이어의 에너지를 소모한 후에 건설의 진행도를 올린다 ✘ 간단하지만 장시간 루프를 돌려줄 주체가 없다 ✘ 루프를 통해서 완성도를 올리는 방법은 지속적인 동기화를 유발하기 때문에 최적화면에서 좋지 않다 여러 개의 서버가 동시에 관여 중
  • 52. 그래프 동기화의 활용 건설력 ➔ velocity 도구의 내구도 + 남은 에너지 ➔ until ✔ 진행을 처음부터 끝까지 그래프로 나타낼 수 있다 ✔ 참여자가 새로 참여할 때 마다 그래프를 새로 그리면 되...겠죠?
  • 53. 참여자 중 한 명이 참여를 중단 ➔ 완성이 더 늦어짐 ➔ 남은 참여자의 에너지 소모와, 도구의 내구도 소모가 늘어남 ➔ 모두의 에너지 소비 그래프와 내구도 소모 그래프를 다시 그린다
  • 54. 모든 참여자의 에너지 소비 그래프와 내구도 소비 그래프를 다시 그린다 ➔ 다시 그리는 중에 누가 또 나가면? ➔ 다시 그리던거 마무리 하고, 또 ... 다시 그린다... ➔ 근데 참여자 중 한명이 오프라인이라면?
  • 55. 무엇이 혼란한가? 분산된 환경에서는 객체들이 다른 프로세스에 흩어져 있다 행동의 여파가 여러 객체에 동시에 영향을 주는 경우 적용에 시간이 걸린다 그 행동이 동시에 여러 곳에서 요청이 온다면? 심지어 메모리에 올라와 있지도 않은 객체가 포함되었다면?
  • 56. 디자인 방향의 선회 ✘ 건설하는 동안 플레이어의 행동을 제한한다 ✘ 게임 진행의 흐름을 끊는다 ➔ 모바일 게임의 특성과 맞지 않다 앞에 붙어서 건설을 하는 시간 자체는 짧게 하지만 협동의 느낌은 나게
  • 57. 개선된 원기옥 1명이 건설 (짧은 시간) ➔ 건축물이 완성되기를 기다림 (긴 시간) ➔ 친구가 ‘도와주기’를 하면 기다리는 시간 감소 ➔ 정해진 시간이 지나면 완성 ✔ 실제 앞에 붙어있어야 하는 시간이 짧다 ✔ 비 동기적인 액션으로 동료가 완성 시간을 줄여줄 수 있다
  • 58. 동시에 여러 객체를 변조하는 일은 회피하자 2개 이상의 객체에 동시에 영향을 주는 작업은 구현 비용이 비싸다 비싸게 지불하고 구현했더라도 버그 가능성이 너무 높다 유지 보수도 복잡하다 디자이너와 충분한 협의를 통해 디자인 자체를 회피하는 방향으로 선회하자
  • 61. 사유지 권한 친구 / 외부인 / 부족원(추후 제공 예정) 에게 권한을 일부 혹은 전부 허용해줄 수 있다
  • 62. 가족 간에도 범죄가 생기는 무서운 시대 내 사유지에서 무슨 일이 일어나는지 나는 알아야겠다!! ytn newsis 데일리한국 오마이뉴스
  • 64. 실시간 알림의 필요성 • 이력 시스템은 문제를 발견하기 전까지 이용하지 않게 된다 • 문제를 발견한 이후에는 늦을 수 있다 • 내 사유지에서 일어나는 행동에 대한 빠른 피드백을 위해 실시간으로 알림이 필요하다
  • 65. 오프라인인 캐릭터에게 알림 • 접속 중일 때는 해당 캐릭터에게 알림을 보내면 그만 • 접속 중이 아닐 때는 어떻게 해야 할까? • 해당 캐릭터의 DB 속 데이터를 직접 수정해야 한다 • 여러 명이 동시에 사유지에서 활동할 경우 동시에 알림을 보낼 수도 있다 • 여러 명의 요청을 안전하게 처리할 수 있어야 한다 요청자가 서로 다른 서버에 있을 수 있음
  • 66. 낙관적 트랜잭션 니가 알고 있던 건 최신이 아니야 동작이 단순하고 가볍다 하나의 문서만을 대상으로 할 수 있다
  • 67. 낙관적 트랜잭션의 어려움 트랜잭션 시 수행하는 코드는 언제나 재실행이 가능해야 한다 실행은 사이드 이펙트가 없어야 한다 객체는 복잡하고 다양한 로직을 가지고 있다 객체를 대상으로는 낙관적 트랜잭션을 금지 사이드 이펙트가 누적될 수 있다 계속해서 다시 시도해야 할 수 있다
  • 68. 객체의 소유권 • 서버에게 객체의 담당 시킬 뿐 아니라 소유권한 까지 넘긴다 • 어떤 객체에게 영향을 주고 싶으면 소유한 서버에게 문의해야 한다 • 하지만 접속 중이 아닐 때에는?
  • 69. DB에 태스크 큐 객체마다 태스크 큐를 DB에 만든다 작업을 큐잉해 둔다 owner.queue_task( Player.notify_estate_event, *args, **kwargs) 그 객체가 접속 중 이라면 rpc를 통해서 알려준다 접속 중이 아니었다면 접속할 때 내 큐를 확인해서 수행한다
  • 70. 사유지 알림 • 행동을 하는 객체는 사유지의 주인에게 꼬박꼬박 보고를 한다 • 오프라인일 때 일어났던 일은 접속할 때 알려주고 • 온라인일 때 일어난 일은 바로 알려준다
  • 72. 부족 시스템 아직 시스템에서 지원을 하고 있진 않음 기반은 작업해 두었지만 더 완성도를 높여서 보여드리고 싶은 마음에 아직 공개한 적은 없음
  • 73. 부족과 플레이어의 관계는 서로 참조 가입이나 탈퇴는 양쪽 문서를 모두 수정해야 한다 d부족 A c a b
  • 74. 가입과 탈퇴 시 양쪽 문서가 동시에 수정됨이 보장되지 않는다면 예상할 수 없는 문제들이 속출 d부족 A c a b
  • 75. ACID 트랜잭션 • 안전한 트랜잭션을 위한 특징 Atomicity 부분적으로만 실행되지 않는다 Consistency 실행에 성공하면 언제나 일관된 상태로 유지된다 Isolation 수행 중 다른 트랜잭션이 끼어들 수 없다 Durability 성공한 트랜잭션은 영구히 반영된다 • 하지만 우리는 분산에 더 적합한 NoSQL을 사용 • NoSQL에서는 보장하기 힘들다
  • 76. BASE 트랜잭션 • ACID를 NoSQL에서 근사하게 보장해 주기 위한 애플리케이션 레벨의 방법 Basically Available Soft state Eventual consistency • 트랜잭션에 내용을 따로 문서로 작성 • 애플리케이션 레벨에서 해당 문서를 참조하여 결과적으로 일관성을 보장함 • 애플리케이션 레벨의 처리이기 때문에 로직 자체에서 신경 써야 할 점이 많다
  • 77. 가입과 탈퇴 가입과 탈퇴는 두개의 문서를 동시에 수정하는 작업 하지만 BASE 트랜잭션은 고민을 많이 해야하고 구현이 복잡하다 BASE 트랜잭션을 안쓰고 낙관적 트랜잭션만으로 해결할 순 없을까? 가볍지만 하나의 문서를 대상으로만 가능
  • 78. 가입 신청 가입을 신청할 때 부족 문서에 기록하지 말자 ➔ 낙관적 트랜잭션만으로 가능 플레이어가 부족을 가리키는 단방향 관계 형성 DB에 쿼리를 통해서 부족은 가입하길 원하는 플레이어를 검색
  • 79. 가입과 강제퇴출 부족장이 가입을 승인할 땐 부족이 플레이어를 가리키게 한다 ➔ 낙관적 트랜잭션만으로 가능 부족장이 부족이 플레이어를 가리키지 않게 하면 강제 퇴출 하지만 이럴 경우 가입 신청한 상황과 구분이 되지 않는다!
  • 80. 토큰의 도입 가입 신청과 수락 시에 토큰을 같이 기록한다 토큰은 유니크한 값이 발급된다 A17D3 A17D3
  • 81. 강제 퇴출 강제로 퇴출 시에는 토큰을 만료만 시킨다 양쪽 토큰이 일치하더라도 토큰이 만료되었을 경우는 인정하지 않는다 A17D3 A17D3:만료됨
  • 82. 4F82K 탈퇴 자진 탈퇴할 때는 조용히 나의 가리킴만 삭제 기존의 부족 쪽 토큰은 데이터는 있지만 사실상 의미가 없다 재 가입신청을 할 때는 토큰이 바뀌어 있으므로 기존의 부족 쪽 토큰은 무효 A17D3
  • 83. 초대 • 초대를 보낼 때에는 부족 쪽에서 발행하여 토큰을 초대장과 함께 보낸다 • 초대장을 보내는 순간 이미 부족은 플레이어를 가리키고 있다 • 내가 해당 토큰으로 부족을 가리키면 초대 수락 A17D3 A17D3
  • 84. 낙관적 트랜잭션만으로 해결 가입 신청/ 탈퇴/ 초대 수락 ➔ 플레이어 데이터만 수정 가입 수락/ 강제 탈퇴 / 초대 ➔ 부족 데이터만 수정 일반적인 로그인 세션과 다르지 않다 간단한 구조 변경을 통해 가벼운 낙관적 트랜잭션으로 해결
  • 85. 중앙 서버 없는 게임 로직
  • 86. 중앙 서버가 없다는 것은? 원탁의 기사는 보기에는 좋지만 실제로는 일의 절차가 복잡하고 느릴 수 있다
  • 87. 이미 활용되고 있는 서비스 형태 • 이미 웹 서비스 외 여러 분야에서 다양하게 활용되고 있다 • 서비스의 안정성과 가용성을 위해선 어쩌면 당연한 선택 • 단지 MMORPG에서 활용된 적은 많지 않은 것 같다 오늘 소개한 전략들도 상당수 여기서 힌트를 얻음
  • 88. 분산 구조에 대응하는 전략 • 복잡한 계산은 최대한 한곳에서, 다른 서버에서는 결과만 받아보자 • 모든 서버에서 계산은 해야 한다면 어디에서 하든지 결과가 동일하게 • 동기화를 최대한 하지 않는다 • 다른 서버의 객체에 동시에 적용되어야 하는 작업을 최소화 한다
  • 89. 시행착오 • 처음엔 별 생각 없이 익숙한 방식으로 작업하다가 재 작업을 많이 함 • 일반적인 멘탈 구조와 달라 작업할 때 조심을 많이 해야 함 하지만 오늘 살펴본 사례에서 볼 수 있듯이 생각보다 해결 방법은 간단하고 일반론 안에서 해결이 가능하다
  • 90. 고비용 = 적응 비용 많은 사람이 시도하여 이미 다양한 경험이 공유되어 있었다면 우리도 시행착오를 줄일 수 있었을 것 같습니다 Q A
  • 92. Q&A
  • 93. NDC16 <야생의 땅: 듀랑고>의 거친 환경에서 살아가는 동물 AI 세션에서 설명 드린 것을 참고하시면 좋을 것 같습니다. 저희는 PVE와 PVP 모두 콜로세움이라는 노드를 통해 해결합니다 모든 전투와 관련된 행동들이 해당 노드에서 결정, 수행되기 때문에 전투에 관해서 만큼은 다른 서버에 있다고 하여 시간차가 발생하지 않습니다 Q A 만약 PVP가 구현된다면, 예측 불가능한 인터랙션이 매우 많이 발생 하여 서로 다른 서버에 있는 유저들 사이에서 많은 부담이 발생할 것 같습니다. 혹시 구현 계획과 그 대책이 있나요? 여러 플레이어들과 공룡을 사냥할 때 신속한 동기화가 필요할텐데 이럴 경우 동기화의 퍼포먼스, 그리고 말씀하신 동기화로 인한 부하 가 커질텐데 그런 부분은 어떻게 해결하셨나요?Q
  • 94. 객체는 서버에게 소유권이 이전 되어있기 때문에 다른 서버에 있는 객체 둘이 어느 목표 대상물에게 접근하려면 둘 다 목표 대상물을 소유한 서버에 rpc를 통해서 요청을 보내는 수 밖에 없습니다. 해당 서버 안에서는 객체 단위로 rpc 요청이 직렬화 되기 때문에 요청 받은 순서대로 처리하게 됩니다. Q A 동시에 다른 서버에 있는 유저가 같은 객체와 인터랙트하는 경우에 는 두 유저가 모두 인터랙트를 할 수 있는지? 동기화는 어떻게 처리 되는지요?
  • 95. 병목이 생기는 부분을 분산할 예정입니다. Q A 서버간 동기화로 인해 패킷이 늘어나면, 물리적 네트워크 처리량이 병목이 되지 않나요? 패킷양으로 인해 물리적 네트워크 처리량에 병 목이 온다면, 어떻게 해결할 계획이신가요?
  • 96. 인스턴트를 새로 만드는 비용은 언제나 최소한으로 맞추기 위해 노력을 했습니다. 기본적인 정보만 미리 세팅하고 상세한 정보들은 필요할 때 만들거나 읽어오도록 하였기 때문에 코스트가 크지 않습니다 Q A 신기루그리드를 누군가 터치했을 때 인스턴스를 새로만든다면 새로 만드는 연산에 비용코스트가 크지 않나요?
  • 97. 서버는 지리적으로는 영향력이 없기 때문에 문제가 생긴 서버에게 속한 객체가 정상적으로 동기화 되지 않는다는 문제점 정도는 있을 것이지만, 그 지역 자체에는 아무런 영향이 없습니다. Q A 특정 서버만이 오류가 있을 때 게임지리적으로 같은 곳에 객체가 존 재하는 다른 서버도 같이 영향을 받을텐데 이는 어떻게 해결하실 생 각인가요?
  • 98. 아직 글로벌 서비스에 대한 준비가 완벽하지 않아서 확실하게 답변 드릴 수 있는 부분이 아닌 것 같습니다. 모바일 통신 환경에서는 기본적으로 latency가 클 수 밖에 없기 때문에 항상 높은 latenc를 가정하고 게임을 디자인하고 있습니다. Q A 서로 다른 지역에서 플레이 하는 사람은 해당 지역의 서버에 접속을 하나요? 그렇다면 서버간 통신 latency가 큰 경우에 어떤 문제가 생 길 수 있나요?
  • 99. 최초로 active 상태가 되는 것은 유저의 선택 (인터랙션)에 의해서 이루어 집니다. 단순히 내부적 상태가 변하는 것은 저희도 이 때 처리하고 있습니다만, 이 세션에서 설명드린 부분은 시간에 따라 외형이 변하는 객체들 입니다. 모닥불이 활활 타고 있는 것 같지만 실제로는 꺼져있는 상태는 유저에게 혼란을 줄 수 있어 그렇게 할 수 없었습니다. Q A 시간에 따라 상태가 변경되는 지형물은 스케줄러에 등록해놓고 매번 처리하지말고, 최초 로 active상태가 될때 누적된 처리를 한번에 해 주면 어떤 문제가 있나요?
  • 100. 일단 분산된 서버라는 것 자체가 원래 있던 서버에 접속할 필요가 없게 만들어야 합니다. 재접속 할 때에는 원래 접속했던 서버에 접속할 확률이 낮기 때문에 언제나 관련된 정보는 DB에 저장해 두고 필요할 때마다 꺼내기 쉽게 해 놓았습니다. Q A 중앙서버가 없다면 비원활 네트워크 상황이 발생했을 경우, 원래 로 그인했던 게임서버에 재접속이 된다는 보장이 없을 텐데, 다른 게임 서버에 재접속 됐을 경우 예전 게임서버에 남아있는 유저의 정보와, 새로 로그인되는 유저의 정보는 어떻게 처리되는지 궁금합니다.
  • 101. 유저의 이동은 BASE 트랜잭션으로 저장하지 않고 각 소유권이 인정된 서버에서 알아서 처리하기 때문에 Eventual consistency 로 처리하지 않습니다. 그리고 각 개체는 겹쳐있는 것을 허용하기 때문에 충돌이 일어나지 않습니다. Q A 서로 다른 서버에 있는 두 유저가 동시에 같은 장소로 이동할 경우 Eventual Consistency로 처리 되면 위치가 충돌하지 않을까요?
  • 102. 쉽게 답변드릴 수 없는 부분인 것 같습니다. Q A 듀랑고 정도의 서버 프로그래밍의 예상 개발시간 소요는 어느정도일까요
  • 103. iOS 노티피케이션은 큐를 통해서 처리하지 않습니다. 큐에 작업을 넣을 때 필요한 경우 푸쉬(노티피케이션)을 따로 보내고 있습니다. Q A 오프라인인 유저가 접속해야 있던 큐를 처리하면, 오프라인인 유저 는 iOS 노티피케이션을 받을 수 없나요?
  • 104. 누군가가 해당 지역을 처음으로 목격했을 때 로드됩니다. 해당 서버에서 그 지역에 관심 있는 객체가 하나도 존재하지 않게 되면 다시 누군가 목격할 때 까지는 메모리에서 해제합니다. Q A 외형 캐시가 서버에 로드되는 시점이 언제인가요?
  • 105. DB의 특정 노드에 장애가 난 상태에서 일부 DB 작업이 실패하는데 전체 서비스가 망가지진 않지만 일부 동작이 망가질 순 있습니다. DB 자체는 persistent 합니다. Q A 오프라인 유저에 대한 지연된 업데이트를 위해 DB큐를 둔다고 하셨 는데요. 해당 큐에 장애가 나는 경우에도 대비되어있나요? 오프라인 유저의 지연 업데이트를 위한 DB큐도 백업이 있나요? 해 당 DB큐에 장애가나면 데이터가 날아가버리지 않나요?Q
  • 106. 게임 서버는 파이썬으로만 구성되어있습니다. 게임 서버 이외의 워커들엔 C#도 쓰고 있습니다. Q A 듀랑고 서버는 파이썬으로만 구성 되어 있나요?
  • 107. 네 그렇습니다. 다만 3로 옮기는 것을 고려 중 입니다. Q A 파이썬 2.7에 gevent를 계속 사용하고 있나요?
  • 108. 파이썬의 라이브러리 생태계가 아주 잘 이루어져 있기 때문이었습니다 Q A 서버 개발 언어로 분산에 최적화된 여러 언어가 아닌(얼랭이라던가) 파이썬을 고른 이유는 무엇인가요?
  • 109. 저희는 NoSQL인 Couchbase를 사용하고 있습니다. Q A db는 awa의 rds를 쓰시나요? 다이나모를 쓰시나요 rds를 쓰신다 면 어떤 엔진을 쓰시고 그 엔진을 쓰신 이유가 있다면?
  • 110. 네 그렇습니다. Q A 사용하는 파이썬 구현체는 무엇인가요? (only cpython?)
  • 111. 아직 확정되지 않은 부분이라 답변 드리지 못함을 양해 부탁드립니다. Q A 랭킹시스템이 들어간다면 어떻게 구현을 하실 생각인가요?