CloudBread
클라우드 기반 무료 오픈소스 프로젝트로, 모바일 게임과 모바일 앱에 최적화된 게임 서버 엔진입니다. 모든 서비스는 마이크로소프트의 클라우드 서비스인 Azure에 최적화되어 동작하며, 안정성과 확장성을 목표로 개발 중입니다.
기능
•PaaS / DaaS 서버 엔진•PaaS, DaaS 로 손쉬운 개발 및 서비스 즉시 배포
•Real Auto Scale - PaaS
•개발/테스트/배포 = 통합 환경
•서비스 규모에 따른 앱 변경 없음
글로벌 론칭 아키텍처
•글로벌 론칭+데이터 동기화
•설계 부터 클라우드에 최적화된 아키텍처 및 프레임워크로 개발
•오픈소스 프레임워크 활용 개발
보안, 관리, 기술교육
•저장/통신에 표준 암호화 기술 적용
•기본 관리자 서비스 및 커스터마이징
•분석/관리 배치 작업 추가 제작 가능
개발자 그룹
•페이스북 사용자 그룹 : https://www.facebook.com/groups/cloudBreadProject/
지원되는 모바일 & 클라이언트환경
•iOS, Android, Windows Phone, Windows 스토어앱, Xamarin, PhoneGap, Sencha 등
•Microsoft Azure Mobile Service가 지원하는 모바일 및 다양한 클라이언트 플랫폼 지원 : http://azure.microsoft.com/ko-kr/documentation/services/mobile-services/
설치
•Wiki의 튜토리얼 설치 참조
프로젝트 설명
•모바일게임과 모바일 앱에서 사용되는 사용자의 패턴과 액션을 기록해 기능들을 제공
•클라이언트 모바일 디바이스는 게임서버로 JSON 방식의 데이터를 요청하고 서버가 해당 데이터를 처리 후 응답
•약 100여개의 비즈니스 로직이 기본제공(Wiki 참조)
•클라이언트는 마이크로소프트가 오픈소스로 직접 만들어 제공하는 라이브러리를 통해 서버로 API를 호출
실행 예제와 API 리스트는 Wiki 참조
Contribute/질문/토론
•페이스북 사용자 그룹 : https://www.facebook.com/groups/cloudBreadProject/
6. 게임서버 !=Cloud
• 클라우드는 다르다?
• IDC 센터에서 잘 동작했던 방식?
• Virtualization / Standard VM
• 클라우드는 싸다? - PAYG
• 기존의 운영 방식 != Cloud의 운영 방식
• Instance High Availability 필수
• 클라우드의 무한한 리소스 활용(?) - 설계가
다르다
7. 게임서버 Why? What?
• IAP 수익 모델
• Sustaining
• CS / 분쟁
• BaaS, KAKAO, 상용, OSS(?)
13. 우리 주말은 좀 쉬자 프로젝트 - CloudBread
- 앱 개발에 집중
- 파라미터에 맞춰 호출
- 예제 테스트 앱 제공
- REST 호출 함수 만들 필요 없음
- 앱의 코드는 바뀌지 않음
- IaaS보다 진화한 PaaS
클라우드
- Scale Up – Out 선택은 자유
- 서비스 구조에 맞는 기능 선택
- 보안 구조 / 데이터 암호화 선택
가능
- GM 관리자 도구 제공
- 기본 배치(분/시/일) 제공
- 무료 기술 교육 제공(헤카톤/캠프)
(대부분 이미 다 만들어진) 무료 오픈소스(MIT) 프로젝트
모바일 게임과 앱에 최적화된 게임 서버 엔진
14. 프로젝트 링크
• 프로젝트 Github
• https://github.com/CloudBreadProject/CloudBread
• 프로젝트 페이스북
• https://www.facebook.com/groups/cloudBreadProje
ct/
15. CloudBread – 추상화 디자인 아키텍처
데이터 저장소 – SQL
(암호화)
로그 데이터 저장소 – NoSQL
(암호화)
FE 모바일 응답 서버 #N
배치성 작업(일배치/시배치/월배치)
및 비실시간성 데이터 처리를 위한
큐(Queue) 저장소
중간 작업자
배치 작업 처리기
어뷰징 규칙 / 푸쉬알림
로그 라우팅 처리기 #N
작업 스케쥴러(Trigger)
데이터 출력 캐시
랭킹 서비스를 위한 캐시
관리자 페이지
22. 사용자의 행동 “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
30. 클라이언트와 FE 서버는 어떻게 연애를?
HTTP로 호출
클라이언트에 라이브러리 참조 하면 “훨씬” 더 쉬움
비동기 호출
함수만 call 하면 됨
Microsoft가 OSS로 제공하는(iOS, Android,
WinPhone …) 전용 라이브러리
서버 호출 함수
Invoke()
31. 사용자의 행동 Behavior
실제 예를 들면
로그인ID중복체크 : SelLoginIDDupeCheck
- ID 정보를 서버로 전달하면 서버는 중복ID인지 아닌지를 응답
요청
{
memberID = “member1”
}
응답
0 또는 1
32. 사용자의 행동 Behavior
회원가입 : InsRegMember
- 회원 가입 정보 전달
{
memberID = “member1”, email
=“abc@email.com”, name=“코난”, …
}
응답
2 – (영향을 받은 row의 숫자)
33. 사용자의 행동 Behavior
이벤트 조회: SelGameEvents
{
memberID = “member1”
}
응답
{
EventID =“eventID1”, EventName=“크리스탈1”, 기간=…
EventID =“eventID2”, EventName=“좋은템1”, 기간=…
EventID =“eventID13, EventName=“보너스아이템”, 기간=…
}
38. 클라이언트 테스트 앱 – Unity3D
Bitrave – Unity 플러그인 형태로 개발
https://github.com/bitrave/azure-mobile-services-for-unity3d
http://www.deadlyfingers.net/azure/unity3d-leaderboard-demo-
using-bitrave-azure-plugin/
46. 데이터 저장 유연성
Schema DB vs Non Schema – NoSQL 상호보완적
sCol1~sCol10 컬럼은 여분의 컬럼
기획한 게임의 Property가 1:1로 매칭되지 않아도 걱정 말자
Property를 입력할 컬럼이 부족할 경우 sCol을 활용한다.
- 여러 값을 하나의 컬럼에 저장
- JSON 데이터를 저장도 추천
- NVARCHAR MAX
- Search에 이용될 수 있거나 긴 Property 값은 sCol 저장 하지
않는다.
47. 데이터 저장 유연성
Schema DB vs Non Schema – NoSQL 상호보완적
sCol1~sCol10 컬럼은 여분의 컬럼
기획한 게임의 Property가 1:1로 매칭되지 않아도 걱정 말자
Property를 입력할 컬럼이 부족할 경우 sCol을 활용한다.
- 여러 값을 하나의 컬럼에 저장
- JSON 데이터를 저장도 추천
- NVARCHAR MAX
- Search에 이용될 수 있거나 긴 Property 값은 sCol 저장 하지
않는다.
48. 데이터 암호화
무엇을 암호화 할 것인가?
String or Value
Password 암호화 SHA512
데이터 암호화 AES256
49. 데이터 암호화
무엇을 암호화 할 것인가?
String or Value
Password 암호화 SHA512
데이터 암호화 AES256
50. 웹서버와 DB서버 / 저장소 로깅 처리
모바일 서비스에 특화
배포된 앱만 접근 인증
SSL 기본 제공
친숙한 MVC 모델 (View가 없죠.)
API Controller – DB (저장프로시저) 루틴
API Controller – Storage (로그데이터 – 저장소) 루틴
쓰기 속도 향상 방안
51. 스케쥴 작업
통계 작업 – DAU, 매출현황 등
클라우드의 여러가지 스케쥴링 작업 방식
- 가상머신 + 쿼츠(Quartz Enterprise Scheduler) / 비추천
- 스케쥴러 + Queue + Worker Role / 추천
- Azure Web App(or Mobile Service) + Web job / 추천
CloudBread는 Worker Role 방식
52. 차기 계획
• 문서화 작업 마무리(OTL)
• Schedule Task (배치)
• Push 처리
• …
53. Cloud Scalability
• 개발 / 테스트 서버를 IaaS 쓰면 그대로 올라
간다는데요(?)
너 집에 아직 안갔니(?)
• 먼저, 서비스의 Limit을 명확하게 알자
• 코드로 충분한 테스트를 수행
• PaaS + Scale out 이 최선의 답안
• 우리보다 똑똑한 친구들이 월급 받으면서 만든 클라우드
최적화 기능들을 적재 적소에서 쓰자
54. 프로젝트 참여
• 프로젝트 Github
• https://github.com/CloudBreadProject/CloudBread
• 프로젝트 페이스북
• https://www.facebook.com/groups/cloudBreadProje
ct/
57. 개발 환경 구성
프로젝트 다운로드
https://github.com/CloudBreadProject/CloudBread
압축을 풀고 Visual Studio 솔루션 파일 실행
만약, Windows 8에서 실행가능하다는 메세지가 뜰 경우
Windows 8 스토어앱이 테스트 프로젝트로 포함되어 있기 때문
해당 프로젝트를 로드하지 않고 실행해도 OK
59. 개발 환경 구성
클라우드 서비스 설정 - (1) 저장소(Storage) 생성
1) https://manage.windowsazure.com 접속
2) 좌하단 “새로만들기” – “데이터 서비스” – “저장소” – “빨리만들기”
3) URL에 “저장소” 이름 생성
4) 위치 / 선호도 그룹에 “일본 서부”(또는 원하는 지역) 선택
5) 복제 – “로컬 중복” 선택 (참고링크)
저장소 계정 생성은 보통 1분 이내 완료됨
61. 개발 환경 구성
데이터를 저장할 DB생성
BACPAC으로 생성된 DB를 Azure의 Blob에 올려두고 이 파일을 Import해
SQL Database 생성
Azure Storage Explorer 툴 다운로드, 설치 – Azure의 저장소를 UI로 관리
가능한 도구 - http://azurestorageexplorer.codeplex.com/
https://manage.windowsazure.com 접속해 저장소 이름과 엑세스 키 확인
1) 저장소이름 – 목록에서 조금 전 생성한 저장소 선택 – 상단에
“저장소이름”
2) 저장소 엑세스키 – 맨 아래 “엑세스키 관리” 클릭
3) “기본 엑세스키” 가 저장소 엑세스키
64. 개발 환경 구성
Azure Storage Explorer 실행
1) Add Acoount 클릭
2) Storage Account Name에 위의 “저장소 이름” 입력
3) Storage Account Key에 위의 “기본 엑세스키” 입력
4) Test Access 수행하고 성공하면 “Save”
66. 개발 환경 구성
Azure Storage Explorer 접속 후
1) New – Blob Container 선택
2) “cloudbreadblob” 생성
3) 생성 후 cloudbreadblob에서 “upload” 클릭
4) 다운로드 받은 프로젝트 – tools 폴더의 BACPAC 파일 선택 후 업로드
(CB0330_withTestData.bacpac)
69. 개발 환경 구성
업로드한 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 넣고 지역은 “일본 서부”(또는 원하는 지역) 선택
73. 개발 환경 구성
프론트엔드 서버를 위한 Azure Mobile Service 생성
Azure 관리자 포털에서 좌하단 “새로 만들기” – “계산” – “모바일 서비스” –
“만들기”
1) URL 입력
2) 데이터베이스는 “기존 SQL 데이터베이스 사용” 선택
3) 지역 “일본 서부”
4) 백 엔드 – “.NET” 선택 – 다음 클릭
5) 데이터베이스 선택 – 조금 전 BACPAC을 업로드해 새로 생성한 서버
선택
6) 생성한 데이터베이스 서버 로그인 ID / PWD 입력
77. 개발 환경 구성
관리자 페이지를 위한 Azure Website 생성
Azure 관리자 포털에서 좌하단 “새로 만들기” – “계산” – “웹앱” – “빨리
만들기”
1) URL 입력
2) 앱 서비스 계획 “일본 서부” 선택(저의 캡처 화면과 약간 다를 수
있습니다.)
79. 개발 환경 구성
Visual Studio에서 배포 수행 – web.config 파일 수정
1) Visual Studio의 CloudBread 프로젝트의 web.config 파일을 열고
2) <ConnectionStrings> 요소의 항목들을 수정
DB서버주소 DB명
유저아이디 패스워드
저장소계정이름 저장
소키
80. 개발 환경 구성
Visual Studio에서 배포 수행 – DB서버/DB명/id/pwd
“연결 문자열”에 대해 설정 경험이 있다면 바로
관리자 포털에서 “SQL 데이터베이스” 선택 – “대시보드”탭 – “연결 문자열
표시”를 복사해 web.config 파일에 복사
1) DB서버 주소 – 관리자 포털 확인
2) 관리자 포털에서 “SQL 데이터베이스” 선택
3) 목록들 중 생성한 데이터베이스 클릭
4) 하단에 “서버” 부분에 서버 주소 또는 “대시보드” 부분에 “서버 이름”
항목에서 서버 주소 확인 가능
5) DB명은 “CloudBreadDB”로 설정(다른 이름일 경우 포털의 SQL
데이터베이스에서 확인해 설정
6) id / pwd는 관리자 포털에서 “SQL 데이터베이스” 선택 – “대시보드”탭 –
“연결 문자열 표시”를 보면 id를 볼 수 있고 비밀번호는 입력한 비밀번호
입력
81. 개발 환경 구성
Visual Studio에서 배포 수행 – 저장소 계정이름 / 저장소키
관리자 포털 – “저장소” – 생성한 저장소 선택 – 하단 “엑세스 키 관리” 에서
“저장소 계정 이름”과 “기본 엑세스 키”를 web.config 파일에 복사해 이용
수정된 web.config 저장
82. 개발 환경 구성
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) 게시가 완료되면 브라우저가 열리고 자동으로 프론트엔드 사이트 열림
86. 개발 환경 구성
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 프로젝트 배포 완료
93. 개발 환경 구성
Visual Studio에서 프론트 엔드 – CloudBreadAdminWeb 프로젝트 배포
1) 관리자 페이지 배포 과정이고 CloudBread 프로젝트 배포와 유사함
2) CloudBreadAdminWeb 프로젝트 루트의 “web.config” 파일을 열고 연결
문자열 편집 필요
3) 총 세 부분이고
94. 개발 환경 구성
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) 게시가 완료되면 브라우저가 열리고 자동으로 프론트엔드 사이트 열림
95. 개발 환경 구성
1) 게시가 완료되면 로그인 페이지가 열리고 기본 테스트 계정으로 입력된
CBAdmin / P@ssw0rd
로 로그인
2) 로그인이 완료되면 상단 메뉴를 통해 CloudBread 전체 데이터에 대한
조회,삽입,수정,삭제 과정이 가능
98. 로컬 개발 환경 구성
서버 개발자이고 로컬에 개발환경이 필요할 경우
로컬이나 사내망에 SQL서버를 설치해 개발에 사용할 경우 web.config
파일의 연결 문자열을 (local) 등으로 수정해 사용해 로컬에서 작업 가능
SQL서버가 설치되어 있을 경우 BACPAC 파일 가져오기를 수행