cyphen156

메이플랜드 채널이동기능에 대한 추측 본문

잡생각 정리글

메이플랜드 채널이동기능에 대한 추측

cyphen156 2024. 1. 15. 11:21

※ 블로그 주인장의 주관과 추측성이 난무하는 개인적인 생각이 잔뜩 들어간 글입니다.

요새 여기저기 친구들에게 메이플랜드를 전파하고 있다. 

 

전 글에서 메이플랜드 인게임 채널이동 기능이 구현되어 있지 않기 때문에 파티를 구성하여 같은 채널을 이동하려면 메이플스토리 월드라는 플랫폼안의 다른 유저 애플리케이션인 환승구역을 이용하여 파티원들을 채널에 동시에 입장시키는 기능을 사용한다고 간략하게 설명했었다.

 

최근 패치로 인해 메이플랜드 내부에서 현재 채널 인스턴스 수와, 채널당 혼잡도를 보여주는 기능이 추가되었다.

이 기능을 사용해 보았는데 나는 번거롭더라도 여전히 환승구역을 이용하는것이 훨씬 편할 것 같아 채널이동기능의 추가가 효과적이지 못할 것 같다는 생각이 들었다.

가장 문제가 되는 것은 채널창을 불러올 때 로딩 시간이 상당히 길다는 것과 게임을 이용하는 유저가 증가하는 시간대(주로 퇴근 이후 저녁시간 대)에 서버가 포화 상태가 되어 실제로 채널 이동을 요청했을 때 채널에 접속하지 못하고 게임이 접속이 종료된다는 것이다.

또한 채널 이동이 필요한 이유는 내가 이용하고 싶은 사냥터에 사람이 많아 사람이 적은 채널에서 원활히 사냥을 하기 위함 뿐 아니라 지인들과의 파티 사냥 및, 파티퀘스트, 그리고 거래와 같은 상호 작용이 필요한 콘텐츠를 이용하기 위함이다. 

C# 스크립트로 채널이동기능이 구현되었다는 가정으로 왜 이런 문제가 발생했는지를 추측해 보겠다.

우선 채널 이동 기능에 대한 구현 추측이다.

1. 클라이언트 측에서 서버측으로 현재 전체 채널 수용인원에 관한 질의 명령을 보낸다.

2. 서버는 받은 요청을 처리하기 위해 현재 활성화 되어있는 모든 채널 인스턴스의 수용인원 정보를 수집하여 클라이언트 측에 다시 전송한다.

3. 클라이언트는 여기서 받은 정보를 기반으로 이동하고자 하는 채널을 선택하고 해당 채널에 대한 접속 명령을 서버에 전송한다.

4. 서버는 클라이언트로 부터 받은 채널 이동 명령을 수행하기 위해 클라이언트가 현재 접속중인 채널인스턴스 정보를 제거하고, 이동하려는 채널로 재접속 명령을 내린다. 이 과정중에서 게임이 한번 재접속된다(로딩이 발생한다).

 

이 과정이 단 한명의 유저의 채널이동 요청에 대한 기능구현이라 생각된다.

 

하지만 위에 올린 동영상에서 보듯이 현재 활성화 된 채널 인스턴스가 22(page) * 60개 가량 된다.

여기서 각 채널당 수용인원이 60명이기 때문에 서버가 포화상태라는 가정 하에 약 8만명의 사용자를 담고있는 것이다.

현재 글 쓰는 시각이 약 오전 11시이기 때문에 원활이나 혼잡 채널이 많지만, 접속 유저가 증가하는 저녁 시간의 경우 거의 모든 채널이 포화 상태로 표기된다.

 

채널 이동 요청을 1초당 1000명만 질의를 날려도 서버에 과부화를 주기 충분해 보인다.

 

서버에 접속하지 못하고 튕기는 현상의 경우

클라이언트의 요청을 받은 뒤 서버에서 명령을 처리하여 다시 보내기 때문에 클라이언트가 현재 받은 채널 수용인원 정보가 실시간 정보가 아니라는 것에 있다. 

하지만 만약 채널 수용인원 정보가 실시간 정보가 맞다고 해도 동일한 문제가 발생할 것이다.

튕김 현상의 근본적인 원인이 동기(Sync) 문제로 보이기 때문이다.

동기 문제가 발생하는 이유는 메이플랜드의 서버 접속 명령이 채널 이동명령과 새로 접속하는 유저의 요청 모두를 처리해야 하기 때문이다.

새로이 접속하는 유저의 경우 튕김 현상이 발생하지 않는 이유는 서버가 실시간으로 여유가 있는 채널을 탐색하여 자동으로 분배하기 때문에 튕김 현상이 발생하지 않는다. 

하지만 채널 이동 명령의 경우 특정 채널로 접속 명령이 고정되기 때문에 만약 클라이언트에서 원활 상태인 채널로 채널이동요청을 서버로 보냈다 하더라도, 서버에서 자동 접속 명령을 통해 이미 해당 채널의 수용인원을 모두 채워 포화 상태로 만들었을 경우 해당 채널로 접속하지 못하도록 서버 접속을 막기 때문에 채널 이동이 불가능해진다.

한마디로 명령을 요청했을 때실제 명령을 수행하는 때, 이 짧은 시간 동안 채널의 수용인원 정보가 변화했기 때문이다.

 

그렇다면 해결 방법은 뭐가 있을까? 

1. 채널 관련 정보 경량화

서버에서 항상 채널관련 정보를 업데이트 하고 있다면 클라이언트가 요청했을 때 마다 쿼리를 연산하는 반복을 줄일 수 있고, 서버는 자신이 가지고 있는 정보를 단지 클라이언트에게 제공하기만 하면 된다.

 

2. 채널 이동시 2개 채널 점유

채널 이동 명령 수행시 클라이언트의 재접속 요청 이전에 먼저 이동하려는 채널을 점유 상태로 만들어서 접속하고 재접속 완료 후 이전 채널 접속을 종료 시키면 된다. 

 

2-1 문제점

이렇게 할 경우 채널 인스턴스가 조금 늘어나야 한다는 단점 또한 존재한다.

채널 이동을 위해 한명의 유저가 일시적이나마 2개의 채널 정보를 사용해야 하기 때문이다.

 

수익이 별로 발생하지 않고있는 현재의 메이플랜드 운영진 측에서 이 문제를 어떻게 해결할지 기대된다.

 

+++내용추가

-24.01.30

  1. 메이플랜드는 C#스크립트가 아닌 메이플 월드 플랫폼 안에서 사용되는 Lua 스크립트를 사용한다. 
  2. 채널 이동 로직에 관한 추가 고민
    • 월드 인스턴스는 채널 인스턴스에 대한 정보를 주기 0.05(1/200)초에 한번 새로고침한다.
    • 클라이언트는 새로고침 버튼을 통해 채널 인스턴스에 대한 정보를 가져올 수 있다.
    • 채널 이동을 수행하기 위해 버튼을 클릭하면 서버는 요청을 처리하기 전 사용자의 채널 이동을 위해 현재 사용중인 채널과 이동 예정인 채널, 두 인스턴스를 모두 임시 할당한다. 여기서 월드 이동을 우선 수행하는 것이 아니라 채널이동 수행 전에 서버는 이동 예정 채널이 포화 상태인지 확인하고 작업을 수행한다. -> 할당 실패시 서버가 포화상태임을 클라이언트에게 알리고 채널 정보를 새로고침 하거나 클라이언트가 새로고침 하도록 요구한다.
      -> 클라이언트가 접속종료되는 문제를 해결 할 수 있다.
    • 위의 과정은 모두 기존 메이플스토리 채널 선택과 유사한 형태를 가지고 있어 구현에 오래걸릴 것 같지 않다는 예상이 된다.