클라이언트 튜터님께서 데디케이트 서버 구성이 아니면 추후에 부하에 따른 처리가 어떻게 되는지 생각해본적 있냐고 하셔서
추후 구현과제로 남겨두었던 분산서버에 대하여 구글링을 조금 했다.
지금 당장 교체할 내용은 아니지만 미리 찾아두면 좋을 거 같았다.
분산 서버는 여러대의 서버가 서로 통신하여 하나의 시스템처럼 작동하는 구조를 말한다. 이 방식은 부하를 분산할 수 있고 가용성과 확장성을 높이며 장애가 일어난 서버만 해결하면 되는 구조이다.
위에도 간단히 써있지만, 특정 작업(인증,매칭,게임 등)을 여러 서버가 나누어서 처리하게 된다. 서버는 각자 독립적인 역할을 수행하거나 뒷받침하는 용도로 결과를 생성한다. 새로운 서버를 추가하는 것(수평적 확장) 만으로도 시스템 성능을 쉽게 확장할 수 있다. 또, 일부 서버가 고장이 나도 나머지 서버가 작업을 이어 받아 서비스를 지속할 수 있다는 장점이 있다. 다만, 각 1개씩만 서버를 두면... 해당 사항 없다.
API + TCP
회원가입, 로그인의 경우 API를 통해 진행하고, 게임시작을 요청할 경우 인증세션은 매칭서버로 해당 내용을 전달한다. 매칭이 완료되면 게임서버로 정보를 전달을 하고 인증세션에서 게임서버의 주소값을 넘겨준다. 클라이언트는 게임서버로 소켓 연결을 시도하고 게임서버는 매칭 조건에 맞는 유저끼리 게임세션에 추가하여 게임을 진행한다.
중계
클라이언트 - 인증서버 - (게임서버 - 매칭서버) 구조로 클라이언트는 최초 인증서버에만 소켓 연결을 하면, 세션을 다시 연결할 필요 없이 인증서버가 소켓을 중계해준다. 근데, 굳이 이런 방식이라면 분산구조의 이점이 없을 것 같았다.
핸드오프
핸드폰의 경우 이동하며 통화를 하면 기지국 간 핸드오프가 이루어 지는 것으로 알고 있다. 이를 활용하여 TCP 핸드오프 개념을 통해 인증세션에서 게임서버로 소켓을 넘겨주는 방식을 찾아보았지만, 자료가 없었고 스택오버플로우에 질문한 결과 불가능은 아니지만 복잡하고 비효율적이라는 것을 알았다.