1 minute read

MMORPG 서버 구조 1/3

  • MMORPG의 특징 : 동접자가 많다 -> 작업량이 많다
  • 움직이는 모든 것들은 actor라고 볼 수 있음. player, NPC, 몬스터. ControlZone 등

서버의 역할

  1. 패킷처리 (Read/Write)
  2. Tick 처리 - 매 Tick마다 actor 업데이트 하는 작업(플레이어가 이동하면 이동한 좌표에 대한 업데이트)이 필요함
    • 패킷처리와 tick이 서버 역할의 80퍼센트를 차지함
    • actor가 늘어날 수록 패킷과 tick 처리가 늘어남
    • MMORPG 서버에서는 멀티스레드가 필수 조건. 할 일이 너무 많기 때문에 하나의 코어가 일을 다 처리하기에는 시간이 짧다.
  3. 그외 system - 경매장에서 물건을 사고파는 처리

싱글스레드

  • Network I/O(멀티스레드로 구성할 수 있음)와 Work Thread(싱글스레드로 구성)로 구성

  • Network I/O에서 패킷을 받아오면 work thread에서 읽는 작업을 하는데 중간에 버퍼 역할을 하는 데이터를 받아두는 큐가 존재

  • 큐가 계속 쌓이면 스레드가 Tick마다 돌면서 Queue를 비운다. 한 tick이 100ms라면 100ms안에 queue를 비우며 패킷 처리해야함. 그러면 서버가 한 프레임에 해야할 일이 끝남. 100ms가 끝나면서 다음 tick 작업 진행

  • 과거의 MMORPG에서 많이 사용하였음

    싱글스레드 + 데이케이트(알파)

    • 데이게이트(dedicate) : 정해진, 지정된 일을 하는 스레드
      • DB I/O
      • 경매장 스레드
      • 공성전 스레드

멀티스레드

  • 멀티스레드 환경에서 프로그래밍 하는 것은 쉽지 않은 일. 잘 짜여진 구조가 있어야함. 구조없이 마구잡이로 프로그래밍하다보면 오히려 싱글스레드보다 효율이 떨어지는 상황이 생긴다.
  • Network I/O(멀티스레드로 구성할 수 있음)와 Work Thread(멀티스레드로 구성)로 구성, 중간에 버퍼 역할을 하는 데이터를 받아두는 큐가 존재
  • 여러 개의 work thread가 큐에 달려들어서 처리.. 먼저 뽑아가는 놈이 임자. 뽑아간 task에는 lock이 일어남
    • 게임은 근본적으로 actor간의 interaction. 그런데 a라는 actor가 A스레드에서 처리되고, b라는 actor는 B스레드라고 처리될 떄, a가 b를 공격했을 경우에 이 작업을 두 스레드에서 처리되기 때문에 데드락이 발생하는 상황이 매우 빈번하게 일어난다. 그래서 단순하게 멀티스레드를 구현했을 경우 문제가 해결되지 않는다. -> 구획화가 중요

정리

  • 싱글스레드가 단순하고 편리, 나쁜 것이 아니다 좋긴 함 : 하지만 감당할 수 있는 actor 수가 줄어든다.
  • 멀티프로세스는 멀티스레드와 동일한 효과를 내지만 locking할 일이 없어서 충돌할 일도 없음. 프로세스마다 독립적인 메모리를 사용함.
    • 하지만 멀티프로세스에서는 프로세스 간에 통신이 어려움.
  • 멀티 스레드는 같은 메모리 영역을 공유하기 때문에 서로 망쳐버릴 수 있음.

출처