SlideShare a Scribd company logo
1 of 71
마비노기 영웅전자이언트 서버의 비밀 ㈜넥슨 영웅전 런칭팀 양승명 sequoia@nexon.co.kr
발표자 소개 @sequoiaxp 양승명 2002~2005 “다크에덴” 서버 프로그래머 2007~2010 “마비노기 영웅전” 서버 프로그래머 2010~현재 “마비노기 영웅전” 개발 매니저
마비노기 영웅전 소개
자이언트 서버? 자이언트 노예
이 발표의 목적 자랑(x) 단일 서버 아키텍처 구현 및 운용 노하우 공유 뼈 아픈 자아 성찰 자이언트 서버 구현 결산
경고!! 이 발표는 프로그래밍 세션입니다. 미디어, 업계 외에 계시거나 프로그래밍에 전문 지식이 없을 경우 유용한 내용이 적을 수 있습니다.
목차 01. 소개 (이미 했음) 02. 초기 계획 03. 구현 중 이슈 04. 런칭 후 알게 된 것 05. 결산
일단 자랑
자랑 아님
깜짝 퀴즈 이 날 문제가 된 요소는 무엇이었을까요?
초기 계획2007년 초
“단일 서버로 만들자” 커뮤니티 단절 신규 유저 장벽 운영 비용 기술적 도전과제
사실은 개발 초기 기획에는 MMO요소가 없었어요. 단일 서버를 결정할 수 있었던 자신감의 근원
설계 목표Scale-out아키텍처 서버를 추가하면 성능이 증가하는 분산 처리 아키텍처
분산 처리 아키텍처? 서로 다른 서버들 간의 역할분담이 핵심
기존의역할 분담 로그인 서버, 게임 서버, 캐시 서버, NPC서버 1채널, 2채널, 3채널 K대륙 서버, E대륙 서버, 인스턴스던전 서버
기존 아키텍처들 특정 서버가 병목이 될 수밖에 없거나, 늘어난 서버를 유저에게 노출시켜야 하거나, 게임 디자인 상 서버를 추가하기가 어렵다.
설계 목표 추가 구현이나 디자인 변경 없이 서버 추가만으로 수용량을 증가시킬 수 있는 아키텍처
실마리 발견
GPG 5권 6.1 “서비스 기반 아키텍처” 아이템 서비스, 전투 서비스, AI 서비스…
Service Frontend Service 통합네트워크 Service
역할을 서비스로 분담 가능한 작은 기능 단위를 서비스로 구현 한 서비스에 대한 부하 최소화 부하가 심할 것 같은 서비스는 여러 개 띄워서 부하 분산 “통합 네트워크”가 서비스 간 통신을 중개
액션 플랜 통합 네트워크만 구현하면, 필요한 기능들을 서비스로 추가해서, 아키텍처를 확장할 수 있겠다.
통합 네트워크 구현
통합 네트워크 라이브러리 서비스 구현 및 서비스 간 통신 지원 서비스의 물리적인 위치를 게임 로직이 몰라도 되도록 구현
오퍼레이션 서비스가 제공하는 기능 단위 항상 성공하거나 실패하는 것을보장
Service Operation Frontend Service 통합네트워크 Service Backend
위치 서비스 서비스의 실제 위치를 다루는 서비스 서비스가 뜰 때 위치 서비스에 직접 등록 오퍼레이션을 요청할 때 통합 네트워크 라이브러리가 위치 서비스에 자동으로 접속
Location Execution 클라이언트 Frontend Service Backend Service
네트워크 레이어 구현 오퍼레이션을 지원하는 네트워크 모듈 구현 하나의 TCP연결을 통해 여러 오퍼레이션 동시 처리 필요 서비스 간 TCP 연결 내에서 멀티플렉싱  가상 “파이프”구현 파이프를 통해서 오퍼레이션 처리
Operation Layer Pipe Layer TCP/IP CORE
“Process” Operation Processor “Request” Operation Processor PIPE “yield” 코루틴 사용 TCP Connection
게임 로직 코드 (예: 아이템 파기 코드) DestroyItem op = new DestoryItem(cid, slot); op.Success += () =>{ 성공 메시지 전달; }; op.Fail += () => { 실패 메시지 전달; }; RequestOperation(“ItemService”, op); 실제 코드와는 차이가 있습니다.
개발 프로세스 책임을 맡은 서비스를 구현 그 서비스가 처리할 오퍼레이션들을 구현 클라이언트의 요청에 따라 적당한 오퍼레이션을 호출  결과를 클라이언트에 전달
그리고 게임 로직을열심히 만들었습니다.
1년여 뒤(2008년)
사내테스트 당시 Party Service Frontend Service Unified Network Story Service Character Service Microplay Service Item Service Postal Service Quest Service
사내 서비스 후 생각보다 저조한 성능 서비스 1종 = 물리적 서버 1대로도 부족  이대로는 단일서버 서비스 불가
그래서통합 네트워크 개선 작업 1) 성능 향상  다루지 않음 2) 동일한 서비스를 여러 개 띄운 경우 분산 매커니즘 구현  병목이 되는 서비스를 여러 서버 기계에 걸쳐서 여러 개 띄울 수 있도록
분산 매커니즘 구현
서비스에 오퍼레이션 요청 DestroyItem op = new DestoryItem(cid, slot); RequestOperation(“ItemService”, op); 아이템 서비스가 여러 개면?  둘 이상의 서비스가 같은 아이템에 접근 한 아이템은 한 서비스가 처리하도록 보장하는 매커니즘 필요
엔티티 분산 처리의 단위 “한 캐릭터의 인벤토리 전체” “한 캐릭터의 우편함 전체” “전투 1회” 등을 하나의 엔티티로 구현 하나의 엔티티는 한 서비스에서 담당
엔티티 오퍼레이션 Service Service Operation Entity Entity Entity Entity Operation Entity Entity Entity Entity
엔티티 획득 같은 종류의 서비스가 여러 개 있는 경우  엔티티 중복 로드 방지 프로토콜 DB를 통해 동기화 유지
엔티티 간 연결 유지 엔티티 찾기 매커니즘이복잡하고 비싸다  오퍼레이션을 보낼 때마다 엔티티를 새로 찾으면 낭비 엔티티 간에 파이프를 열어두고 유지 엔티티가필요없어지면  모든 연결을 닫고 엔티티언로드 	 로그아웃, 전투 종료 등
변경된 게임 로직 코드 (로그인할 때) ItemConnection = service.Connect(clientEntity, cid, “ItemService”); (아이템 파기) DestroyItem op = new DestoryItem(slot); op.Success += () => { 성공 메시지 전달; }; op.Fail += () => { 실패 메시지 전달; }; ItemConnection.Request(op); CID가 오퍼레이션에서 사라짐
크게 보면 이런 모양
엔티티 모델 구현 성공 이제 아이템 서비스가 느리면 아이템 서비스를 열 개 띄우고,  캐릭터 서비스가 느리면 캐릭터 서비스를 열 개 띄우고…
추가 기능 오퍼레이션 싱크: 다른 오퍼레이션이 끝날 때까지 기다렸다가 그 결과를 사용해서 처리 엔티티옵저버: 엔티티가 변경되면 다른 서비스의 엔티티에 알림
어쨌든이 상태로 그랜드 오픈2010년 1월
자랑 아님
깜짝 퀴즈 이 날 문제가 된 요소는 무엇이었을까요?
답 : DB 로그 DB에 과량의 로그가 INSERT 모든 서비스가 같은 DB에 접속
DB의 scale out을 간과!! 사실은 방법이 없었던 건 아니지만… 아직도 DB는 영웅전 게임서버의 병목 타개하기 위해 여러 가지 시도 중 일단 좋은 사양의 서버로 커버
아키텍처의 문제 서버라고 문제 없는 건 아니에요…
엔티티릭 커넥션 카운팅으로언로드 	순환 참조 문제 언로드 조건 변경  댕글링엔티티 분산 GC를 돌릴수도 없고…
랙 전파 오퍼레이션이 다른 오퍼레이션을 기다림 한 서비스만이라도 느리면 연쇄적으로 모든 서비스의 대기 큐가 길어짐 일부 오퍼레이션은 근본적으로 많은 오퍼레이션을 기다림  캐릭터 로그인, 배 띄우기등  항해노기, 배 띄우다 시간 초과…
오퍼레이션 폭발 한 엔티티에 너무 많은 옵저버 엔티티의 변경이 너무 많은 서비스에 영향 엔티티가 자주 바뀌면 DOS효과
오퍼레이션 오버헤드 메시지 시리얼라이즈가 여전히 부담 실제 프로세싱보다 오퍼레이션 자체가 늘어나는 게 성능에 악영향 서비스를 너무 세분화한 게 역효과
서비스 간 로드 밸런싱 같은 종류의 서비스 사이의 로드 밸런싱 랜덤에 의존한 유니폼 로드 밸런싱  서버 머신 간에 사양 차이가 있는 경우? 적응형 로드 밸런싱 필요
프론트엔드 비대화 클라이언트가 요청  프론트엔드가 오퍼레이션으로 변환  프론트엔드가 오퍼레이션 결과 처리 프론트엔드가 거의 모든 로직을 내장  메시지 시리얼라이즈만도 바쁜데…  I/O 로드와 CPU로드가 모두 과다 지금도 프론트엔드가 가장 바쁜 서비스
기타 알 수 없는 문제 아키텍처의 복잡도에 비해 진단 프레임워크가 약함  문제 발생 시 추적이 어려움 실제로 런칭 후 수 개월 간 서버 불안정
자이언트 서버 총평 바닥부터 만든 닷넷 기반 엔진 유연한 scale out이 가능한 아키텍처 구현 성능은 만족스럽지 못하다
더 잘할 수 있었는데… 네트워크 부하를 줄이는 방향으로 서비스 분할 병목/부하 실시간 모니터링 및 제어 DB 최적화 및 분산 투명 프론트엔드 기반 컨텐츠 아키텍처
다루지 못한 주제들 닷넷언어로 서버 만들기 섀도우 채널 및 MMO 마을 단일 스레드로직아키텍처 및 멀티스레딩 P2P 지원 아키텍처 및 미들웨어 컨텐츠로직 프레임워크 닷넷 메시지 시리얼라이즈 최적화
Q&A 게임 서비스 운영 관련 질문, 게임 디자인 관련 질문이나 세션 내용과 관계없는 질문은 삼가 주시기 바랍니다.
영웅전 관련 세션 5월 30일 월요일 5월 31일 화요일 6월 1일 수요일 6월 3일 금요일

More Related Content

What's hot

테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지강 민우
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCHo Gyu Lee
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직Hoyoung Choi
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012devCAT Studio, NEXON
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략YEONG-CHEON YOU
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019devCAT Studio, NEXON
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조Hyunjik Bae
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Esun Kim
 
NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기Hoyoung Choi
 
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기강 민우
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델Seungmo Koo
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architectureJongwon Kim
 
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 IOCPSeungmo Koo
 

What's hot (20)

테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기
 
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
 
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
 

Similar to NDC 11 자이언트 서버의 비밀

[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)Sang Don Kim
 
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...문기 박
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드Jeongsang Baek
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementationuEngine Solutions
 
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해Terry Cho
 
Meetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsMeetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsminseok kim
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉iFunFactory Inc.
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료ssuser776e2d
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피ssuser776e2d
 
Netty 시작하기 (1)
Netty 시작하기 (1)Netty 시작하기 (1)
Netty 시작하기 (1)Daehyun Kim
 
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...hoondong kim
 
[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기NAVER D2
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례if kakao
 
Infra as Code with Packer, Ansible and Terraform
Infra as Code with Packer, Ansible and TerraformInfra as Code with Packer, Ansible and Terraform
Infra as Code with Packer, Ansible and TerraformInho Kang
 
댓글 플러그인 아포가토
댓글 플러그인 아포가토댓글 플러그인 아포가토
댓글 플러그인 아포가토Goonoo Kim
 
Micro Service Architecture의 이해
Micro Service Architecture의 이해Micro Service Architecture의 이해
Micro Service Architecture의 이해Terry Cho
 
Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015Kris Jeong
 
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료beom kyun choi
 
2016 NDC - 클라우드 시대의 모바일 게임 운영 플랫폼 구현
2016 NDC  - 클라우드 시대의  모바일 게임 운영 플랫폼 구현2016 NDC  - 클라우드 시대의  모바일 게임 운영 플랫폼 구현
2016 NDC - 클라우드 시대의 모바일 게임 운영 플랫폼 구현iFunFactory Inc.
 

Similar to NDC 11 자이언트 서버의 비밀 (20)

[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
 
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementation
 
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
 
Meetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsMeetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vs
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피
 
Netty 시작하기 (1)
Netty 시작하기 (1)Netty 시작하기 (1)
Netty 시작하기 (1)
 
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
 
[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
 
Infra as Code with Packer, Ansible and Terraform
Infra as Code with Packer, Ansible and TerraformInfra as Code with Packer, Ansible and Terraform
Infra as Code with Packer, Ansible and Terraform
 
댓글 플러그인 아포가토
댓글 플러그인 아포가토댓글 플러그인 아포가토
댓글 플러그인 아포가토
 
Micro Service Architecture의 이해
Micro Service Architecture의 이해Micro Service Architecture의 이해
Micro Service Architecture의 이해
 
Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015
 
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
 
2016 NDC - 클라우드 시대의 모바일 게임 운영 플랫폼 구현
2016 NDC  - 클라우드 시대의  모바일 게임 운영 플랫폼 구현2016 NDC  - 클라우드 시대의  모바일 게임 운영 플랫폼 구현
2016 NDC - 클라우드 시대의 모바일 게임 운영 플랫폼 구현
 

NDC 11 자이언트 서버의 비밀

  • 1. 마비노기 영웅전자이언트 서버의 비밀 ㈜넥슨 영웅전 런칭팀 양승명 sequoia@nexon.co.kr
  • 2. 발표자 소개 @sequoiaxp 양승명 2002~2005 “다크에덴” 서버 프로그래머 2007~2010 “마비노기 영웅전” 서버 프로그래머 2010~현재 “마비노기 영웅전” 개발 매니저
  • 5.
  • 6.
  • 7. 이 발표의 목적 자랑(x) 단일 서버 아키텍처 구현 및 운용 노하우 공유 뼈 아픈 자아 성찰 자이언트 서버 구현 결산
  • 8. 경고!! 이 발표는 프로그래밍 세션입니다. 미디어, 업계 외에 계시거나 프로그래밍에 전문 지식이 없을 경우 유용한 내용이 적을 수 있습니다.
  • 9. 목차 01. 소개 (이미 했음) 02. 초기 계획 03. 구현 중 이슈 04. 런칭 후 알게 된 것 05. 결산
  • 11.
  • 13. 깜짝 퀴즈 이 날 문제가 된 요소는 무엇이었을까요?
  • 15. “단일 서버로 만들자” 커뮤니티 단절 신규 유저 장벽 운영 비용 기술적 도전과제
  • 16. 사실은 개발 초기 기획에는 MMO요소가 없었어요. 단일 서버를 결정할 수 있었던 자신감의 근원
  • 17. 설계 목표Scale-out아키텍처 서버를 추가하면 성능이 증가하는 분산 처리 아키텍처
  • 18. 분산 처리 아키텍처? 서로 다른 서버들 간의 역할분담이 핵심
  • 19. 기존의역할 분담 로그인 서버, 게임 서버, 캐시 서버, NPC서버 1채널, 2채널, 3채널 K대륙 서버, E대륙 서버, 인스턴스던전 서버
  • 20. 기존 아키텍처들 특정 서버가 병목이 될 수밖에 없거나, 늘어난 서버를 유저에게 노출시켜야 하거나, 게임 디자인 상 서버를 추가하기가 어렵다.
  • 21. 설계 목표 추가 구현이나 디자인 변경 없이 서버 추가만으로 수용량을 증가시킬 수 있는 아키텍처
  • 23. GPG 5권 6.1 “서비스 기반 아키텍처” 아이템 서비스, 전투 서비스, AI 서비스…
  • 24. Service Frontend Service 통합네트워크 Service
  • 25. 역할을 서비스로 분담 가능한 작은 기능 단위를 서비스로 구현 한 서비스에 대한 부하 최소화 부하가 심할 것 같은 서비스는 여러 개 띄워서 부하 분산 “통합 네트워크”가 서비스 간 통신을 중개
  • 26. 액션 플랜 통합 네트워크만 구현하면, 필요한 기능들을 서비스로 추가해서, 아키텍처를 확장할 수 있겠다.
  • 28. 통합 네트워크 라이브러리 서비스 구현 및 서비스 간 통신 지원 서비스의 물리적인 위치를 게임 로직이 몰라도 되도록 구현
  • 29. 오퍼레이션 서비스가 제공하는 기능 단위 항상 성공하거나 실패하는 것을보장
  • 30. Service Operation Frontend Service 통합네트워크 Service Backend
  • 31. 위치 서비스 서비스의 실제 위치를 다루는 서비스 서비스가 뜰 때 위치 서비스에 직접 등록 오퍼레이션을 요청할 때 통합 네트워크 라이브러리가 위치 서비스에 자동으로 접속
  • 32. Location Execution 클라이언트 Frontend Service Backend Service
  • 33. 네트워크 레이어 구현 오퍼레이션을 지원하는 네트워크 모듈 구현 하나의 TCP연결을 통해 여러 오퍼레이션 동시 처리 필요 서비스 간 TCP 연결 내에서 멀티플렉싱  가상 “파이프”구현 파이프를 통해서 오퍼레이션 처리
  • 34. Operation Layer Pipe Layer TCP/IP CORE
  • 35. “Process” Operation Processor “Request” Operation Processor PIPE “yield” 코루틴 사용 TCP Connection
  • 36. 게임 로직 코드 (예: 아이템 파기 코드) DestroyItem op = new DestoryItem(cid, slot); op.Success += () =>{ 성공 메시지 전달; }; op.Fail += () => { 실패 메시지 전달; }; RequestOperation(“ItemService”, op); 실제 코드와는 차이가 있습니다.
  • 37. 개발 프로세스 책임을 맡은 서비스를 구현 그 서비스가 처리할 오퍼레이션들을 구현 클라이언트의 요청에 따라 적당한 오퍼레이션을 호출  결과를 클라이언트에 전달
  • 38. 그리고 게임 로직을열심히 만들었습니다.
  • 40. 사내테스트 당시 Party Service Frontend Service Unified Network Story Service Character Service Microplay Service Item Service Postal Service Quest Service
  • 41. 사내 서비스 후 생각보다 저조한 성능 서비스 1종 = 물리적 서버 1대로도 부족  이대로는 단일서버 서비스 불가
  • 42. 그래서통합 네트워크 개선 작업 1) 성능 향상  다루지 않음 2) 동일한 서비스를 여러 개 띄운 경우 분산 매커니즘 구현  병목이 되는 서비스를 여러 서버 기계에 걸쳐서 여러 개 띄울 수 있도록
  • 44. 서비스에 오퍼레이션 요청 DestroyItem op = new DestoryItem(cid, slot); RequestOperation(“ItemService”, op); 아이템 서비스가 여러 개면?  둘 이상의 서비스가 같은 아이템에 접근 한 아이템은 한 서비스가 처리하도록 보장하는 매커니즘 필요
  • 45. 엔티티 분산 처리의 단위 “한 캐릭터의 인벤토리 전체” “한 캐릭터의 우편함 전체” “전투 1회” 등을 하나의 엔티티로 구현 하나의 엔티티는 한 서비스에서 담당
  • 46. 엔티티 오퍼레이션 Service Service Operation Entity Entity Entity Entity Operation Entity Entity Entity Entity
  • 47. 엔티티 획득 같은 종류의 서비스가 여러 개 있는 경우  엔티티 중복 로드 방지 프로토콜 DB를 통해 동기화 유지
  • 48. 엔티티 간 연결 유지 엔티티 찾기 매커니즘이복잡하고 비싸다  오퍼레이션을 보낼 때마다 엔티티를 새로 찾으면 낭비 엔티티 간에 파이프를 열어두고 유지 엔티티가필요없어지면  모든 연결을 닫고 엔티티언로드  로그아웃, 전투 종료 등
  • 49. 변경된 게임 로직 코드 (로그인할 때) ItemConnection = service.Connect(clientEntity, cid, “ItemService”); (아이템 파기) DestroyItem op = new DestoryItem(slot); op.Success += () => { 성공 메시지 전달; }; op.Fail += () => { 실패 메시지 전달; }; ItemConnection.Request(op); CID가 오퍼레이션에서 사라짐
  • 51. 엔티티 모델 구현 성공 이제 아이템 서비스가 느리면 아이템 서비스를 열 개 띄우고, 캐릭터 서비스가 느리면 캐릭터 서비스를 열 개 띄우고…
  • 52. 추가 기능 오퍼레이션 싱크: 다른 오퍼레이션이 끝날 때까지 기다렸다가 그 결과를 사용해서 처리 엔티티옵저버: 엔티티가 변경되면 다른 서비스의 엔티티에 알림
  • 53. 어쨌든이 상태로 그랜드 오픈2010년 1월
  • 54.
  • 56. 깜짝 퀴즈 이 날 문제가 된 요소는 무엇이었을까요?
  • 57. 답 : DB 로그 DB에 과량의 로그가 INSERT 모든 서비스가 같은 DB에 접속
  • 58. DB의 scale out을 간과!! 사실은 방법이 없었던 건 아니지만… 아직도 DB는 영웅전 게임서버의 병목 타개하기 위해 여러 가지 시도 중 일단 좋은 사양의 서버로 커버
  • 59. 아키텍처의 문제 서버라고 문제 없는 건 아니에요…
  • 60. 엔티티릭 커넥션 카운팅으로언로드 순환 참조 문제 언로드 조건 변경  댕글링엔티티 분산 GC를 돌릴수도 없고…
  • 61. 랙 전파 오퍼레이션이 다른 오퍼레이션을 기다림 한 서비스만이라도 느리면 연쇄적으로 모든 서비스의 대기 큐가 길어짐 일부 오퍼레이션은 근본적으로 많은 오퍼레이션을 기다림  캐릭터 로그인, 배 띄우기등  항해노기, 배 띄우다 시간 초과…
  • 62. 오퍼레이션 폭발 한 엔티티에 너무 많은 옵저버 엔티티의 변경이 너무 많은 서비스에 영향 엔티티가 자주 바뀌면 DOS효과
  • 63. 오퍼레이션 오버헤드 메시지 시리얼라이즈가 여전히 부담 실제 프로세싱보다 오퍼레이션 자체가 늘어나는 게 성능에 악영향 서비스를 너무 세분화한 게 역효과
  • 64. 서비스 간 로드 밸런싱 같은 종류의 서비스 사이의 로드 밸런싱 랜덤에 의존한 유니폼 로드 밸런싱  서버 머신 간에 사양 차이가 있는 경우? 적응형 로드 밸런싱 필요
  • 65. 프론트엔드 비대화 클라이언트가 요청  프론트엔드가 오퍼레이션으로 변환  프론트엔드가 오퍼레이션 결과 처리 프론트엔드가 거의 모든 로직을 내장  메시지 시리얼라이즈만도 바쁜데…  I/O 로드와 CPU로드가 모두 과다 지금도 프론트엔드가 가장 바쁜 서비스
  • 66. 기타 알 수 없는 문제 아키텍처의 복잡도에 비해 진단 프레임워크가 약함  문제 발생 시 추적이 어려움 실제로 런칭 후 수 개월 간 서버 불안정
  • 67. 자이언트 서버 총평 바닥부터 만든 닷넷 기반 엔진 유연한 scale out이 가능한 아키텍처 구현 성능은 만족스럽지 못하다
  • 68. 더 잘할 수 있었는데… 네트워크 부하를 줄이는 방향으로 서비스 분할 병목/부하 실시간 모니터링 및 제어 DB 최적화 및 분산 투명 프론트엔드 기반 컨텐츠 아키텍처
  • 69. 다루지 못한 주제들 닷넷언어로 서버 만들기 섀도우 채널 및 MMO 마을 단일 스레드로직아키텍처 및 멀티스레딩 P2P 지원 아키텍처 및 미들웨어 컨텐츠로직 프레임워크 닷넷 메시지 시리얼라이즈 최적화
  • 70. Q&A 게임 서비스 운영 관련 질문, 게임 디자인 관련 질문이나 세션 내용과 관계없는 질문은 삼가 주시기 바랍니다.
  • 71. 영웅전 관련 세션 5월 30일 월요일 5월 31일 화요일 6월 1일 수요일 6월 3일 금요일