SlideShare a Scribd company logo
분산 환경을 위한 ORM
개발 경험 공유
아이펀팩토리 / 엔진 개발팀
남승현
2018 iFunFactory Dev Day
Contents. 01 발표 소개
02 분산 환경을 위한 ORM
04 구현: 코드 자동 생성
05 구현: 이벤트 시스템
06 구현: 비동기 I/O
07 구현: 캐시
08 구현: 잠금(Lock)
09 구현: 분산 환경 – 캐시와 잠금
03 구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
발표 소개
01
2018 iFunFactory Dev Day
• 흔치 않은 개발 사례
• 게임 서버 개발 기간 단축
• 구현된 ORM 소개
• 주요 구현을 방법론 수준으로 소개
발표 소개
2018 iFunFactory Dev Day
분산 환경을 위한 ORM
02 구현된 시스템 소개
2018 iFunFactory Dev Day
ORM 이란?
데이터베이스를 SQL 이 아니라 프로그래밍
언어의 객체로 다룰 수 있게 해주는 기술
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
SQL 사용 예
ORM 사용 예
출처 - Wikipedia
출처 - Wikipedia
2018 iFunFactory Dev Day
개발 동기
• 단순 반복 Database 작업
1. Table
2. Stored Procedure/SQL
3. SQL 호출 코드
게임 콘텐츠 로직만 구현할 수 없을까?
• 게임 서버 개발 생산성 향상
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
개발 목표
• SQL 작업 제거
• 분산 환경
• 충분한 성능
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
구현된 시스템 소개 – 주요 기능
• SQL 처리 자동화
• 잠금(Lock)
• 캐시
• 분산 환경에서 동일한 작동
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
구현된 시스템 소개 – 구조도
이벤트 시스템
오브젝트
캐시
오브젝트
잠금
오브젝트
저널
오브젝트 인터페이스(자동 생성)
오브젝트
DB/RPC
서비스
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
구현된 시스템 소개 – 사용 방법
1. JSON 으로 모델 정의
예)
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
구현된 시스템 소개 – 사용 방법
2. 빌드
코드 생성 프로그램이 모델을 이용해 코드 생성
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
구현된 시스템 소개 – 사용 방법
3. 자동 생성된 인터페이스 Class 사용
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
자동 생성된 인터페이스 Class 예)
2018 iFunFactory Dev Day
자동 생성된 인터페이스 Class 사용 예)
2018 iFunFactory Dev Day
구현: 일반화된 오브젝트
03
2018 iFunFactory Dev Day
class Objectclass Character 참조
• 모든 타입의 오브젝트를 표현
• 자동 생성된 인터페이스 Class 는 단순 Wrapper
class Object
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
자동 생성된 class Character 예)
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
class Model
JSON 으로 기술된 모델을 C++ 코드로 표현
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
class Model
2018 iFunFactory Dev Day
class Model
SQL 을 런타임에 자동 생성 가능하게 함
CREATE TABLE {object-name}
{attribute-name} {type},
{attribute-name} {type},
…
“Character”
“Name CHAR(12)”
“Level INT”
UPDATE {object-name} SET {attribute-name} = {value} WHERE object_id = {object-id}
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
class Model
SQL 을 런타임에 자동 생성 가능하게 함
구현: 일반화된 오브젝트
CREATE TABLE {object-name}
{attribute-name} {type},
{attribute-name} {type},
…
UPDATE {object-name} SET {attribute-name} = {value} WHERE object_id = {object-id}
“Character”
“Level INT”
“Name CHAR(12)”
2018 iFunFactory Dev Day
class Object, class Model 은 자동 생성되는 코드에서 사용
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
04 SQL 작업 자동화
SQL 처리 자동화 코드 및
인터페이스 코드 생성
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
코드 자동 생성
코드 생성 스크립트
모델(JSON) 을 입력 받아 C++ 코드 생성
JSON
코드 생성기
(Python)
Model 생성
인터페이스
Class
<입력>
<출력>
2018 iFunFactory Dev Day
• JSON 으로 표현
• 오브젝트 이름
• 오브젝트의 어트리뷰트와 타입
• Key 라고 부르는 특별한 어트리뷰트 존재
• Key 는 SQL 의 PRIMARY KEY 와 같다
• Key 를 이용하여 오브젝트를 읽을 수 있다
코드 자동 생성
입력: 모델 정의
2018 iFunFactory Dev Day
입력: 모델 정의
코드 자동 생성
예)
2018 iFunFactory Dev Day
출력: C++ 코드
서버 프로그램 빌드 시 실행
• Model 생성 및 등록 코드
• 인터페이스 Class 코드
코드 자동 생성
2018 iFunFactory Dev Day
코드 자동 생성
출력: C++ 코드 – Model 생성 및 등록
• class Model 의 인스턴스를 생성하여 시스템에 등록
• 등록된 모델 정보를 이용하여 런타임에 SQL 생성 가능
2018 iFunFactory Dev Day
코드 자동 생성
출력: C++ 코드 – Model 생성 및 등록
예)
2018 iFunFactory Dev Day
코드 자동 생성
출력: C++ 코드 - 인터페이스 Class
• 프로그래머 사용하는 유일한 인터페이스
• 오브젝트 생성 함수 – Create()
• 오브젝트를 불러오는 함수 – Fetch()
DB I/O, 잠금, 캐시 등의 처리를 내부에서 수행
• 오브젝트의 각 어트리뷰트를 읽고, 쓰는 함수 – Get()/Set()
SQL 쿼리 생성 및 호출을 내부에서 수행
2018 iFunFactory Dev Day
출력: 인터페이스 Class
예)
2018 iFunFactory Dev Day
코드 자동 생성
출력된 코드 사용 예) DB, 잠금, 캐시 등 자동으로 처리
2018 iFunFactory Dev Day
구현: 이벤트 시스템
05 트랜잭션 구현을 위한
이벤트 시스템
2018 iFunFactory Dev Day
구현: 이벤트 시스템
• 함수를 실행하는 스레드 풀
• 트랜잭션 구현을 위해 필요
2018 iFunFactory Dev Day
구현: 이벤트 시스템
이벤트 상태
• 실행 준비: 실행하기 위해 스레드를 기다림
• 실행: 스레드를 할당 받아 실행 중
• 중단(롤백): 오브젝트를 즉시 사용할 수 없는 경우 대기
• DB 에서 읽어와야 할 때
• 잠금을 얻을 수 없을 때
2018 iFunFactory Dev Day
구현: 이벤트 시스템
중단(롤백) 구현
C++ Exception Throw
오브젝트를 사용할 수 있을 때 다시 실행
2018 iFunFactory Dev Day
구현: 이벤트 시스템
1
2
3
중단(롤백) 구현
2018 iFunFactory Dev Day
구현: 이벤트 시스템
오브젝트 저널
• 이벤트 함수 안에서 오브젝트 수정은 임시 저장
• 중단(롤백) 시 임시 저장 내용 삭제
• 완료(완료) 시 캐시 및 Database 에 반영
2018 iFunFactory Dev Day
구현: 이벤트 시스템
단점
중단 전 코드 2번 이상 실행
2018 iFunFactory Dev Day
구현: 비동기 I/O
06 이벤트 시스템의 트랜잭션 활용
2018 iFunFactory Dev Day
구현: 비동기 I/O
비동기 I/O 발생
• 오브젝트를 접근할 때 Database 에서 읽어와야 할 때
• I/O 를 블록킹 방식으로 구현하면 처리량 급감
2018 iFunFactory Dev Day
구현: 비동기 I/O
비동기 I/O 구현
• C++ Exception 을 Throw 하여 이벤트 중단(롤백)
• Exception 객체에 I/O 작업을 저장
• I/O 완료 후 이벤트 함수 재실행
이벤트 시스템으로 구현됨
2018 iFunFactory Dev Day
구현: 비동기 I/O
문제
• 오브젝트를 접근하려면 매번 중단(롤백) 발생
• Exception Throw
• I/O 처리
-> 캐시로 해결
2018 iFunFactory Dev Day
구현: 캐시
07
2018 iFunFactory Dev Day
구현: 캐시
• 매번 Database 에서 읽는 것은 비효율
• I/O 처리 비용
• 이벤트 중단을 위한 Exception Throw 비용
• 일정 시간 동안 메모리에 보관
2018 iFunFactory Dev Day
구현: 캐시
캐시의 주요 구현
• 오브젝트 보관
• Key Attribute 에 대한 Index
• 제거 타이머
2018 iFunFactory Dev Day
구현: 캐시
자료구조
시간 복잡도: O(1)
2018 iFunFactory Dev Day
캐시에 오브젝트 입력 구현 예)
Character 오브젝트(Name: “devday”, Object-Id: 1234)
Key 로 지정된 “Name” 어트리뷰트
Name 이 “devday” 인 오브젝트의 Object ID
2018 iFunFactory Dev Day
캐시에 검색 구현 예)
Character 오브젝트(Name: “devday”, Object-Id: 1234)
Key 로 지정된 “Name” 어트리뷰트
Name 이 “devday” 인 오브젝트의 Object ID
2018 iFunFactory Dev Day
구현: 캐시
자료구조 - 단점
범위 검색 불가능
-> ordered_map(std::map) 으로 해결 가능
성능 하락
2018 iFunFactory Dev Day
구현: 캐시
제거 타이머
• 오브젝트를 캐시에서 접근 시 타이머 설정
• 모든 오브젝트에 타이머를 두면 성능 문제 발생
• 일정 시간 모아서 처리
2018 iFunFactory Dev Day
구현: 잠금(Lock)
08
2018 iFunFactory Dev Day
구현: 잠금
잠금 구현이 필요한 이유
• 한 오브젝트를 여러 이벤트에서 동시 수정 발생
• 캐시에 로드된 오브젝트는 SQL 의 잠금(Lock) 불가
• SQL 잠금은 DB 에 로직 구현 필요
• Database 샤딩 시 SQL 잠금 사용 어려움
2018 iFunFactory Dev Day
구현: 잠금
잠금의 종류
잠금은 이벤트 함수가 끝날 때까지 유효
• 복사본 읽기
• 읽기
• 쓰기
잠금을 획득할 수 없으면 이벤트 중단(롤백)
2018 iFunFactory Dev Day
구현: 잠금
문제: 데드락
각 이벤트에서 서로 다른 순서로 오브젝트에 접근
2018 iFunFactory Dev Day
구현: 잠금
다음 4 조건이 모두 만족되면 데드락 발생
• 상호배제
프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.
• 점유대기
프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.
• 비선점
프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.
• 순환대기
각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.
2018 iFunFactory Dev Day
구현: 잠금
데드락 회피를 위해 두 가지 방법 시도
• 타이머 이용 – 점유대기 방지
• 선점형 잠금 – 비선점 방지
2018 iFunFactory Dev Day
구현: 잠금
타이머 이용
데드락 조건 4 가지 중 점유 대기(Hold and wait) 방지
잠금을 획득할 수 없는 경우
• 획득한 모든 잠금 해제하고 이벤트 중단
• 일정시간 후 잠금이 풀렸기를 기대하며 이벤트 재호출
일정시간 = Exponental backoff 알고리즘
2018 iFunFactory Dev Day
구현: 잠금
타이머 이용 - 장점
구현이 쉬움
타이머 이용 - 단점
경합하는 오브젝트 수가 많으면 해결 불가
2018 iFunFactory Dev Day
구현: 잠금
섬점형 잠금
데드락 조건 4 가지 중 비선점(No preemption) 방지
• 모든 이벤트는 발생 시간에 의한 우선순위를 갖는다
• 먼저 발생된 이벤트는 늦게 발생된 이벤트가 중단 상태이면
잠금을 해제할 수 있다
2018 iFunFactory Dev Day
구현: 잠금
섬점형 잠금 – 데드락 회피 예)
이벤트1, 2 가 Object A, B 를 교차하여 쓰기 잠금 획득
2018 iFunFactory Dev Day
0
1
2
3
4
5
6
7
Time
이벤트1 생성 및 실행
ObjectA 잠금 획득 시도: 성공
Sleep 1
ObjectB 잠금 획득 시도: 실패
-> 이벤트2 의 ObjectB 잠금 해제 요청
중단(롤백)
재실행, ObjectA, B 잠금 획득 시도: 성공
처리 완료
이벤트2 생성 및 실행
ObjectB 잠금 획득 시도: 성공
Sleep 1
ObjectA 잠금 획득 시도: 실패
-> 잠금 해제 불가
중단(롤백), ObjectB 잠금 해제
재실행, ObjectB, A 잠금 획득 시도: 성공, 처리 완료
이벤트1 이벤트2
이벤트1, 2 가 Object A, B 를 교차하여 쓰기 잠금 획득
2018 iFunFactory Dev Day
구현: 잠금
선점형 잠금 - 장점
경합 빈도에 상관 없이 빠르고 일정한 성능
선점형 잠금 - 단점
경합이 없을 땐 타이머 방식 보다 느리다
상대적으로 구현이 어렵다
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
09
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
Zookeeper
• 오픈소스 분산 코디네이션 서버
• 클러스터를 구성하여 SPoF(Single point of failure) 를
만들지 않음
• 파일 시스템처럼 사용
경로를 지정하여 데이터 저장
• 오브젝트 소유권 관리
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
Zookeeper 를 이용한 오브젝트 소유권 관리
오브젝트 소유권 = 캐싱
오브젝트를 캐시에 입력하기 전
/objects/{object-id} 파일에 서버ID 저장
해당 경로에 이미 파일이 있으면 해당 서버의 캐시와 잠금 기능을
RPC 로 접근
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
Lease RPC
빌려올 오브젝트 ID 를 인자로 전달
수신한 서버는
• 해당 오브젝트 잠금 처리 + 타임아웃 설정
• 해당 오브젝트를 캐시에서 읽어 응답으로 전달
• 반납 RPC 수신 시 변경 사항이 있으면 반영
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
/objects/
┗1234 => “ServerA”
ID: 1234
Name: “devday”
Zookeeper
ServerA
Cache
ServerA 가 Character(Name:”devday”, Object-Id:1234) 캐싱
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
소유 확인
Lease RPC
Return RPC
/objects/
┗1234 => “ServerA”
Zookeeper
ID: 1234
Name: “devday”
ServerA
Cache
ServerB
Cache
1
2
3
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
캐시 적중률 문제
• Lease RPC 는 무겁다
• 오브젝트는 최대한 많이 접근하는 서버가 소유
해결
• 캐시는 각 오브젝트의 서버 별 접근 빈도 계산
• 더 높은 빈도의 서버 발견 시 타이머와 상관 없이 캐시에서 내린다
Q&A
2018 iFunFactory Dev Day
2018 iFunFactory Dev Day
Thank You!
경기도 성남시 분당구 대왕판교로 660, 유스페이스1 B동 606호 아이펀팩토리
info@ifunfactory.com +82-70-4923-6566 www.ifunfactory.com

More Related Content

What's hot (20)

PDF
웹 IDE 비교
Junyoung Lee
 
PPT
iFun Engine plugin 만들기 (for Stingray)
iFunFactory Inc.
 
PDF
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
NAVER Engineering
 
PPTX
[123] electron 김성훈
NAVER D2
 
PDF
20170813 django api server unit test and remote debugging
Jongwon Han
 
PPTX
C++ GUI 라이브러리 소개: Qt & Nana
Lazy Ahasil
 
PPTX
bamboo 로 PHP 프로젝트 지속적인 배포
KwangSeob Jeong
 
PDF
Cloud ide를 이용한_모바일_개발의_가능성과_전망
Sung-tae Ryu
 
PPTX
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
Jihyung Song
 
PDF
[145]5년간의네이버웹엔진개발삽질기그리고 김효
NAVER D2
 
PDF
파이콘 2017 그만퇴근합시다_이지호
Jiho Lee
 
PDF
이클립스 플랫폼
Kenu, GwangNam Heo
 
PPTX
[114]angularvs react 김훈민손찬욱
NAVER D2
 
PDF
[113]apache zeppelin 이문수
NAVER D2
 
PDF
Goorm소개
치규 황
 
PPTX
오픈소스 프로젝트 따라잡기_공개
Hyoungjun Kim
 
PDF
swig를 이용한 C++ 랩핑
NAVER D2
 
PDF
[Open-infradays 2019 Korea] jabayo on Kubeflow
석환 홍
 
PDF
Laravel로 스타트업 기술 스택 구성하기
KwangSeob Jeong
 
PDF
Open infradays 2019_msa_k8s
Hyoungjun Kim
 
웹 IDE 비교
Junyoung Lee
 
iFun Engine plugin 만들기 (for Stingray)
iFunFactory Inc.
 
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
NAVER Engineering
 
[123] electron 김성훈
NAVER D2
 
20170813 django api server unit test and remote debugging
Jongwon Han
 
C++ GUI 라이브러리 소개: Qt & Nana
Lazy Ahasil
 
bamboo 로 PHP 프로젝트 지속적인 배포
KwangSeob Jeong
 
Cloud ide를 이용한_모바일_개발의_가능성과_전망
Sung-tae Ryu
 
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
Jihyung Song
 
[145]5년간의네이버웹엔진개발삽질기그리고 김효
NAVER D2
 
파이콘 2017 그만퇴근합시다_이지호
Jiho Lee
 
이클립스 플랫폼
Kenu, GwangNam Heo
 
[114]angularvs react 김훈민손찬욱
NAVER D2
 
[113]apache zeppelin 이문수
NAVER D2
 
Goorm소개
치규 황
 
오픈소스 프로젝트 따라잡기_공개
Hyoungjun Kim
 
swig를 이용한 C++ 랩핑
NAVER D2
 
[Open-infradays 2019 Korea] jabayo on Kubeflow
석환 홍
 
Laravel로 스타트업 기술 스택 구성하기
KwangSeob Jeong
 
Open infradays 2019_msa_k8s
Hyoungjun Kim
 

Similar to [아이펀팩토리] 2018 데브데이 서버위더스 _02 분산 환경을 위한 ORM 개발 경험 공유 (20)

PDF
iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)
Changwon National University
 
PDF
2019 아이펀팩토리 Dev Day 세션2 아이펀엔진 개발 환경 설정하기 (Linux + VS Code) - 김진욱
iFunFactory Inc.
 
PDF
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
Jeongmin Cha
 
PPTX
windows via c++ Ch 5. Job
Hyosung Jeon
 
PDF
(OkdevTV) 2024년 9월 2일 개발 이야기 - 좋은 리팩토링 vs 나쁜 리팩토링
Jay Park
 
PPTX
7. html5 api
은심 강
 
PDF
장고로 웹서비스 만들기 기초
Kwangyoun Jung
 
PPTX
Java script의 이해
seungkyu park
 
PDF
REST API Development with Spring
Keesun Baik
 
PPTX
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
InfraEngineer
 
PPTX
Spring di chapter2
흥래 김
 
PPTX
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
nexusz99
 
PDF
Cep 소개 - for developers
Juhyeon Lee
 
PDF
Springcamp spring boot intro
Jae-il Lee
 
PDF
2019 아이펀팩토리 Dev Day 세션4 아이펀엔진에 MO 게임 콘텐츠 채워 넣기 - 남승현
iFunFactory Inc.
 
PDF
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
devCAT Studio, NEXON
 
PPTX
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스
 
PDF
(OKdevTV) 2024년 12월 5일 개발 이야기
Jay Park
 
PDF
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
Youngil Cho
 
PDF
[부스트캠프 Tech Talk] 이정현_Github Workflow 활용하기
CONNECT FOUNDATION
 
iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)
Changwon National University
 
2019 아이펀팩토리 Dev Day 세션2 아이펀엔진 개발 환경 설정하기 (Linux + VS Code) - 김진욱
iFunFactory Inc.
 
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
Jeongmin Cha
 
windows via c++ Ch 5. Job
Hyosung Jeon
 
(OkdevTV) 2024년 9월 2일 개발 이야기 - 좋은 리팩토링 vs 나쁜 리팩토링
Jay Park
 
7. html5 api
은심 강
 
장고로 웹서비스 만들기 기초
Kwangyoun Jung
 
Java script의 이해
seungkyu park
 
REST API Development with Spring
Keesun Baik
 
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
InfraEngineer
 
Spring di chapter2
흥래 김
 
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
nexusz99
 
Cep 소개 - for developers
Juhyeon Lee
 
Springcamp spring boot intro
Jae-il Lee
 
2019 아이펀팩토리 Dev Day 세션4 아이펀엔진에 MO 게임 콘텐츠 채워 넣기 - 남승현
iFunFactory Inc.
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
devCAT Studio, NEXON
 
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스
 
(OKdevTV) 2024년 12월 5일 개발 이야기
Jay Park
 
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
Youngil Cho
 
[부스트캠프 Tech Talk] 이정현_Github Workflow 활용하기
CONNECT FOUNDATION
 
Ad

More from iFunFactory Inc. (20)

PDF
2019 아이펀팩토리 Dev Day 세션5 아이펀엔진으로 만든 게임 성능 분석 및 디버깅 - 남승현
iFunFactory Inc.
 
PDF
2019 아이펀팩토리 Dev Day 세션3 아이펀엔진 개발 환경 설정하기 (Windows+ VS) - 김진욱
iFunFactory Inc.
 
PDF
2019 아이펀팩토리 Dev Day 세션1 네트워크 프로그래밍 개론 - 문대경 대표
iFunFactory Inc.
 
PDF
[아이펀팩토리] 2018 데브데이 서버위더스 _03 Scalable 한 게임 서버 만들기
iFunFactory Inc.
 
PDF
[아이펀팩토리] 2018 데브데이 서버위더스 _04 리눅스 게임 서버 성능 분석
iFunFactory Inc.
 
PDF
[아이펀팩토리] 클라이언트 개발자, 서버 개발 시작하기
iFunFactory Inc.
 
PDF
[아이펀팩토리] 2017 NDCP
iFunFactory Inc.
 
PPT
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
iFunFactory Inc.
 
PDF
게임서버 구축 방법비교 : GBaaS vs. Self-hosting
iFunFactory Inc.
 
PDF
유니티 쉐이더 단기속성
iFunFactory Inc.
 
PDF
게임 서버 성능 분석하기
iFunFactory Inc.
 
PDF
혼자서 만드는 MMO게임 서버
iFunFactory Inc.
 
PDF
Python과 AWS를 이용하여 게임 테스트 환경 구축하기
iFunFactory Inc.
 
PPTX
PC 와 모바일에서의 P2P 게임 구현에서의 차이점 비교
iFunFactory Inc.
 
PPTX
Docker 로 Linux 없이 Linux 환경에서 개발하기
iFunFactory Inc.
 
PPTX
게임 운영에 필요한 로그성 데이터들에 대하여
iFunFactory Inc.
 
PPTX
Make "PONG" : 아키텍팅과 동기화 테크닉
iFunFactory Inc.
 
PPTX
2016 NDC - 클라우드 시대의 모바일 게임 운영 플랫폼 구현
iFunFactory Inc.
 
PPTX
2016 NDC - 모바일 게임 서버 엔진 개발 후기
iFunFactory Inc.
 
PDF
iFun Deploy 소개
iFunFactory Inc.
 
2019 아이펀팩토리 Dev Day 세션5 아이펀엔진으로 만든 게임 성능 분석 및 디버깅 - 남승현
iFunFactory Inc.
 
2019 아이펀팩토리 Dev Day 세션3 아이펀엔진 개발 환경 설정하기 (Windows+ VS) - 김진욱
iFunFactory Inc.
 
2019 아이펀팩토리 Dev Day 세션1 네트워크 프로그래밍 개론 - 문대경 대표
iFunFactory Inc.
 
[아이펀팩토리] 2018 데브데이 서버위더스 _03 Scalable 한 게임 서버 만들기
iFunFactory Inc.
 
[아이펀팩토리] 2018 데브데이 서버위더스 _04 리눅스 게임 서버 성능 분석
iFunFactory Inc.
 
[아이펀팩토리] 클라이언트 개발자, 서버 개발 시작하기
iFunFactory Inc.
 
[아이펀팩토리] 2017 NDCP
iFunFactory Inc.
 
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
iFunFactory Inc.
 
게임서버 구축 방법비교 : GBaaS vs. Self-hosting
iFunFactory Inc.
 
유니티 쉐이더 단기속성
iFunFactory Inc.
 
게임 서버 성능 분석하기
iFunFactory Inc.
 
혼자서 만드는 MMO게임 서버
iFunFactory Inc.
 
Python과 AWS를 이용하여 게임 테스트 환경 구축하기
iFunFactory Inc.
 
PC 와 모바일에서의 P2P 게임 구현에서의 차이점 비교
iFunFactory Inc.
 
Docker 로 Linux 없이 Linux 환경에서 개발하기
iFunFactory Inc.
 
게임 운영에 필요한 로그성 데이터들에 대하여
iFunFactory Inc.
 
Make "PONG" : 아키텍팅과 동기화 테크닉
iFunFactory Inc.
 
2016 NDC - 클라우드 시대의 모바일 게임 운영 플랫폼 구현
iFunFactory Inc.
 
2016 NDC - 모바일 게임 서버 엔진 개발 후기
iFunFactory Inc.
 
iFun Deploy 소개
iFunFactory Inc.
 
Ad

[아이펀팩토리] 2018 데브데이 서버위더스 _02 분산 환경을 위한 ORM 개발 경험 공유

  • 1. 분산 환경을 위한 ORM 개발 경험 공유 아이펀팩토리 / 엔진 개발팀 남승현
  • 2. 2018 iFunFactory Dev Day Contents. 01 발표 소개 02 분산 환경을 위한 ORM 04 구현: 코드 자동 생성 05 구현: 이벤트 시스템 06 구현: 비동기 I/O 07 구현: 캐시 08 구현: 잠금(Lock) 09 구현: 분산 환경 – 캐시와 잠금 03 구현: 일반화된 오브젝트
  • 3. 2018 iFunFactory Dev Day 발표 소개 01
  • 4. 2018 iFunFactory Dev Day • 흔치 않은 개발 사례 • 게임 서버 개발 기간 단축 • 구현된 ORM 소개 • 주요 구현을 방법론 수준으로 소개 발표 소개
  • 5. 2018 iFunFactory Dev Day 분산 환경을 위한 ORM 02 구현된 시스템 소개
  • 6. 2018 iFunFactory Dev Day ORM 이란? 데이터베이스를 SQL 이 아니라 프로그래밍 언어의 객체로 다룰 수 있게 해주는 기술 분산 환경을 위한 ORM
  • 7. 2018 iFunFactory Dev Day SQL 사용 예 ORM 사용 예 출처 - Wikipedia 출처 - Wikipedia
  • 8. 2018 iFunFactory Dev Day 개발 동기 • 단순 반복 Database 작업 1. Table 2. Stored Procedure/SQL 3. SQL 호출 코드 게임 콘텐츠 로직만 구현할 수 없을까? • 게임 서버 개발 생산성 향상 분산 환경을 위한 ORM
  • 9. 2018 iFunFactory Dev Day 개발 목표 • SQL 작업 제거 • 분산 환경 • 충분한 성능 분산 환경을 위한 ORM
  • 10. 2018 iFunFactory Dev Day 구현된 시스템 소개 – 주요 기능 • SQL 처리 자동화 • 잠금(Lock) • 캐시 • 분산 환경에서 동일한 작동 분산 환경을 위한 ORM
  • 11. 2018 iFunFactory Dev Day 구현된 시스템 소개 – 구조도 이벤트 시스템 오브젝트 캐시 오브젝트 잠금 오브젝트 저널 오브젝트 인터페이스(자동 생성) 오브젝트 DB/RPC 서비스 분산 환경을 위한 ORM
  • 12. 2018 iFunFactory Dev Day 구현된 시스템 소개 – 사용 방법 1. JSON 으로 모델 정의 예) 분산 환경을 위한 ORM
  • 13. 2018 iFunFactory Dev Day 구현된 시스템 소개 – 사용 방법 2. 빌드 코드 생성 프로그램이 모델을 이용해 코드 생성 분산 환경을 위한 ORM
  • 14. 2018 iFunFactory Dev Day 구현된 시스템 소개 – 사용 방법 3. 자동 생성된 인터페이스 Class 사용 분산 환경을 위한 ORM
  • 15. 2018 iFunFactory Dev Day 자동 생성된 인터페이스 Class 예)
  • 16. 2018 iFunFactory Dev Day 자동 생성된 인터페이스 Class 사용 예)
  • 17. 2018 iFunFactory Dev Day 구현: 일반화된 오브젝트 03
  • 18. 2018 iFunFactory Dev Day class Objectclass Character 참조 • 모든 타입의 오브젝트를 표현 • 자동 생성된 인터페이스 Class 는 단순 Wrapper class Object 구현: 일반화된 오브젝트
  • 19. 2018 iFunFactory Dev Day 자동 생성된 class Character 예) 구현: 일반화된 오브젝트
  • 20. 2018 iFunFactory Dev Day class Model JSON 으로 기술된 모델을 C++ 코드로 표현 구현: 일반화된 오브젝트
  • 21. 2018 iFunFactory Dev Day class Model
  • 22. 2018 iFunFactory Dev Day class Model SQL 을 런타임에 자동 생성 가능하게 함 CREATE TABLE {object-name} {attribute-name} {type}, {attribute-name} {type}, … “Character” “Name CHAR(12)” “Level INT” UPDATE {object-name} SET {attribute-name} = {value} WHERE object_id = {object-id} 구현: 일반화된 오브젝트
  • 23. 2018 iFunFactory Dev Day class Model SQL 을 런타임에 자동 생성 가능하게 함 구현: 일반화된 오브젝트 CREATE TABLE {object-name} {attribute-name} {type}, {attribute-name} {type}, … UPDATE {object-name} SET {attribute-name} = {value} WHERE object_id = {object-id} “Character” “Level INT” “Name CHAR(12)”
  • 24. 2018 iFunFactory Dev Day class Object, class Model 은 자동 생성되는 코드에서 사용 구현: 일반화된 오브젝트
  • 25. 2018 iFunFactory Dev Day 04 SQL 작업 자동화 SQL 처리 자동화 코드 및 인터페이스 코드 생성 구현: 일반화된 오브젝트
  • 26. 2018 iFunFactory Dev Day 코드 자동 생성 코드 생성 스크립트 모델(JSON) 을 입력 받아 C++ 코드 생성 JSON 코드 생성기 (Python) Model 생성 인터페이스 Class <입력> <출력>
  • 27. 2018 iFunFactory Dev Day • JSON 으로 표현 • 오브젝트 이름 • 오브젝트의 어트리뷰트와 타입 • Key 라고 부르는 특별한 어트리뷰트 존재 • Key 는 SQL 의 PRIMARY KEY 와 같다 • Key 를 이용하여 오브젝트를 읽을 수 있다 코드 자동 생성 입력: 모델 정의
  • 28. 2018 iFunFactory Dev Day 입력: 모델 정의 코드 자동 생성 예)
  • 29. 2018 iFunFactory Dev Day 출력: C++ 코드 서버 프로그램 빌드 시 실행 • Model 생성 및 등록 코드 • 인터페이스 Class 코드 코드 자동 생성
  • 30. 2018 iFunFactory Dev Day 코드 자동 생성 출력: C++ 코드 – Model 생성 및 등록 • class Model 의 인스턴스를 생성하여 시스템에 등록 • 등록된 모델 정보를 이용하여 런타임에 SQL 생성 가능
  • 31. 2018 iFunFactory Dev Day 코드 자동 생성 출력: C++ 코드 – Model 생성 및 등록 예)
  • 32. 2018 iFunFactory Dev Day 코드 자동 생성 출력: C++ 코드 - 인터페이스 Class • 프로그래머 사용하는 유일한 인터페이스 • 오브젝트 생성 함수 – Create() • 오브젝트를 불러오는 함수 – Fetch() DB I/O, 잠금, 캐시 등의 처리를 내부에서 수행 • 오브젝트의 각 어트리뷰트를 읽고, 쓰는 함수 – Get()/Set() SQL 쿼리 생성 및 호출을 내부에서 수행
  • 33. 2018 iFunFactory Dev Day 출력: 인터페이스 Class 예)
  • 34. 2018 iFunFactory Dev Day 코드 자동 생성 출력된 코드 사용 예) DB, 잠금, 캐시 등 자동으로 처리
  • 35. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 05 트랜잭션 구현을 위한 이벤트 시스템
  • 36. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 • 함수를 실행하는 스레드 풀 • 트랜잭션 구현을 위해 필요
  • 37. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 이벤트 상태 • 실행 준비: 실행하기 위해 스레드를 기다림 • 실행: 스레드를 할당 받아 실행 중 • 중단(롤백): 오브젝트를 즉시 사용할 수 없는 경우 대기 • DB 에서 읽어와야 할 때 • 잠금을 얻을 수 없을 때
  • 38. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 중단(롤백) 구현 C++ Exception Throw 오브젝트를 사용할 수 있을 때 다시 실행
  • 39. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 1 2 3 중단(롤백) 구현
  • 40. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 오브젝트 저널 • 이벤트 함수 안에서 오브젝트 수정은 임시 저장 • 중단(롤백) 시 임시 저장 내용 삭제 • 완료(완료) 시 캐시 및 Database 에 반영
  • 41. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 단점 중단 전 코드 2번 이상 실행
  • 42. 2018 iFunFactory Dev Day 구현: 비동기 I/O 06 이벤트 시스템의 트랜잭션 활용
  • 43. 2018 iFunFactory Dev Day 구현: 비동기 I/O 비동기 I/O 발생 • 오브젝트를 접근할 때 Database 에서 읽어와야 할 때 • I/O 를 블록킹 방식으로 구현하면 처리량 급감
  • 44. 2018 iFunFactory Dev Day 구현: 비동기 I/O 비동기 I/O 구현 • C++ Exception 을 Throw 하여 이벤트 중단(롤백) • Exception 객체에 I/O 작업을 저장 • I/O 완료 후 이벤트 함수 재실행 이벤트 시스템으로 구현됨
  • 45. 2018 iFunFactory Dev Day 구현: 비동기 I/O 문제 • 오브젝트를 접근하려면 매번 중단(롤백) 발생 • Exception Throw • I/O 처리 -> 캐시로 해결
  • 46. 2018 iFunFactory Dev Day 구현: 캐시 07
  • 47. 2018 iFunFactory Dev Day 구현: 캐시 • 매번 Database 에서 읽는 것은 비효율 • I/O 처리 비용 • 이벤트 중단을 위한 Exception Throw 비용 • 일정 시간 동안 메모리에 보관
  • 48. 2018 iFunFactory Dev Day 구현: 캐시 캐시의 주요 구현 • 오브젝트 보관 • Key Attribute 에 대한 Index • 제거 타이머
  • 49. 2018 iFunFactory Dev Day 구현: 캐시 자료구조 시간 복잡도: O(1)
  • 50. 2018 iFunFactory Dev Day 캐시에 오브젝트 입력 구현 예) Character 오브젝트(Name: “devday”, Object-Id: 1234) Key 로 지정된 “Name” 어트리뷰트 Name 이 “devday” 인 오브젝트의 Object ID
  • 51. 2018 iFunFactory Dev Day 캐시에 검색 구현 예) Character 오브젝트(Name: “devday”, Object-Id: 1234) Key 로 지정된 “Name” 어트리뷰트 Name 이 “devday” 인 오브젝트의 Object ID
  • 52. 2018 iFunFactory Dev Day 구현: 캐시 자료구조 - 단점 범위 검색 불가능 -> ordered_map(std::map) 으로 해결 가능 성능 하락
  • 53. 2018 iFunFactory Dev Day 구현: 캐시 제거 타이머 • 오브젝트를 캐시에서 접근 시 타이머 설정 • 모든 오브젝트에 타이머를 두면 성능 문제 발생 • 일정 시간 모아서 처리
  • 54. 2018 iFunFactory Dev Day 구현: 잠금(Lock) 08
  • 55. 2018 iFunFactory Dev Day 구현: 잠금 잠금 구현이 필요한 이유 • 한 오브젝트를 여러 이벤트에서 동시 수정 발생 • 캐시에 로드된 오브젝트는 SQL 의 잠금(Lock) 불가 • SQL 잠금은 DB 에 로직 구현 필요 • Database 샤딩 시 SQL 잠금 사용 어려움
  • 56. 2018 iFunFactory Dev Day 구현: 잠금 잠금의 종류 잠금은 이벤트 함수가 끝날 때까지 유효 • 복사본 읽기 • 읽기 • 쓰기 잠금을 획득할 수 없으면 이벤트 중단(롤백)
  • 57. 2018 iFunFactory Dev Day 구현: 잠금 문제: 데드락 각 이벤트에서 서로 다른 순서로 오브젝트에 접근
  • 58. 2018 iFunFactory Dev Day 구현: 잠금 다음 4 조건이 모두 만족되면 데드락 발생 • 상호배제 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다. • 점유대기 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다. • 비선점 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다. • 순환대기 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.
  • 59. 2018 iFunFactory Dev Day 구현: 잠금 데드락 회피를 위해 두 가지 방법 시도 • 타이머 이용 – 점유대기 방지 • 선점형 잠금 – 비선점 방지
  • 60. 2018 iFunFactory Dev Day 구현: 잠금 타이머 이용 데드락 조건 4 가지 중 점유 대기(Hold and wait) 방지 잠금을 획득할 수 없는 경우 • 획득한 모든 잠금 해제하고 이벤트 중단 • 일정시간 후 잠금이 풀렸기를 기대하며 이벤트 재호출 일정시간 = Exponental backoff 알고리즘
  • 61. 2018 iFunFactory Dev Day 구현: 잠금 타이머 이용 - 장점 구현이 쉬움 타이머 이용 - 단점 경합하는 오브젝트 수가 많으면 해결 불가
  • 62. 2018 iFunFactory Dev Day 구현: 잠금 섬점형 잠금 데드락 조건 4 가지 중 비선점(No preemption) 방지 • 모든 이벤트는 발생 시간에 의한 우선순위를 갖는다 • 먼저 발생된 이벤트는 늦게 발생된 이벤트가 중단 상태이면 잠금을 해제할 수 있다
  • 63. 2018 iFunFactory Dev Day 구현: 잠금 섬점형 잠금 – 데드락 회피 예) 이벤트1, 2 가 Object A, B 를 교차하여 쓰기 잠금 획득
  • 64. 2018 iFunFactory Dev Day 0 1 2 3 4 5 6 7 Time 이벤트1 생성 및 실행 ObjectA 잠금 획득 시도: 성공 Sleep 1 ObjectB 잠금 획득 시도: 실패 -> 이벤트2 의 ObjectB 잠금 해제 요청 중단(롤백) 재실행, ObjectA, B 잠금 획득 시도: 성공 처리 완료 이벤트2 생성 및 실행 ObjectB 잠금 획득 시도: 성공 Sleep 1 ObjectA 잠금 획득 시도: 실패 -> 잠금 해제 불가 중단(롤백), ObjectB 잠금 해제 재실행, ObjectB, A 잠금 획득 시도: 성공, 처리 완료 이벤트1 이벤트2 이벤트1, 2 가 Object A, B 를 교차하여 쓰기 잠금 획득
  • 65. 2018 iFunFactory Dev Day 구현: 잠금 선점형 잠금 - 장점 경합 빈도에 상관 없이 빠르고 일정한 성능 선점형 잠금 - 단점 경합이 없을 땐 타이머 방식 보다 느리다 상대적으로 구현이 어렵다
  • 66. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 09
  • 67. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 Zookeeper • 오픈소스 분산 코디네이션 서버 • 클러스터를 구성하여 SPoF(Single point of failure) 를 만들지 않음 • 파일 시스템처럼 사용 경로를 지정하여 데이터 저장 • 오브젝트 소유권 관리
  • 68. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 Zookeeper 를 이용한 오브젝트 소유권 관리 오브젝트 소유권 = 캐싱 오브젝트를 캐시에 입력하기 전 /objects/{object-id} 파일에 서버ID 저장 해당 경로에 이미 파일이 있으면 해당 서버의 캐시와 잠금 기능을 RPC 로 접근
  • 69. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 Lease RPC 빌려올 오브젝트 ID 를 인자로 전달 수신한 서버는 • 해당 오브젝트 잠금 처리 + 타임아웃 설정 • 해당 오브젝트를 캐시에서 읽어 응답으로 전달 • 반납 RPC 수신 시 변경 사항이 있으면 반영
  • 70. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 /objects/ ┗1234 => “ServerA” ID: 1234 Name: “devday” Zookeeper ServerA Cache ServerA 가 Character(Name:”devday”, Object-Id:1234) 캐싱
  • 71. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 소유 확인 Lease RPC Return RPC /objects/ ┗1234 => “ServerA” Zookeeper ID: 1234 Name: “devday” ServerA Cache ServerB Cache 1 2 3
  • 72. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 캐시 적중률 문제 • Lease RPC 는 무겁다 • 오브젝트는 최대한 많이 접근하는 서버가 소유 해결 • 캐시는 각 오브젝트의 서버 별 접근 빈도 계산 • 더 높은 빈도의 서버 발견 시 타이머와 상관 없이 캐시에서 내린다
  • 73. Q&A 2018 iFunFactory Dev Day 2018 iFunFactory Dev Day Thank You! 경기도 성남시 분당구 대왕판교로 660, 유스페이스1 B동 606호 아이펀팩토리 [email protected] +82-70-4923-6566 www.ifunfactory.com