본문 바로가기
게임 서버/게임 네트워킹의 이해

게임 네트워킹의 이해5 - MMORPG 서버 구조

by dragonDeok 2024. 9. 10.
728x90

MMORPG 게임에서 서버를 멀티스레드로 만드는 방법


싱글 프로세스 -> 멀티 스레드 구조로 구현
멀티 프로세스 -> 싱글 스레드 구조, 멀티 스레드 구조로 구현

요즘은 거의 대부분 멀티 코어이므로 코어의 성능을 다 쓰겠다 하면 멀티스레드 구조는 필수적이다.

멀티 스레드 구조는 처음 구조를 짤 때 설계가 매우 중요하다.

멀티스레드 만드는 방법


1. 무식하게 한다.

모든 working 스레드가 아무런 조건도 없이 그냥 모두 경쟁을 붙인다.
스레드들끼리 공유자원에 막 접근해서 막 lock을 건다.
lock을 많이 걸다보니 성능이 떨어지고 wait하는 시간이 길어지고 deadlock이 생길 확률이 올라간다.
lock이 많이 생기다 보니 race condition이 발생한다.
이러다 보니 타이밍 이슈가 생긴다. ( a가 먼저 들어가고 b가 들어가면 문제가 안 되는데 b가 먼저 들어가고 a가 들어가면 버그가 발생하는 등 )

2. Actor 기준으로 나눈다.

Actor : 캐릭터, npc, ...

  • actor들이 각각의 스레드를 가지고 있고 actor 간에는 서로 컨택을 하지 않는다.
  • actor간의 통신은 메시지를 통해서 이루어진다.
    • actor끼리 메일을 주고받고 각각 받은 메시지 큐에 있는 걸 읽어서 처리한다.
    • golang에서 제공하는 channel이 메시지 큐이다. 이 채널을 통해 actor끼리 메시지를 교환하며 통신한다.
  • actor(각각의 스레드)간에 통신은 메시지만 주고받는 것이므로 통신할 때 lock을 걸 필요 없다. ( 이상적으로는 )
    • 반드시 어떤 actor A가 상대방 actor B의 상태를 알고 싶은 경우가 있다. ( 상대방의 체력비례 데미지 등 )
    • A가 B의 상태를 조회해야 한다.
    • 이 경우 hp를 공유하기 때문에 락을 걸 수밖에 없다. -> lock을 걸 수 밖에 없는 경우가 생긴다!!
    • 그렇다고 락을 안 걸고 메시지로만 하자니 메시지만의 비동기 문제도 발생한다. ( 복잡도 증가, 비동기 방식 )

락을 안 걸겠다면 actor간에 채널을 통해 메시지를 주고 받는 식으로 해야 한다.

3. system 기준으로 나눈다.
  • ECS 구조
  • moving system, flying system, attack system 등등...