C++이후 세대의 언어로 대용량 게임 서버 만들기?

요즘 저거에 대해서 생각을 좀 하게 되었는데 – 특히 Java를 써서 -  실제 가능성 여부는 둘째치고 일단 대용량 게임 서버를 만든다면 필요한게,

  1. 대용량 I/O. 특히 서버 쪽에서 처리하기 쉬운 형태일 것
  2. 서버 쪽에서 사용 가능한 스크립트 레이어가 있을 것 – 자체 제작도 좋고 Lua, GameMonkey 같은 류의 스크립트랑 연동이 가능할 것
  3. Multi-threaded 환경에서의 적정 수준의 locking-primitive가 제공될 것
  4. 속도 – 해당 서버의 패러다임에서 충분한 성능(eg. 접속자 수, 반응 시간 등)을 얻어낼 수 있을 것
  5. 게임의 규모가 커졌을 때의 대응 방식

정도일 것 같은데. 사실 1번 문제는 OS에 상당히 의존적인† I/O 모델을 어찌 가져다 쓰느냐에 달려있으니 Java 언어 수준의 문제다. 2는 Lua java bind가 있으니 일단 다른 언어들도 충분히 가능한 것 같고(Lua의 경우 C++보다 오히려 Java 쪽에서 쓰기 좋은듯; 속도는 모르겠고).

문제는 3, 4, 5다. 사실 Java로 대용량 서비스를 하는 경우는 그런대로 있다. 학교 수강 신청 페이지도 JSP이긴한데 – 덕분에 성능 무지안나온다. JSP로 만들 서비스가 아니었다고밖엔. 사실 서비스 자체가 개념적으로 독립적인걸 여러개 처리하는 경우면 서버만 늘리면되니까 크게 문제가 안되는데, 게임 같이 하나의 "세계"를 공유하는 경우에는(특히 MMORPG?) 서버 자체의 성능 이슈인 3, 4, 5의 문제가 발생한다.

현재에만 따져보면 3, 4, 5 그리고 1번 이슈 약간해서 Java로는 좀 부족하지 않느냐 하는 것이 내 판단이지만. 앞으로 가까운 미래에  어찌 될지는 뭔가 내 예측 범위가 아닐까 -_-;; 과거에 집착하다가(…) 미래를 놓치게 되는 것만큼은 피해가고 싶은데; 앞으로 한 4일 정도는 C++ addicted에서 잠시 벗어나야겠다.

사실 굳이 Java가 아니어도  C++/CLI나 C#같은 애들도 있으니까; C++/CLI나 C#의 스레딩 모델 자체가 상당히 C++ 스러운 짓도 할 수 있고해서(물론 몽땅은 아니지만) 맘에 드는데 -_-a 과연 이걸로 서버를 몽땅 짜고도 괜찮을까하는건 좀 의심스럽긴해서.

사실 지금 일반 응용 레벨에서 C++의 시대는 거의 끝나가고 있다. 물론 갑자기 사라진다기보단 서서히 희미해져가는 것이겠지만. 그런 의미에서 이게 바뀔만한 시점도 판단해야겠고 -_-a 주말에도 아주 고민이 사라지질 않는구나;

*

†  예를 들어 파일 디스크립터 / 소켓을 일일이 검사하지 않고도 뭔가를 하려면 사실 상 Linux의 /dev/epoll Win32의 IOCP (GCQS) 나 FreeBSD의 kqueue를 써야하는데, Java에서 이걸 어떻게 래핑해서 보여주느냐가 좀 궁굼하다. 그냥 사실 상 쓰지 않느냐, 아니면 밑 단에 따라 된다/안된다로 갈리냐하는건 내가 잘 모르니 -_-;; 혹시 가능하거나/사용할 수 없다거나 하는 정보를 알면 좀 알려줍시다(…)

‡ 이건 개발 편의성과도 연관이 있지만 그 자체가 어느 정도 개발 속도와 성공에도 영향을 끼치는 요소라고 생각한다.

Jinuk Kim
Jinuk Kim

SW Engineer / gamer / bookworm / atheist / feminist

Articles: 935

12 Comments

  1. * 2번: 클래스 동적 로딩을 이용해서 스크립트와 호스트를 같은 언어를 써버린다면 어떨까! (….)

    * 내 입장에서는 서버와 클라이언트의 게임 로직 코드 공유가 엄청 커보인다. 그런 의미에서 클라이언트를 닷넷으로 부담없이 만들 수 있을 때쯤 서버도 그렇게 되지 않을까 생각함… C++/CLI에서 네이티브용으로 만든 C++코드를 얼마나 수정없이 갖다 쓸 수 있는지 궁금하네.

    * 게임 서버는 적당한 동시 접속자에 높은 시간당 처리율, 낮은 응답시간이 필요하고 접속자간 실시간 상호작용이 굉장히 많은데, 자바를 써서 그런 걸 잘 구현해낸 사례가 있나 궁금함. 자바로 높은 시간당 처리율은 검증된 것 같은데 다른 건?

  2. 홍민희 / *산업*에서 쓰기엔 Erlang 등의 언어는 사용하는 사람 수가 너무 적습니다.

    Rica / 같은 언어로는 좀 그렇지 않냐; 사실 스크립트 쓰는게 재 컴파일 없이 쓴다도 있지만 기획자들이 직접 접근할 수 있게도 도와준다도 있으니.

    서버/클라 로직 공유도 상당히 크지 뭐 그런점도 있네. Java로 높은 시간당 처리율 검증된 모델은 글쎼 -_-a 서버 페이지류는 그냥 서버를 늘리면 되니;

    nasunho/ C#은 상당히 로레벨한 것도 Win32 환경에 한해서는 어느정도 접근이 되니까 그게 가능한듯. Java는 글쎄 -_-;; 근데 C#으로 *MMORPG*수준의 로직 처리와 I/O를 감당한 경우는 있냐? 아직 여기까지는 없지 않을까;

  3. 사내에서…스케일이 큰 신규 MMOPRG의 서버 및 클라이언트 모두
    C#으로 개발 되는 걸로 알고 있어요…

  4. nasunho / 그거 참 재밌는 정본데(………). 근데 뭐 ICOP도 쓸 수 있는 C#이고 보면 -,-
    Rica 말 처럼 양쪽 단에서 같은 언어를 쓰면 코드 공유 문제도 상대적으로 깔끔해질테고;

  5. 자바의 경우 nio 패키지가 대용량 IO를 처리를 위해 나온 것입니다. 1.4에서 처음 등장했고, 현재 5.0, 6.0이 나왔으니 성능 향상이 많이 되었을 거라 추측합니다만, 리눅스의 경우 /dev/epoll 을 랩핑했는지는 잘 모르겠습니다. 공개된 자바 소스를 분석해 보면 알 수 있겠죠.

    2.번의 경우는 c++의 경우보다 상황이 좋을 겁니다. 상당히 많은 수의 스크립트 언어가 jvm 위에서 자바 코드와 상호작용할 수 있죠. 6.0에서 이 지원이 정식으로 포함되었습니다.

    3.번 multi thread의 경우 5.0에 많은 지원이 추가되었습니다. 전통적인 monitor외에 semaphore, lock 등 여러 가지가 추가되었지요.

    자바의 속도 문제의 경우 이제는 특별한 경우 c++를 앞지르는 경우도 벤치마크되고 있으니 고려해 보는 것도 재미있을 듯 합니다. 다만 GC 문제 때문에 실시간 반응을 해야 하는 게임 서버의 경우는 아직은 좀 어려울 수도 있겠네요.

    C/C++ 쪽 경험은 없어서 체감으로 느끼는 게 어느 정도인지는 모르겠지만 제 생각으론 가능하지 않을까 생각합니다. :)

  6. rein/ 과연 lua가 C#보다 쓰기 쉬운가? (….)
    어차피 문법의 서브셋만을 정해진 패턴대로 쓸거라면 어떤 언어나 비슷하지 싶음..

    그리고 lua도 빡세게 쓰기 시작하면 열라 어렵던데 흑 흑

  7. Purple / GC문제가 좀 심각하긴합니다. C++위주로 계속 써왔기 때문인진 모르겠지만 그것 때문에 멀티 스레딩 관련된 메모리 할당자나 / 소멸자의 역할이 좀 크거든요;
    그리고 I/O 팩키지는 현재 DarkStar 구현체는 밑단에서 다른 라이브러리를 쓴다고하는데 이걸 잘 모르겠어요 -_-a (Java 기본 nio가 아니라 무슨 라이브러리를 가져다 쓴다고)

    Rica / 음 C#으로 가벼운 유저 레벨 스레딩이 가능한가 + 하나의 실행 문맥을 관리하기 쉬운가 하는 문제가 있지 않을까;

  8. SGS에 대한 실망, 감상…

    얼마 전에 Sun Microsystems의 CGO가 – 무슨 약자인지는 알아서 상상을 :p – SGS†라는 물건을 팔러왔다.
    나름대로 기대도 하고 질문할 꺼리도 준비하고 보내준 자료도 분석하…

  9. Project DarkStar 는 왜 실패했을까?…

    SUN의 Java 기반의 게임 서버 프레임웍인 Project DarkStar 는 왜 실패했을까? 내가 예전에 생각했던 것과, 요즘 들어 든 생각들을 모아서 요약해봤다…….

Leave a Reply