모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 cloudbread...

Post on 18-Jul-2015

1.960 Views

Category:

Mobile

24 Downloads

Preview:

Click to see full reader

TRANSCRIPT

게임서버의 무한확장, 유니티 개발자를 위한

오픈소스 게임서버 엔진프로젝트

김대우DAEWOO.KIM@LIVE.COM

About

• https://www.linkedin.com/profile/view?id=185670127

• SQLER.com 운영자

• Microsoft 근무

• 개발자 및 플랫폼 총괄 부서

// 게임서버

• Web 앱

• 하이브리드 앱

• Dedicated 서버, Socket 서버, P2P 서버

• Stateless 서버, Restful 서버, Web API 서버

• SQL, NoSQL, Transactional Data, Log Data

CloudBread는

HTTP 기반 Stateless 게임 서버 엔진&

프레임워크

게임서버 !=Cloud

• 클라우드는 다르다?

• IDC 센터에서 잘 동작했던 방식?

• Virtualization / Standard VM

• 클라우드는 싸다? - PAYG

• 기존의 운영 방식 != Cloud의 운영 방식

• Instance High Availability 필수

• 클라우드의 무한한 리소스 활용(?) - 설계가다르다

게임서버 Why? What?

• IAP 수익 모델

• Sustaining

• CS / 분쟁

• BaaS, KAKAO, 상용, OSS(?)

셀프 호스팅 vs IaaS vs PaaS

게임서버 : Cloud

• Cloud가 제공하는 개발자를 위한 (미친) 구성요소

• PaaS / DaaS 모델 최대 활용

• Stateless 환경

• 클라우드에서 검증된(or HA구성 가능한)오픈소스

• 클라우드 인프라는 무한하지만 우리의아키텍처는 유한하다. Limit을 알고 쓰자

게임서버.NOW

• Game Studio / Publisher / 인디 개발자

• 결재 모듈만 / 회원모듈만 / 리더보드만

• Unity 개발하기도 바쁨

• CRUD(?)

• DB / 백업 / 고가용성 / 확장성 / 저장프로시저 / 인덱스

게임서버.NOW

• Game Studio / Publisher / 인디 개발자

• 결재 모듈만 / 회원모듈만 / 리더보드만

• Unity 개발하기도 바쁨

• CRUD(?)

• DB / 백업 / 고가용성 / 확장성 / 저장프로시저 / 인덱스

무슨빵?

우리 주말은 좀 쉬자 프로젝트 - CloudBread

- 앱 개발에 집중

- 파라미터에 맞춰 호출

- 예제 테스트 앱 제공

- REST 호출 함수 만들 필요 없음

- 앱의 코드는 바뀌지 않음

- IaaS보다 진화한 PaaS 클라우드

- Scale Up – Out 선택은 자유

- 서비스 구조에 맞는 기능 선택

- 보안 구조 / 데이터 암호화 선택가능

- GM 관리자 도구 제공

- 기본 배치(분/시/일) 제공

- 무료 기술 교육 제공(헤카톤/캠프)

(대부분이미다만들어진)무료오픈소스(MIT) 프로젝트모바일게임과앱에최적화된게임서버엔진

프로젝트 링크

• 프로젝트 Github

• https://github.com/CloudBreadProject/CloudBread

• 프로젝트 페이스북

• https://www.facebook.com/groups/cloudBreadProject/

CloudBread – 추상화 디자인 아키텍처

데이터저장소 – SQL

(암호화)

로그데이터저장소 – NoSQL

(암호화)

FE 모바일응답서버 #N

배치성작업(일배치/시배치/월배치)

및비실시간성데이터처리를위한큐(Queue) 저장소

중간작업자배치작업처리기

어뷰징규칙 / 푸쉬알림로그라우팅처리기 #N

작업스케쥴러(Trigger)

데이터출력캐시랭킹서비스를위한캐시

관리자페이지

DEMO

DEMO

DEMO

DEMO

DEMO

무슨 생각으로 만들었나?

사용자의 행동 “Behavior”

사용자의 활동을 기록 (약 100여개)

하다보니 기록이 “일반화“ – 예를 들면

Github wiki 참조

Actor behavior Behavior Name

회원가입

로그인Id 중복체크 SelLoginIDDupeCheck

회원가입 InsRegMember

익명회원가입 InsAnonymousRegMember

메일주소로메일전송 - 회원가입확인(메일주소체크) 등 SelSendEmailToMember

Email 주소를통한접속여부체크 (내메일주소로온링크눌러야회원가입완료) 웹페이지인터렉션필요) - Mobile Service의 인증제어가포함되지않은 standard Web Api

인풋이 id/pwd가 아니라다른정보(id/pwd 묶어서한파라미터로보내면서버에서 decypt해 받아 id/pwd로 SP에서조회해처리

UdtConfirmedEmailAddress

로그인 후사용자정보조회 SelLoginInfo

로그인후 Members 에기록 update(최근로그인일시 등 members 테이블정보)

UdtLoginInfo

로그아웃 or 종료 + 최근로그아웃일시저장 UdtLogOut

회원정보수정 UdtMemberinfo

로그인암호분실로비밀번호초기화 UdtMemberPwdReset

로그인후공지사항조회 SelNotices

이벤트조회 SelGameEvents

이벤트의아이템받고받음을기록 UdtGameEventMemberToItem

쿠폰조회 SelCoupons

쿠폰등록 UdtCouponMember

사용자의 행동 “Behavior”

로그인 Behavior

사용자의 행동 “Behavior”

Controller - Procedure

사용자의 행동 “Behavior”

Stored procedure

사용자의 행동 “Behavior”

아이템 목록(Actor의 소유물) – SelMemberItem

사용자의 행동 “Behavior”

공지사항 조회 – SelNotice

이벤트 조회 - SelGameEvents

뭔가 쫌 "없어"보이는

CB 게임서버 DEMO

클라이언트 디바이스와 CB 게임서버의통신

클라이언트와 FE 서버는 어떻게 연애를?

HTTP로 호출

클라이언트에 라이브러리 참조 하면 “훨씬” 더 쉬움

비동기 호출

함수만 call 하면 됨

Microsoft가 OSS로 제공하는(iOS, Android,

WinPhone …) 전용 라이브러리

서버 호출 함수

Invoke()

사용자의 행동 Behavior

실제 예를 들면

로그인ID중복체크 : SelLoginIDDupeCheck

- ID 정보를 서버로 전달하면 서버는 중복ID인지 아닌지를 응답

요청

{

memberID = “member1”

}

응답

0 또는 1

사용자의 행동 Behavior

회원가입 : InsRegMember

- 회원 가입 정보 전달

{

memberID = “member1”, email

=“abc@email.com”, name=“코난”, …

}

응답

2 – (영향을 받은 row의 숫자)

사용자의 행동 Behavior

이벤트 조회: SelGameEvents

{

memberID = “member1”

}

응답

{

EventID =“eventID1”, EventName=“크리스탈1”, 기간=…

EventID =“eventID2”, EventName=“좋은템1”, 기간=…

EventID =“eventID13, EventName=“보너스아이템”, 기간=…

}

클라이언트 테스트 앱 – Android

클라이언트 테스트 앱 – win8

InvokeApiAsync (API명, json데이터)

Unity는?

클라이언트 테스트 앱 – Unity3D

Bitrave – Unity 플러그인 형태로 개발

https://github.com/bitrave/azure-mobile-services-for-unity3d

http://www.deadlyfingers.net/azure/unity3d-leaderboard-demo-using-bitrave-azure-plugin/

CloudBread 클라이언트

DEMO

관리자 페이지

CRUD

개발 속도

그룹별 권한관리(Admin / Operator /

Reader)

MVC 모델 그대로~(MVC를 아신다면…)

관리자 페이지

CRUD

개발 속도

그룹별 권한관리(Admin / Operator /

Reader)

MVC 모델 그대로~(MVC를 아신다면…)

테이블 설명

Members : 회원 정보

MemberGameInfoes : 회원 게임정보 (1:1)

AdminMembers : 관리자 정보

MemberItemPurchases : 회원 구매 테이블 (1:N)

ItemList : 아이템 – 사용자에게 소속될 수 있는 개체 리스트

MemberItem : 회원-아이템 (1:N)

MemberGameInfoStages : 회원-스테이지(1:N)

GiftDepositories : 선물보관

Notice : 공지사항

GameEvents : 이벤트

GameEventMember : 이벤트에 참여한 멤버

Coupon : 쿠폰

CouponMember : 쿠폰을 사용한 멤버

MemberAccountBlockLog : 계정 사용 정지 기록 테이블

ServerInfo : 서버정보

테이블 설명 - Github

현재 Excel 파일 (죄송)

곧, Github wiki에 올라갈 예정

CloudBread 관리자페이지

DEMO

JSON에 대하여

개발자 – 기획자

Format

빠른 기획 to the 게임

데이터 저장 유연성

Schema DB vs Non Schema – NoSQL 상호보완적

sCol1~sCol10 컬럼은 여분의 컬럼

기획한 게임의 Property가 1:1로 매칭되지 않아도 걱정 말자

Property를 입력할 컬럼이 부족할 경우 sCol을 활용한다.

- 여러 값을 하나의 컬럼에 저장

- JSON 데이터를 저장도 추천

- NVARCHAR MAX

- Search에 이용될 수 있거나 긴 Property 값은 sCol 저장 하지

않는다.

데이터 저장 유연성

Schema DB vs Non Schema – NoSQL 상호보완적

sCol1~sCol10 컬럼은 여분의 컬럼

기획한 게임의 Property가 1:1로 매칭되지 않아도 걱정 말자

Property를 입력할 컬럼이 부족할 경우 sCol을 활용한다.

- 여러 값을 하나의 컬럼에 저장

- JSON 데이터를 저장도 추천

- NVARCHAR MAX

- Search에 이용될 수 있거나 긴 Property 값은 sCol 저장 하지

않는다.

데이터 암호화

무엇을 암호화 할 것인가?

String or Value

Password 암호화 SHA512

데이터 암호화 AES256

데이터 암호화

무엇을 암호화 할 것인가?

String or Value

Password 암호화 SHA512

데이터 암호화 AES256

웹서버와 DB서버 / 저장소 로깅 처리

모바일 서비스에 특화

배포된 앱만 접근 인증

SSL 기본 제공

친숙한 MVC 모델 (View가 없죠.)

API Controller – DB (저장프로시저) 루틴

API Controller – Storage (로그데이터 – 저장소) 루틴

쓰기 속도 향상 방안

스케쥴 작업

통계 작업 – DAU, 매출현황 등

클라우드의 여러가지 스케쥴링 작업 방식

- 가상머신 + 쿼츠(Quartz Enterprise Scheduler) / 비추천

- 스케쥴러 + Queue + Worker Role / 추천

- Azure Web App(or Mobile Service) + Web job / 추천

CloudBread는 Worker Role 방식

차기 계획

• 문서화 작업 마무리(OTL)

• Schedule Task (배치)

• Push 처리

• …

Cloud Scalability

• 개발 / 테스트 서버를 IaaS 쓰면 그대로 올라간다는데요(?)

너 집에 아직 안갔니(?)

• 먼저, 서비스의 Limit을 명확하게 알자

• 코드로 충분한 테스트를 수행

• PaaS + Scale out 이 최선의 답안

• 우리보다 똑똑한 친구들이 월급 받으면서 만든 클라우드최적화 기능들을 적재 적소에서 쓰자

프로젝트 참여

• 프로젝트 Github

• https://github.com/CloudBreadProject/CloudBread

• 프로젝트 페이스북

• https://www.facebook.com/groups/cloudBreadProject/

Appendix – 배포 절차

Github CloudBread Project Wiki와 같음

개발 환경 구성

프로젝트다운로드

https://github.com/CloudBreadProject/CloudBread

압축을풀고 Visual Studio 솔루션파일실행

만약, Windows 8에서실행가능하다는메세지가뜰경우

Windows 8 스토어앱이테스트프로젝트로포함되어있기때문

해당프로젝트를로드하지않고실행해도 OK

개발 환경 구성

프로젝트로드완료화면

개발 환경 구성

클라우드서비스설정 - (1) 저장소(Storage) 생성

1) https://manage.windowsazure.com 접속

2) 좌하단 “새로만들기” – “데이터서비스” – “저장소” – “빨리만들기”

3) URL에 “저장소” 이름생성

4) 위치 / 선호도그룹에 “일본서부”(또는원하는지역) 선택

5) 복제 – “로컬중복” 선택 (참고링크)

저장소계정생성은보통 1분이내완료됨

개발 환경 구성

.

개발 환경 구성

데이터를저장할 DB생성

BACPAC으로 생성된 DB를 Azure의 Blob에올려두고이파일을 Import해

SQL Database 생성

Azure Storage Explorer 툴다운로드, 설치 – Azure의저장소를 UI로관리

가능한 도구 - http://azurestorageexplorer.codeplex.com/

https://manage.windowsazure.com 접속해저장소이름과엑세스키확인

1) 저장소이름 – 목록에서조금전생성한저장소선택 – 상단에

“저장소이름”

2) 저장소엑세스키 – 맨아래 “엑세스키관리” 클릭

3) “기본엑세스키” 가저장소엑세스키

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

Azure Storage Explorer 실행

1) Add Acoount 클릭

2) Storage Account Name에위의 “저장소이름” 입력

3) Storage Account Key에위의 “기본엑세스키” 입력

4) Test Access 수행하고성공하면 “Save”

개발 환경 구성

.

개발 환경 구성

Azure Storage Explorer 접속후

1) New – Blob Container 선택

2) “cloudbreadblob” 생성

3) 생성후 cloudbreadblob에서 “upload” 클릭

4) 다운로드받은프로젝트 – tools 폴더의 BACPAC 파일선택후업로드

(CB0330_withTestData.bacpac)

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

업로드한 BACPAC 파일로 DB생성

1) Azure 관리자포털접속 : https://manage.windowsazure.com

2) 좌하단 “새로만들기” – “데이터서비스” – “SQL 데이터베이스” –

“가져오기”

3) BACPAC URL에서폴더클릭 – 저장소선택 – BACPAC 파일선택후

열기클릭

4) 이름 – “CloudBreadDB” 입력

5) 서비스계층 – 가장싼 “Basic” 선택 (추후아무때나 Scale Up 가능)

6) 서버 – “새 SQL 데이터베이스서버” 선택(만약기존사용서버가있다면

사용도가능)

7) 서버로그인 ID / PWD 넣고지역은 “일본서부”(또는원하는지역) 선택

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

프론트엔드서버를위한 Azure Mobile Service 생성

Azure 관리자포털에서좌하단 “새로만들기” – “계산” – “모바일서비스” –

“만들기”

1) URL 입력

2) 데이터베이스는 “기존 SQL 데이터베이스사용” 선택

3) 지역 “일본서부”

4) 백엔드 – “.NET” 선택 – 다음클릭

5) 데이터베이스선택 – 조금전 BACPAC을업로드해새로생성한서버

선택

6) 생성한데이터베이스서버로그인 ID / PWD 입력

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

관리자페이지를위한 Azure Website 생성

Azure 관리자포털에서좌하단 “새로만들기” – “계산” – “웹앱” – “빨리

만들기”

1) URL 입력

2) 앱서비스계획 “일본서부” 선택(저의캡처화면과약간다를수

있습니다.)

개발 환경 구성

.

개발 환경 구성

Visual Studio에서 배포수행 – web.config 파일수정1) Visual Studio의 CloudBread 프로젝트의 web.config 파일을열고2) <ConnectionStrings> 요소의항목들을수정

DB서버주소 DB명유저아이디 패스워드

저장소계정이름 저장소키

개발 환경 구성

Visual Studio에서 배포수행 – DB서버/DB명/id/pwd“연결문자열”에대해설정경험이있다면바로관리자포털에서 “SQL 데이터베이스” 선택 – “대시보드”탭 – “연결문자열표시”를복사해 web.config 파일에복사

1) DB서버주소 – 관리자포털확인2) 관리자포털에서 “SQL 데이터베이스” 선택3) 목록들중생성한데이터베이스클릭4) 하단에 “서버” 부분에서버주소또는 “대시보드” 부분에 “서버이름” 항목에서서버주소확인가능5) DB명은 “CloudBreadDB”로 설정(다른이름일경우포털의 SQL 데이터베이스에서 확인해설정6) id / pwd는관리자포털에서 “SQL 데이터베이스” 선택 – “대시보드”탭 –“연결문자열표시”를보면 id를볼수있고비밀번호는입력한비밀번호입력

개발 환경 구성

Visual Studio에서 배포수행 – 저장소계정이름 / 저장소키관리자포털 – “저장소” – 생성한저장소선택 – 하단 “엑세스키관리” 에서“저장소계정이름”과 “기본엑세스키”를 web.config 파일에복사해이용

수정된 web.config 저장

개발 환경 구성

Visual Studio에서 프론트엔드 – CloudBread 프로젝트배포수행1) Visual Studio 솔루션익스플로러에서 “CloudBread” 프로젝트마우스우클릭 – “게시(Publish)” 클릭2) “게시대상선택” 에서 “Microsoft Azure Mobile Service” 선택3) Visual Studio에서 Microsoft ID로로그인하면, 조금전생성한 Azure Mobile Service 리스트에서선택가능4) 자동으로게시를위한프로필정보를가져옴 “다음” 클릭5) Database 연결문자열설정화면나옴 – 다음클릭참고로, Azure는개발시의연결문자열과배포시연결문자열처리를

위해 web.config의 연결문자열을이렇게배포시오버라이드할수있음. 배포후에도 Azure 관리자포털 – 해당서비스의 “구성” 탭에서연결문자열을오버라이드도가능. 현재는 web.config 파일을배포환경에맞춰설정한상태이기때문에따로수정하지않고통과.6) 게시(Publish) 클릭후게시수행7) 게시가완료되면브라우저가열리고자동으로프론트엔드사이트열림

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

Visual Studio에서 프론트엔드 – CloudBread 프로젝트배포테스트1) 배포가완료되면 CloudBread 테스트가능. API 웹사이트이며CloudBread가 제공하는 API를브라우저에서호출테스트가능2) 왼쪽아래 “try it out” 수행3) 프러덕션환경이기때문에 “응용프로그램키”가있어야접근가능 –인증창이뜨고인증창의비밀번호부분에 Azure Mobile service의“응용프로그램키”를복사해넣으면통과됨. 실제모바일디바이스에서는클라이언트의앱이나게임에배포되어야함(예제응용프로그램참조)4) Azure 관리자포털 – “모바일서비스” – 생성한모바일서비스선택후하단 “키관리” 버튼을눌러 “응용프로그램키” 복사5) CloudBread가 제공하는 API 리스트가나오고 “CBSelGameEvents” 선택후상단 “try it out” 하고 “Send”를누르면 Json 메세지를보내고리턴값을받음. 현재테스트를위한기본데이터가포함되어있어서작동하는것임.

정상적으로데이터가보이면 CloudBread 프로젝트배포완료

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

.

개발 환경 구성

Visual Studio에서 프론트엔드 – CloudBreadAdminWeb 프로젝트배포1) 관리자페이지배포과정이고 CloudBread 프로젝트배포와유사함2) CloudBreadAdminWeb 프로젝트루트의 “web.config” 파일을열고연결문자열편집필요3) 총세부분이고

개발 환경 구성

1) Visual Studio 솔루션익스플로러에서 “CloudBreadAdminWeb” 프로젝트마우스우클릭 – “게시(Publish)” 클릭2) “게시대상선택” 에서 “Microsoft Azure Website” 선택3) Visual Studio에서 Microsoft ID로로그인하면, 조금전생성한 Azure Websites 리스트에서선택가능4) 자동으로게시를위한프로필정보를가져옴 “다음” 클릭5) Database 연결문자열설정화면나옴 – 다음클릭참고로, Azure는개발시의연결문자열과배포시연결문자열처리를

위해 web.config의 연결문자열을이렇게배포시오버라이드할수있음. 배포후에도 Azure 관리자포털 – 해당서비스의 “구성” 탭에서연결문자열을오버라이드도가능. 현재는 web.config 파일을배포환경에맞춰설정한상태이기때문에따로수정하지않고통과.6) 게시(Publish) 클릭후게시수행7) 게시가완료되면브라우저가열리고자동으로프론트엔드사이트열림

개발 환경 구성

1) 게시가완료되면로그인페이지가열리고기본테스트계정으로입력된CBAdmin / P@ssw0rd 로로그인2) 로그인이완료되면상단메뉴를통해 CloudBread 전체데이터에대한조회,삽입,수정,삭제 과정이가능

개발 환경 구성

.

개발 환경 구성

.

로컬 개발 환경 구성

서버개발자이고로컬에개발환경이필요할경우

로컬이나사내망에 SQL서버를설치해개발에사용할경우 web.config파일의연결문자열을 (local) 등으로수정해사용해로컬에서작업가능

SQL서버가설치되어있을경우 BACPAC 파일가져오기를수행

top related