본문 바로가기
Server

5.기본 모바일 서버 만들기(1)

by Doromi 2018. 1. 7.
728x90
반응형

3-1.서버 설계

 

요즘은 스마트폰의 성능이 좋아지면서 게임들이 온라인화되기 시작했다.

최근 모바일 게임들은 대부분 무로료 다운 받아서 인앱 결제를 통해 수익을 받는다.

게임을 구입해야 설치가 가능한 게임들은 매출 순위가 낮고, 인앱 결제 방식의 부분 유료화 게임들이 상위권이다.

 

이렇게 되면서 서버의 중요성이 매우 커졌다. 게임의 데이터가 스마트폰에 있을 경우에는 유저 마음대로 조작이 가능하기 때문에 굳이 인앱 결제로 돈을 지불하지 않아도 유저가 원하는 대로 플레이가 가능하다.

이를 막기 위해서는 서버에서 데이터를 가지고 있어야 하고 서버가 게임의 플레이를 제어하고 검증해야 한다.

 

모바일게임은 데이터로 할 경우 서버에 대한 반응 속도가 빠르지 않아도 문제없이 게임이 동작하도록 해야한다.

그리고 PC에 비해 열악한 이유도 있기에 단순해야 한다. 1분에 패킷이 10번 정도면 많은 편이다.

패킷 수가 적다보니 패킷의 구조는 최적화가 필요 없다.

다만 패킷의 암호화는 필수적이다. 패킷 구조가 쉬우면 누군가가 수정하기도 쉬워지기 때문에 암호화를 하면 가로채더라도 수정된 패킷을 만들기가 어렵다.

 

서버는 디비 서버와 게임 서버는 분리된다고 하더라도 게임의 기능들까지는 분리될 경우 관리가 복잡해진다.

가장 좋은 방법은 물리적 서버 한대에 설치된 서버 프로그램 안에 모든 게임의 기능이 다 포함되어 있어 사용자가 많아질 경우 똑같은 물리적 서버만 계속 추가하는 방식으로 구성하는 것이다.그러면 훨씬 자동화하기도 쉽다.

 

프로그램의 성능을 개선하려면 프로그램을 멀티 프로세서에 적합하도록 만들어야 한다.

즉 각 기능들이 동시성에 충족되도록 동작해야 하며, 병렬화가 가능한 구조여야 한다.

 

3-1-1.동시성과 병렬성

 

여럿이 한 가지 작업을 동시에 진행하는 것을 병렬성

게임서버라는 하나의 기능을 수행하는 여러 대의 서버는 병렬적인 구성이다.

 

여러 가지의 일을 동시에 처리하는 것이 동시성

게임 서버 내부에서 동시에 실행되는 많은 기능들을 동시성이라고 생각하면 된다.

동시성에서 가장 중요한 것으 동시에 수행되는 기능들의 빠른 반응이다.

 

 

3-2.기본 모바일 서버 만들기

 

실제 개발 작업에서 클라이언트와 연동을 위해 먼저 해야 할 것은 포로토콜을 정의하는 것이다.

 

3-2-1.컴퓨터 네트워크

 

넓게 보면 컴퓨터와 컴퓨터 사이를 통신망으로 연결한 모든 것을 의미하지만, 일반적으로는 대중적으로 가장 많이 사용하고 있는 인터넷 즉 TCP/IP라 불리는 네트워크를 의미한다.

 

3-2-2.프로토콜 정의

 

프로토콜은 전송규약이다. 클라이언트와 서버간 데이터 즉 패킷을 어떤 모양으로 주고 받을지 정하는 것.

IP layer에서 프로토콜을 구현하는 것을 생각해보겠다.

Raw socket을 이용하는 방식인데, 모바일 게임과 맞지 않고 하더라도 할 일이 너무 많다.

그럼 이것의 상단인 Transport layer에서 프로토콜을 구현해야 한다.

즉 TCP를 사용할 것인지 UDP를 사용할 것인지가 될 거다.

 

모바일 게임의 경우 클라이언트와 서버 간의 패킷의 신뢰성을 보장해야 하므로 TCP를 선택하는 것이 맞다.

그럼 Transport layer에서는 TCP기반으로 작성하기로 하였고, Application layer에서는 모바일 서버에 어울리는 프로토콜은 HTTP이다.

 

3-2-3.HTTP

 

클라이언트는 TCP를 이용해서 해당 포트에 접속하여 요청을 보낸다.

서버는 요청에 대한 응답 코드와 데이터를 전송하고 접속을 끊는다.

웹 브라우저의 동작은 모두 HTTP를 기반으로 하고 있다.

 

GET /index.html HTTP/1.1

일반적인 브라우저의 요청은 이렇다.

웹 서버에 index.html의 내용을 보내달라고 요청하는 것

 

웹서버에서 클라이언트의 응답에서

HTTP/1.1 200 OK

여기서 200이 바로 응답 코드다.

웹 서버는 index.html이라는 파일이 있는지 확인하고, 있다면 그 내용을 웹 브라우저로 전송한다.

없으면 404 코드를 보내는데 아무 이상이 없으니까 200이 전송되었다.

 

GET /hello/world 이런 요청 값이 웹 서버로 들어온다면 우리는 JSON 형식의 문자열을 전송하도록 하자.

JSON은 XML보다 사이즈가 작으면서도 사람이 보기에 편한 구조다.

또 JavaScript의 구문이라 웹 환경과 연동하는 데 편리하다,.

그래서 우선 응답 값으로,

{result: Hello world!} 라고 전송하도록 구현하겠다.

 

3-2-4.얼랭의 HTTP Server

 

HTTP Server로 가장 유명한 것은 Apache와 IIS가 있다.

이런 것들을 사용하지 않고 얼랭으로 작성된 HTTP Server(Web server)를 사용하는 것은 어떤 장점이 있을까?

 

아파치의 경우 유저의 요청 작업을 몇개의 worker process에서 처리한다. 메모리를 공유하기 때문에 특정 에러는 전체 웹 서버에 영향을 미칠 수 있기 때문이다.

얼랭의 경우 일반적으로 유저 한 명 당 프로세스 하나가 담당하여 처리한다.

프로세스 하나하나가 모두 웹 서버이다.

각각의 프로세스가 독립적으로 동작하기 때문에 결국 웹 서버가 독립적으로 동작한다는 의미이고, 어디서 에러가 난다고 해서 다른 프로세스에게 영향을 미치지 않는다.

유저의 세션 하나당 웹 서버가 하나씩 동작하는 것이 얼랭의 방식이다.

 

얼랭에는 자체적으로 HTTP Server가 내장되어 있지만 간단한 기능만 제공하기 때문에 오픈 소스 프로젝트 중에서 하나를 선택할 것이다.

Cowboy : 성능 뛰어남

Yaws : 기능 많음

Mochiweb : 단순이 장점

 

향후 발전가능성이 높은 Cowboy를 이용하겠다.

 

 

728x90
반응형

'Server' 카테고리의 다른 글

7. 로그인(1)  (0) 2018.01.10
6.기본 모바일 서버 만들기(2)  (0) 2018.01.10
4.개발 환경 구축하기(3)  (0) 2018.01.07
3.개발 환경 구축해보기(2)  (0) 2018.01.06
2.개발 환경 구축해보기(1)  (0) 2018.01.05