MMoRPG 서버 프로그래밍 질문

bookgekgom의 이미지

허접한 질문 이지만 답변을 해주시면 감사하겠습니다.

저는 아주 간단한 온라인 게임을 만들어 보긴 했는데요.

이런 게임 종류는 처음 이라서 말이죠.

저는 서버를 다음과 같이:

1. 게임 서버 (더 작게 나누자면: 아이템 서버, 몬스터 서버, 유저 서버, NPC 서버로 나뉨)

2. 로그인 서버;

이렇게 크게 두가지로 나누구요.

서버가 맨처음 시작되면 데이터베이스에 저장된 초기화 정보들을 "모두" 메모리에 로딩시키고 메모리에서 업데이트가 이루어 집니다.

물론 중요한 정보 (예를 들면 아이템의 소유권) 는 바로 데이터 베이스에 업데이트를 해줍니다.

하지만 중요하지 않은 정보 (예를 들면 몬스터의 좌표같은것) 는 메모리 에서만 업데이트를 합니다.

클라이언트는 게임에 접속하면 자신에게 필요한 정보(예를 들자면: 유저 좌표 주위에 아이템, 몬스터 정보들)을

서버가 메모리에서 찾아서 패킷으로 넘겨주고, 클라이언트는 그 정보를 토대로 화면을 출력합니다.

아직 구현은 안하고 상상만으로 종이에 그려보고 있습니다.

저는 게임 프로그래밍을 전공으로 한번도 배우지 않아서 엉터리일 확률이 100% 입니다.

웃지마시기를...ㅠㅠ 으허헐헣허허헝ㄴ

여기서 질문인데요.

1. lineage 같은 mmorpg 의 기본 서버 구조와 구성은? 간략하게 설명혹은 링크 부탁드립니다.

2. 실시간으로 바뀌는 게임의 정보(몬스터, 아이템, 유저등...) 는 지금 내가 하듯 memory 에 모두 로딩하여 관리 하는가?

아니면 sql DB 에 직접 수정을 가하는가? 혹은 적절한 조합?

3. 클라이언트에게 정보(패킷)을 보낼때, 객체(혹은 스트럭쳐)단위로 보내야 하는가?

혹은 데이터 타입 단위로 쪼개어 보내야 하는가?

혹은 스트링으로 한줄에 보내는가?

혹은 더욱 좋은 방법이 존재하는가?

4. 이와 같은 서버를 만들때 언어의 중요성과 운영체제의 중요성은?

추천하는 운영체제와 언어는 무엇인가?

답변을 기다리겟습니다.

chadr의 이미지

일단 게임의 규모에 따라서 서버의 구성들이 많이 바뀌게 됩니다.
사용자가 얼마 없고 충분히 커버가 가능하다면 굳이 서버를 여러개 나눌 필요는 없습니다.
나누면 좋겠지만 서버들간의 동기화와 각 서버들이 죽었을 경우와 같은 예외 사항을 신경 써야하므로
규모가 작은 게임의 경우에는 나누는게 오히려 비효율적입니다.

1. 리니지와 같은 대형 게임의 경우에는 질문자님이 말씀하신것과 비슷하게 나뉘어있습니다. 실제 리니지의 게임서버 구성은 대외비에 해당될테니 알기는 쉽지 않지만 로그인서버, 게임서버, 몬스터서버, 인던서버 등으로 나뉘게 됩니다.

2. 기본적으로 서버 시작후 데이터 입출력은 메모리에서 한다고 생각하셔야 합니다. 중간중간 중요한 데이터들은 데이터베이스에 바로 기록을 해야하겠지만 그렇지 않은 데이터(서버가 죽어서 날아가도 게임상 전혀 지장이 없는 데이터)는 메모리에서 입출력을 해야합니다. 데이터베이스를 임시 데이터 기록 용도로 사용하실 생각은 하면 안됩니다. 디스크 io보다 더 느린게 데이터베이스 입출력일수도 있습니다.

그래서 데이터베이스를 게임서버에서 직접 엑세스 하는게 아닌 dbms서버 앞단에 간단한 디비캐시 서버를 두어
사용하는 경우도 있습니다만 그렇다고 해서 데이터베이스를 임시 데이터 기록 용도로 사용해선 안됩니다.

3. 데이터를 보내는 방법은 각각 장단점이 있으니 어떤게 좋다고는 말씀드리기가 힘듭니다.
크게 두가지로 나누자면 바이너리와 텍스트 방식이 있습니다.

바이너리는 메모리에 있는 데이터를 그대로 전송하는 것이고 텍스트는 메모리의 데이터를 텍스트형식으로
인코딩하여 전송하는 방식입니다.

바이너리의 경우에는 클라이언트와 서버의 cpu가 동일한 엔디언이라면 상관이 없지만 서로 다른 엔디언 방식을
사용한다면 이를 조절해서 전송해줘야합니다.

텍스트의 경우에는 엔디언을 신경쓰지 않아도 되지만 전송시 인코딩과 받는쪽에서 디코딩과정이 필요하므로 추가적인 연산이 필요합니다. 그리고 바이너리에 비해서 패킷 분석이 쉬우므로(암호화 하면 달라집니다만) 해킹에 위험합니다.

일반적으로 바이너리로 보낼때는 구조체에 넣어서 전송을 하게 됩니다. 데이터타입별로 하나씩 보낼려면 귀찮죠.. 한꺼번에 구조체에 보낼것을 몰아넣은 다음에 구조체 크기만큼 전송을 하면 간편하니까요..

4. 언어는 대부분 c/c++을 이용하여 만듭니다. 아직까진 그래도 c/c++만큼 성능 나오는 언어가 없기 때문입니다.
운영체제는 예전에는 비윈도우계열을 많이 썼지만 요즘은 점점 윈도우계열 서버를 사용하는게 늘어난다고 합니다. 일단 개발이 편하기도 하고 운영체제에 문제가 생겨 서비스가 중단되었을 경우 ms에서 손해배상도 해준다고 하네요..(손해배상 부분은 들은 이야기라 확실하진 않습니다.)

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.