안녕하세요? 김성중입니다.
이번에는 프로젝트의 성격과 맞는 서버 엔진을 구성하기 위해 몇 가지 조사를 하였습니다. 저는 기존에 게임 서버에 대해 아는 것이 별로 없다는 것을 밝혀두는 바입니다...ㅎㅎ
게임 서버하면 가장 먼저 생각났던 것은 바로, NDC 2014에서 발표했던 데브시스터즈 홍성진님의 '쿠키런 1년, 서버개발 분투기' 이었습니다. 슬라이드에서도 볼 수 있듯이, 홍성진님은 부하에 견딜 수 있고, 업데이트가 쉬운 서버를 개발하기 위해서 서버 스팩으로 Java 8, Spring 4.0, MyBatis를 선택하였습니다. 사용자 데이터 관리에는 Couchbase를 사용하였고, 게임 운영 데이터를 위해 MySQL과 Redis를 사용하였습니다. 또한 개인적으로 가장 강력하다고 볼 수 있는.. AWS AutoScale을 사용하였습니다. AutoScale은 부하에 따라 서버 대수를 자동으로 조절해주는 서비스입니다. AutoScale을 사용하려면 시스템 설계 단계에서 Scalability에 대한 고려를 충분히 한 다음 설계를 해야겠죠??
서버와 개발 관련한 경험도 부족하므로.. 훌륭한 게임 서버의 아키텍쳐를 벤치마킹 할 필요가 있다고 생각합니다. 다만 스팩을 모두 가져다 쓰기 보다는 자신 있는 것을 선택해서 사용하는 것이 바람직하다고 생각합니다. 멤창이 제작하는 게임은 네트워크 플레이를 지원하지 않는 모바일 게임일 것이므로, 서버가 하는 일은 단순히 요청을 처리하고 데이터베이스에 기록하고 응답을 주는 일 뿐입니다. 따라서 불필요하게 복잡한 서버 아키텍쳐를 사용할 필요도 없습니다.
처음엔 Boost.Asio 라이브러리를 이용하여 저수준 I/O 프로그래밍을 하려고 하였지만.. 생산성과 Scalability 등 여러 면을 고려해 봤을 때, 이보다는 데이터베이스만 증설하면 게임 로직 서버 자체의 Scalability를 쉽게 확장 할 수 있는 웹 서버를 채택하는 것이 바람직하다고 생각하였습니다.
일단 웹 서버의 장점은 명확합니다. Scalability 면에서는 데이터베이스 외에는 상태를 저장하지 않기 때문에 로직 서버에 부하가 걸리면 AWS AutoScale과 같은 것을 이용하여 로직 서버만 증설해주면 됩니다. 또한 Unity에서는 HTTP 요청을 쉽게 처리하기 위한 WWW 클래스를 제공합니다.
따라서 Spring, Node.js, Django, Ruby on Rails 등 많은 웹 서버 프레임워크 중 저는 제가 가장 자신있는 웹 서버 프레임워크인 Node.js를 사용할 계획입니다. Node.js에는 REST API를 쉽게 작성할 수 있는 resify 모듈, MySQL에 접근하기 위한 드라이버인 node-mysql 그리고 couchbase에 CRUD를 구현할 수 있는 환경 등 필요한 기능을 충분히 제공하고 있기 때문입니다.
2016년 6월 18일 토요일
2016년 6월 15일 수요일
게임 서버 프로그래밍(1)
안녕하세요? 김성중입니다.
이 글에서는 서버/네트워크 프로그래밍에 대해 조사하면서 알게된 것들을 이것 저것 적어보았습니다.
Unity 게임과 통신 가능한 서버를 구현하기 위해 Boost.Asio를 이용하여 네트워크 프로그래밍에 대해 알아보았습니다. 먼저, Boost 홈페이지에 소개된 Boost.Asio의 의미를 살펴보겠습니다.
"Boost.Asio is a cross-platform C++ library for network and low-level I/O programming that provides developers with a consistent asynchronous model using a modern C++ approach."
"Boost.Asio는 모던 C++ 접근법을 통해 개발자에게 비동기적인 모델을 제공하는 저수준 I/O 프로그래밍과 네트워크를 위한 플랫폼 독립적인 C++ 라이브러리이다."
홈페이지에도 소개가 되어 있듯이, Boost.Asio는
Unity와 Boost.Asio를 이용한 C++ 기반 서버와 통신을 어떻게 할지 조사하던 중, Marshalling과 Serialization이라는 개념에 대해서 처음 알게 되었습니다.
마샬링(Marshalling)이란, 객체의 메모리 구조를 저장이나 전송을 위해서 적당한 자료형으로 변형하는 것을 의미합니다. 예를 들어, Unity에서 만든 구조체 등을 C++ 서버로 보내기 위해 바이트 형태로 변환하는 것입니다. Marshalling은 보통 서로 다른 컴퓨터 혹은 서로 다른 프로그램 간에 데이터를 송수신할 때 사용됩니다.
직렬화(Serialization)이란, 객체를 '연속적인 데이터'로 변환하는 것을 의미합니다. 예를 들어, 클래스/구조체/열거형/델리게이트의 객체를 직렬화하여 스트림에 읽고 쓰는 것이 가능해 지는 것입니다.
설명만 듣고 보면 마샬링과 직렬화의 차이점이 뭔지 감이 잘 오지 않을 것입니다. 쉽게 이야기하면 직렬화는 객체 자체를 복사하는 개념이고, 마샬링은 코드베이스를 가져와 만드는 개념입니다. 그래서 객체를 이용하지 않는 다른 언어 또는 플랫폼 간의 통신을 할 때 주로 마샬링 과정을 통하게 됩니다. 그리고 네트워크나 객체 싱크에는 직렬화를 많이 이용하는 것입니다.
이러한 객체 변환과 객체 전달 방법을 좀 더 찾아보니, (고수님들께서) 마샬링 하지 않고 패킷 시리얼라이징하는 방법을 찾아보라는 글을 봤습니다. C++에서는 기존처럼 그대로 패킷을 만들면 되고, C#에서는 C++에서 온 스트림을 어떻게 다시 데이터화시킬지(Deserialize), C#쪽에서 보낼 때 어떻게 스트림으로 만들지(Serialize) 에 대한 고민을 하면 됩니다.
하지만 이러한 직렬화 프로토콜을 직접 만들기엔 빡시고.. 정신 건강에도 좋지 않다고 하므로.. 그래서 나온 것이 Google protobuf 입니다.
Protobuf (Protocol Buffers)는 구글에서 내놓은 오픈소스 직렬화 라이브러리입니다. 메시지(구조체)를 연속된 비트로 만들고, 반대로 비트에서 원래 메시지로 만들 수도 있습니다. 게임에서는 패킷 전송 시에 유용하게 사용될 수 있습니다.
직렬화 프로토콜에 대한 라이브러리를 알아보던 중, (많은 고수님들께서) "이제는 모바일 게임도 ProudNet 입니다." 라는 글을 보았습니다. 그래서 ProudNet이 무엇인지 찾아보았습니다.
프라우드넷(ProudNet)은 대한민국의 넷텐션에서 개발한 온라인 게임을 위한 네트워크 서버 엔진입니다. 온라인/모바일 게임 개발에 대한 많은 경험 없이도 쉽게 서버를 제작할 수 있도록 도와주는 미들웨어입니다. 직접 사이트에서 찾아보니 프라우드넷 기반의 게임이 어마어마 했습니다.
몬스터 길들이기, 마비노기 영웅전, 스트리트 파이더 5, 세븐 나이츠, 마구마구 등 유명 게임을 비롯해 수많은 게임 서버 개발에 많이 사용되고 있습니다. 고객사로는 넥슨, 넷마블, NHN Entertainment, 스마일게이트 등이 있습니다. 유명 게임 회사들이 사용하는 걸로 보아 정말 잘 만들어진 서버 엔진인것 같습니다.
이 글에서는 서버/네트워크 프로그래밍에 대해 조사하면서 알게된 것들을 이것 저것 적어보았습니다.
Unity 게임과 통신 가능한 서버를 구현하기 위해 Boost.Asio를 이용하여 네트워크 프로그래밍에 대해 알아보았습니다. 먼저, Boost 홈페이지에 소개된 Boost.Asio의 의미를 살펴보겠습니다.
"Boost.Asio is a cross-platform C++ library for network and low-level I/O programming that provides developers with a consistent asynchronous model using a modern C++ approach."
"Boost.Asio는 모던 C++ 접근법을 통해 개발자에게 비동기적인 모델을 제공하는 저수준 I/O 프로그래밍과 네트워크를 위한 플랫폼 독립적인 C++ 라이브러리이다."
홈페이지에도 소개가 되어 있듯이, Boost.Asio는
- Asynchronous I/O (비동기 입출력)
- Cross-platform (멀티 플랫폼)
Unity와 Boost.Asio를 이용한 C++ 기반 서버와 통신을 어떻게 할지 조사하던 중, Marshalling과 Serialization이라는 개념에 대해서 처음 알게 되었습니다.
마샬링(Marshalling)이란, 객체의 메모리 구조를 저장이나 전송을 위해서 적당한 자료형으로 변형하는 것을 의미합니다. 예를 들어, Unity에서 만든 구조체 등을 C++ 서버로 보내기 위해 바이트 형태로 변환하는 것입니다. Marshalling은 보통 서로 다른 컴퓨터 혹은 서로 다른 프로그램 간에 데이터를 송수신할 때 사용됩니다.
직렬화(Serialization)이란, 객체를 '연속적인 데이터'로 변환하는 것을 의미합니다. 예를 들어, 클래스/구조체/열거형/델리게이트의 객체를 직렬화하여 스트림에 읽고 쓰는 것이 가능해 지는 것입니다.
설명만 듣고 보면 마샬링과 직렬화의 차이점이 뭔지 감이 잘 오지 않을 것입니다. 쉽게 이야기하면 직렬화는 객체 자체를 복사하는 개념이고, 마샬링은 코드베이스를 가져와 만드는 개념입니다. 그래서 객체를 이용하지 않는 다른 언어 또는 플랫폼 간의 통신을 할 때 주로 마샬링 과정을 통하게 됩니다. 그리고 네트워크나 객체 싱크에는 직렬화를 많이 이용하는 것입니다.
이러한 객체 변환과 객체 전달 방법을 좀 더 찾아보니, (고수님들께서) 마샬링 하지 않고 패킷 시리얼라이징하는 방법을 찾아보라는 글을 봤습니다. C++에서는 기존처럼 그대로 패킷을 만들면 되고, C#에서는 C++에서 온 스트림을 어떻게 다시 데이터화시킬지(Deserialize), C#쪽에서 보낼 때 어떻게 스트림으로 만들지(Serialize) 에 대한 고민을 하면 됩니다.
하지만 이러한 직렬화 프로토콜을 직접 만들기엔 빡시고.. 정신 건강에도 좋지 않다고 하므로.. 그래서 나온 것이 Google protobuf 입니다.
Protobuf (Protocol Buffers)는 구글에서 내놓은 오픈소스 직렬화 라이브러리입니다. 메시지(구조체)를 연속된 비트로 만들고, 반대로 비트에서 원래 메시지로 만들 수도 있습니다. 게임에서는 패킷 전송 시에 유용하게 사용될 수 있습니다.
직렬화 프로토콜에 대한 라이브러리를 알아보던 중, (많은 고수님들께서) "이제는 모바일 게임도 ProudNet 입니다." 라는 글을 보았습니다. 그래서 ProudNet이 무엇인지 찾아보았습니다.
프라우드넷(ProudNet)은 대한민국의 넷텐션에서 개발한 온라인 게임을 위한 네트워크 서버 엔진입니다. 온라인/모바일 게임 개발에 대한 많은 경험 없이도 쉽게 서버를 제작할 수 있도록 도와주는 미들웨어입니다. 직접 사이트에서 찾아보니 프라우드넷 기반의 게임이 어마어마 했습니다.
몬스터 길들이기, 마비노기 영웅전, 스트리트 파이더 5, 세븐 나이츠, 마구마구 등 유명 게임을 비롯해 수많은 게임 서버 개발에 많이 사용되고 있습니다. 고객사로는 넥슨, 넷마블, NHN Entertainment, 스마일게이트 등이 있습니다. 유명 게임 회사들이 사용하는 걸로 보아 정말 잘 만들어진 서버 엔진인것 같습니다.
피드 구독하기:
글 (Atom)


