게임서버 구조

2007. 1. 15. 14:19Java

지금 만들고 있는 게임서버 구조를 바꾸려고 한다.

기존의 게임서버 구조는 이러했다.

1. 로그인 인증서버, 로드밸런싱서버, 게임서버 들이 있다.
2. 클라이언트는 인증서버로 접속후 인증후 로드밸런싱서버에 접속해
    등록된 게임서버중 하나를 선택하여 들어간다.
3. 해당 게임서버에서 방을 만들거나 들어가 다른 사람들과 게임을 한다.
4. 각 게임서버 들끼리 방정보나 세션정보는 공유되지 않는다.
5. 같은 서버에서만 채팅이 가능하다.

이에 대한 문제점은 이러했다.
1. 게임서버의 확장성에 문제가 있다. 단순한 게임서버1,2,3 .. .. 으로 사용자가 선택해서 들어가 방을 만들거나 하는것에 제약이 많다.  (즉 규모가 작은 논리적으로 방을 나눌수 없다.)

2. FPS 게임이지만 클라이언트끼리 p2p는 수행하지 않는다.(서버의 부하및 트래픽 초과발생 우려)

3. 각 게임서버에 접속되어 있는 유저끼리 채팅이 되지 않는다.

======================================

사용자 삽입 이미지
===================================


 

1. 유저가 방을 만들면 Store 서버에서 적당한 서버에 방을 할당해 준다. 그럼 유저는 해당 서버로
    재접속을 수행한다.
    다른서버의 유저가 참여를 희망하면
역시 그 서버에 접속하여 참여한다.

2. 유저들은 UDP P2P를 수행한다.( 가장 전송이 빠른 유저가 메인 서버가 된다. )
    - 게임서버는 중계기 역활을 한다. (p2p가 불가능할경우를 대비)

3. 게임서버에 인증된유저가 방장이 있는 서버로 재접속할때는 다음과 같이 수행한다.
     - 로드밸런서에 해당 게임서버 ID 에 해당하는 주소를 얻어온다.

     - 해당 주소로 연결한다.

     - 로드밸런서는 해당 서버의 유저 count를 줄이고 옮기는 서버의 유저 count를 늘인다.

     - 게임서버는 이론상 다음과 같은 유저를 가질수 있다.
        해당 게임서버의 한계인원은 실질적으로 게임을 하고 있는 유저들을 바탕으로 한다.
 
        만약 해당 게임서버의 한계인원이 300명이면
               300 명 로그인 + 300명  게임인원 = 600명이 한서버에 접속되어 있게 된다.
        방갯수는 1방에 최소 4명을 기준으로 300/4=75개가 Max 가 된다. 이를 넘어가면 다른 서버에 할당하게 된다.
         즉, 한게임서버 한계인원이 600명이면, 방 Max갯수가 이의 1/4=75개가 되는것이다.
         이러면 최대로 300명은 채팅이나, 게임설정, 또다른 300명은 실제 게임을 즐길수가 있는것이다.
       

=======================================================================================
오늘 좋은 생각이 떠올랐다.
클라이언트가 방에 참여할때 , 꼭 방장의 서버로 재접속을 하는것은 필요없다는 것이다.
그럼 어떻게 할까. 방에 참여를 원하면 기존 게임서버 연결을 유지한채 방장이 있는 서버로 접속하는 것이다. 즉 방장의 서버가 그 방의 중계서버가 되는것이다.(세부 통신은 p2p 수행)

즉 원래 게임서버에 접속한 유저가 방을 만들면 해당 서버에만 방을 만들수 있으면 서로 공평하게 분배가 된다. 방을 나오면 방장서버와의 연결을 끊고 원래의 서버와 통신을 수행하기만 하면 된다. ^^

여기서 생각할것은 이거다.
1. 300명이 한계인원인 게임서버에서  300명이 모두 방을 만드는경우, 그럼 300*최소4 = 1200명이 게임하는것에 대해 중계해야한다. 엄청난 부하이다. 물론 이렇게 되지는 않겠지만..
     => 무조건 방장이 있는 서버가 중계서버가 될필요가 있을까 ?
         나의 생각에 대한 시나리오는 이렇다.
        1) 방장이 게임서버에 방생성을 원한다고 알린다.

        2) 게임서버는 Store서버에서 방생성 조건이 맞으면 승인을 하고 최적의 접속장소(중계서버이자 게임서버)를 알려준다.

        3) 이후 방장과 방의 참여자는 현재 연결중인 게임서버를 그대로 유지한채, 이 중계서버에 접속한다.
 

이렇게 하면 각 게임서버들끼리 골고루 중계서버역활을 나누어 수행하게 된다.

================================================================================
1. 게임서버의 TCP포트와 UDP 포트는 동일하다. 서로 통신방식이 다르므로 port가 같아도 상관이없다.
   UDP 자체가 받겠다는 등록을 하지않으면 데이터를 받지 않으니 상관없다.

2. 클라이언트끼로 p2p를 하기위해 UDP 포트를 열어야 한다. Hole punch를 이용해서 말이다. 흠.



by ncanis(조성준)