Skip to content
This repository was archived by the owner on Jun 14, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@
* Http 서버 열기
* 웹소켓 핸들링하기

## 환경
* [환경 개요](doc/environment_outline.md)

## 스크립팅
* [서버에서 루아 스크립트 사용하기](doc/lua_scripting.md)

Expand Down
22 changes: 21 additions & 1 deletion doc/db_outline.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,14 @@

실버바인 서버 엔진 2의 데이터는 크게 두 가지로 구분할 수 있습니다. 도큐먼트와 글로벌 테이블입니다.


## 도큐먼트

타입|키|정렬|비고
-|-|-|-
SingularTable|X|X|하나의 행만 가질 수 있음
PluralTable|X|X|O
PluralTableWithKey|O|X|키로 조회 가능
DequeTable|X|O|양쪽 끝에서 삽입과 삭제가 모두 가능

도큐먼트는 유저별 데이터를 저장하기 위해 만들어졌습니다. 유저 한 명당 하나의 도큐먼트를 만들고, 도큐먼트 id를 그대로 유저 id로 사용하고, 해당 유저에 속하는 데이터를 전부 그 도큐먼트에 저장합니다. 유저와 1:1 관계가 아니더라도, 유저 수에 비례해서 존재할 데이터도 도큐먼트로 모델링하면 좋습니다. 길드/클랜이 대표적인 예가 되겠습니다.

Expand All @@ -27,16 +33,30 @@ MMORPG 아이템 인벤토리를 어떻게 저장할지 상상해 봅시다. 아
도큐먼트별 테이블은 키 컬럼을 하나 갖도록 설정할 수 있습니다. 키 컬럼을 갖는 테이블에서는 키를 가지고 행을 바로 조회할 수 있고, 키 컬럼의 값들은 그 도큐먼트의 테이블 안에서 유일함이 보장됩니다.

도큐먼트는 자동발급된 `int64` 값으로만 식별할 수 있습니다. 따라서, 도큐먼트를 id 이외의 다른 방법으로 찾으려면 글로벌 테이블을 함께 이용해야 합니다. 외부 계정 식별자로부터 유저 id를 찾는 과정이 대표적인 예가 되겠습니다. 글로벌 테이블에 외부 계정 식별자를 키로 하고, 컬럼 중 하나에 도큐먼트 id를 저장하면 됩니다.

도큐먼트별 테이블은 양쪽 끝에서 삽입과 삭제가 가능하도록(deque)을 설정할 수 있습니다. 이 경우 데이터는 삽입한 순서대로 정렬이 유지됩니다.


## 글로벌 테이블

타입|키|정렬|비고
-|-|-|-
GlobalTable|O|X|반드시 Key로 조회 해야 함
OrderedGlobalTable|O|O|점수로 순위를 정렬 함


도큐먼트 테이블로 만들기 곤란한 데이터는 글로벌 테이블에 넣으면 됩니다. 행의 개수가 너무 많거나 접근이 너무 빈번해서 성능 문제가 예상되는 경우, 개념적으로 특정 도큐먼트에 속하지 않는 경우, 도큐먼트를 찾기 위한 인덱스로 활용하기 위한 경우 글로벌 테이블을 사용합니다.

글로벌 테이블은 도큐먼트 테이블과 다르게 반드시 키를 가져야만 하고, 테이블 전체를 한꺼번에 조회할 수 없습니다.

글로벌 테이블은 점수로 순위가 정렬하도록(Ordered) 정의할 수 있습니다. 정렬된 글로벌 테이블의 Key는 Redis StoredSet을 사용하여 저장됩니다.


## 데이터 스키마

어떤 종류의 글로벌 테이블이 있는지, 어떤 종류의 도큐먼트가 있으며 그 안에는 어떤 종류의 도큐먼트 테이블들이 있는지, 각 테이블을 이루는 행에는 어떤 필드가 저장되는지를 `.schema` 파일에서 정의합니다.

## 데이터베이스 메타데이터
게임서버에서 데이터 스키마로 정의한 정보는 컴파일시 코드생성기를 통하여 데이터베이스 메타데이터(DatabaseMetadataForServer) 소스코드로 생성됩니다.

데이터베이스 메타데이터는 게임서버 초기화 시 엔진 내부로 전달하고, 각 테이블의 TypeId 확인이나 트랜잭션(Lock) 처리에서 사용하게 됩니다.
56 changes: 56 additions & 0 deletions doc/environment_outline.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# 환경 개요

## 소개

환경은 게임서버가 작동하기 위한 외부 요소들을 통칭합니다.

* 장비, DB, 네트워크 설정 등
* 게임서버의 배포를 자동화하고 제어하는 기능
* 운영툴, 에러리포트, 분석시스템 등


## VGS (Virtual Game Service)
게임서버 개발을 진행하는 경우 테스트나 검수, 심의 등 다양한 용도로 작은 환경을 구축해야 하는 일이 빈번하게 발생됩니다.

실버바인 서버엔진 2 에서는 여러 서비스가 하나의 환경을 공유 할 수 있도록 디플로이 도구를 설계하여,
작은 환경을 빠르고 편리하게 구성 할 수 있습니다.

각 게임 서버는 독립적인 가상환경(Virtual Game Service)에서 논리적으로 격리되어 있어
하나의 장비에서 동작하더라도 서로 간섭이 발생하지 않습니다.

## 백오피스

### HTTP Gateway
백오피스의 웹 데몬입니다.

환경과 게임서버를 조작하기 위한 기능들이 포함되어 있고,
게임서버에서 제작한 커스텀 백오피스 앱의 진입점이 됩니다.

### 에러리포트
서버에서 발생하는 오류(C# 스택 트레이스)를 수집하고 리포팅 합니다.

### 모니터링
엔진에서 측정할 수 있는 모든 값을 측정해서 기록합니다.

수치가 정상 범위를 벗어나면 알람을 띄워주는 기능을 포함합니다.

* 초당 요청 처리량
* 세션 개수
* 연결되어 있는 소켓 개수
* 등록되어 있는 타이머 개수
* DB 조회 횟수
* 활성화된 VActor 개수
* 메인 스레드 점유율, 지연시간
* 백그라운드 스레드 지연시간
* 파이버별 실제 CPU 사용시간

### 운영툴
게임 내의 데이터를 조회하거나 서버를 원격제어 할 수 있는 웹 기반 도구를 제공합니다.

급변하는 웹 트렌드를 따라잡지 않아도 되도록 자체 제작 웹 프론트엔드 프레임워크([Jul8](https://github.com/devcat-studio/Jul8))를 사용합니다.


## 슈퍼바이저
슈퍼바이저는 게임서버의 실행과 배포를 담당합니다.

컨맨드라인 명령으로 패키징과 업로드, 재시작을 수행 할 수 있습니다.