나만의 작은 도서관

[TIL][C++] 250628 MMO 서버 개발 46일차: 안 해봤지만 유추해 보는 로스트아크 서버 아키텍처: 채널 운영 및 서버 통합 컨텐츠(레이드) 본문

Today I Learn

[TIL][C++] 250628 MMO 서버 개발 46일차: 안 해봤지만 유추해 보는 로스트아크 서버 아키텍처: 채널 운영 및 서버 통합 컨텐츠(레이드)

pledge24 2025. 6. 28. 20:54
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 

안 해봤지만 유추해 보는 로스트아크 서버 아키텍처

  • 현재 게임 시장에서 MMORPG는 메타에서 많이 벗어난 장르이다. 캐릭터의 성장을 위해선 시간을 많이 태워야하고, 돈도 많이 들기 때문에 간단하게 찍먹하기 좋은 모바일 수집형 게임들에 비해 접근성이 낮기 때문이다.
  • 그럼에도 불구하고, 우리나라에는 로스트아크와 메이플스토리처럼 MMORPG 장르라고 부를 수 있는 게임들이 남아있다. 오늘은 이 중 로스트아크의 서버 아키텍처 일부를 유추해보고자 한다.

 

로스트아크의 특이한 점: 엄청 많은 채널의 개수

출처: https://talk.op.gg/s/lol/free/5954993/%EC%99%80----%EB%B9%9B%EA%B0%95%EC%84%A0-%EC%99%9C-%EC%82%AC%EB%9E%8C%EB%93%A4%EC%9D%B4-%EB%B9%9B%EC%9D%B4%EB%9D%BC%EA%B3%A0-%ED%95%98%EB%8A%94%EC%A7%80-%EC%95%84%EC%A7%81%EB%8F%84-%EB%AA%B0?prev_page_code=all&prev_site_code=lol

 

  • 로스트아크는 다른 MMORPG 게임들에 비해 유독 채널의 개수가 많다. 최근에 하는 게임인 라테일만 봐도 월드 서버당(하나밖에 안 남긴 했지만) 채널이 20개로 고정되어 있다. 그런데 로스트아크는 위 사진처럼 채널이 200개가 넘어가는 경우도 발생할 수 있다. 어떠한 이유 때문에 이런 차이점이 발생하는 걸까?

 

알아보기 전에: 게임 서버에서 채널을 왜 존재하는가?

  • MMORPG에서 채널을 여러 개 두는 주된 이유는 월드 서버를 운영할 때 발생하는 부하를 분산시키기 위함이다. 월드에 동접자가 많아질수록 발생하는 트래픽도 자연스레 증가하는데, 어느 순간이 되면 하나의 컴퓨터가 모든 유저의 트래픽 처리를 못하게 된다. 게임은 이러한 한계점을 극복하고 더 많은 동접자를 수용하기 위해 서버를 수평 확장(scale-out)하여 트래픽을 분산시키는 것이다. 이렇게 트래픽을 분산하면 증설한 서버의 대수만큼 더 많은 유저의 트래픽을 처리할 수 있게 된다. 게임 서버에서 이를 “채널”이라고 부른다.
    • 예를 들어, 3000명의 유저를 수용할 수 있는 서버 프로그램 및 컴퓨터가 10대 있다면, 3,000명만 받을 수 있는 서비스가 30,000명을 받을 수 있게된다.
    • +) 웹 서버 같은 경우 이러한 “채널”의 개념이 유저로부터 은닉되는데, 이는 유저가 서버를 능동적으로 선택하는 것이 아닌, 로드 밸런서에 의해 자동으로 편성되기 때문이다. 반면, 게임 서버는 채널이 다른 유저들끼리는 만날 수 없기 때문에, 이를 해결하기 위해 균등한 트래픽 분산을 포기하고 채널을 직접 선택할 수 있도록 하는 것이다.
  • 채널을 만드는 또 다른 이유로는 필드 사냥이 존재했을 때 사냥터를 분리하기 위함도 있다. 다른 유저가 난입해서 사냥을 방해할 수 있는 필드가 존재한다면 사냥터 싸움은 당연히 나게 된다. 이러한 문제를 해결하기 위해 채널을 잔뜩 만들어 인기 있는 사냥터에서 불화가 생기는 것을 막는 것이다.

 

로스트아크는 각 필드 프로세스를 독립적으로 운영한다.

  • 본론으로 돌아와서, 그렇다면 왜 로스트아크는 이렇게 많은 채널을 운영하는 것일까? 그리고 이게 어떻게 가능한 것일까?
  • 답은 바로 독립적인 필드 운영에 있다. 트래픽을 분산시키는 방식은 채널 방식만 있는 게 아니다. 바로 필드(또는 존이라고 부름) 단위로 서버를 분리할 수 있는데, 만약 필드 단위로 프로그램을 쪼갰다면 서로 다른 필드 간 운영을 완벽히 분리할 수 있다. 그림으로 보면 아래와 같다.
// 각 필드는 코드상 완전히 분리되어 있다.
// 공통된 코드는 외부 라이브러리에 빼둔 다음 연결해 쓴다.
필드 서버 프로그램 1 : [마을]
필드 서버 프로그램 2 : [늪지] 
필드 서버 프로그램 3 : [평원]
  • 필드 단위로 쪼개서 운영하는 경우, 전체적인 틀로 보면 멀티 프로세스 환경에서 하나의 월드를 운영하는 방식이다. 여기서 채널로 한 번 더 쪼개 한 필드에 대한 여러 인스턴스를 운영하게 되면, 한 필드의 최대 수용 인원의 제한도 부수어버릴 수 있다.
// 한 필드에서 채널을 도입한 경우 예시
필드 서버 프로그램 1 : [마을]
[마을] 인스턴스 1
[마을] 인스턴스 2
[마을] 인스턴스 3
...
[마을] 인스턴스 N-1
[마을] 인스턴스 N
// N의 제한은 없다. -> 이론상 전세계 인구를 다 받을 수 있다.
  • 로스트아크는 이렇게 분리된 필드 운영을 활용해, “필드에 사람이 많아지면 채널을 증설하고, 사람이 없으면 채널을 삭제한다”.

 

예시 그림 분석 및 결론

출처: https://talk.op.gg/s/lol/free/5954993/%EC%99%80----%EB%B9%9B%EA%B0%95%EC%84%A0-%EC%99%9C-%EC%82%AC%EB%9E%8C%EB%93%A4%EC%9D%B4-%EB%B9%9B%EC%9D%B4%EB%9D%BC%EA%B3%A0-%ED%95%98%EB%8A%94%EC%A7%80-%EC%95%84%EC%A7%81%EB%8F%84-%EB%AA%B0?prev_page_code=all&prev_site_code=lol

  • 위 사진애서 200개의 채널이 넘어가는 것은 해당 필드에 사람이 엄청 몰렸다는 것을 의미한다. 하지만 이것이 “다른 필드의 채널도 똑같이 204개”라는 것을 의미하진 않는다. 각 필드 서버 프로그램은 완벽히 분리되어 있기 때문에 서로 다른 채널 개수를 운영할 수 있다.

 

채널 + 필드 단위로 서버를 쪼개는 운영에서 얻을 수 있는 이점

  1. 서버 비용 절감: 사람이 없는 비활성화된 필드가 많아지면 최소 개수만 남기고 필드를 전부 지울 수 있다. 이를 통해 서버 비용을 아낄 수 있다.
  2. 유저 몰림 현상 대응 가능: 사람이 몰리면 채널을 늘리면 되기 때문에 한 필드에 10,000명이 접속해도 20,000명이 접속해도 대응할 수 있다.

 

의문점: 한 필드 채널에서 수용 가능한 인원이 적다

  • 로스트아크에서 한 채널의 최대수용인원은 50명 정도로 유추되는데, MMORPG에서 한 필드에서 만날 수 있는 유저가 50명 밖에 안된다는 점은 조금 의아했다. 채널 + 필드 단위로 서버를 쪼갰다면 못해도 1,000명까지도 받을 수 있을 텐데 왜 50명 정도로 제한해 놓았는지는 잘 모르겠다.
  • 유추를 좀 해보자면 기획적인 측면과 좀 연관이 있지 않을까 싶다. 위에서 말한 사냥터 문제도 있을 테고, 너무 바글바글해도 보기 싫은(?) 사람도 있을 테니 말이다.
  • 게다가 어찌 보면 서버 비용적인 측면도 있을 것이다. 유저의 이동 동기화는 제곱의 비용이 들기 때문에 유저수가 많아질수록 비용이 기하급수적으로 늘어난다. 그래서 같은 물리적 서버에서 여러 프로세스를 돌리는 방식을 채택하지 않았나 싶다.
    • 예를 들어, 1,000명이 같은 필드에 있다고 한다면, 1,000 * 1,000 = 1,000,000번 send 해야 한다. 하지만 10개의 채널로 쪼개면, 100 * 100 * 10 = 100,000번 send 하면 된다. 즉, 같은 1,000명을 수용했지만 연산 횟수가 10배나 줄어든 것이다. 같은 컴퓨터로 1,000명이 아닌 10,000명을 받아도 된다는 것이다!
    • 물론, 같은 컴퓨터니까 콘텍스트 스위칭 비용도 고려해야 할 것이다. 그래서 무지막지하게 쪼갤 수는 없고 적정선에서 최대한 쪼갠 게 아닐까? 싶다.

 

또 다른 의문점: 필드 간 이동에서 채널 이동은 어떻게 할까? (파티를 맺은 상태라면?)

  • “각 필드마다 채널의 개수가 다르다”라는 것은, 다른 필드로 이동했을 때 그 필드에는 같은 채널이 없을 수도 있다는 것이다. 그렇다는 것은 유저는 필드를 이동할 때마다 채널이 바뀐다는 걸까?
  • 혼자서 플레이하는 유저라면 채널은 별 의미를 두지 않을 수 있다. 문제는 파티를 맺은 상태로 이동하는 경우, 채널의 상태에 따라 전부 찢어져서 이동을 하면 대참사가 벌어질 것이다.
  • 유추: 우선권이 있는 듯하다. 아마도 아래와 같지 않을까 싶다.
    1. 같은 채널 번호로 이동한다.
    2. 최대 수용 인원을 초과한다면, 파티 인원을 전부 수용할 수 있는 채널로 이동시킨다.

 

로스트아크의 특이한 점 2: 월드 서버 통합 콘텐츠

  • 일반적으로 게임 서버에서 서로 다른 월드의 유저끼리는 만나지 못한다. 이렇듯 월드끼리는 보이지 않는 장벽이 존재하는데, 나무위키를 보니 로스트아크는 이러한 장벽이 일부 허물어진, 즉, 서버 통합 콘텐츠가 있다고 한다. 목록은 다음과 같다.
    • 던전, 레이드
    • 파티모집
    • 친구
    • 거래소/경매장
    • 로아톡
    • 원정대 영지
  • 던전, 레이드 같은 경우 실제로 다른 서버 유저랑 만날 수 있다. 이는 굉장히 흥미로운데, 아마도 이런 게 가능한 건 인스턴스 던전 계열이기 때문이 아닐까 싶다.

 

인스턴스 던전이면 다른 서버 유저와 만날 수 있는 이유?

  • 인스턴스 던전의 경우, 기존 월드와 완전히 독립적으로 운영된다. 다른 장르의 게임, FPS, 레이싱, 카드 게임처럼 “한 판”의 개념을 가져가게 된다는 것이다. 그렇다는 것은? 바로 데디케이티드 서버를 돌릴 수 있다는 것이다. 각 서버의 유저의 정보만 데디케이티드 서버가 받는다면, 기존 월드의 영향 없이 게임을 진행할 수 있을 것이다. 아마 이런 부분 때문에 다른 서버 유저와도 던전이나 레이드를 진행할 수 있는 게 아닐까 싶다.

 

커뮤니티 기능: 친구, 로아톡

  • 채팅 기능(로아톡)은 아마도 레디스 클라우드 같은 걸 써서 MQ(Message Queue)로 활용하는 것이 아닐까 싶다. 월드 서버 단위가 아닌, 서비스 단위에 올라가는 MQ 하나가 있고 이를 관리하는 메시지 서버가 있지 않을까… 싶다
  • 친구 기능도 비슷할 것이다. 로스트아크에서 친구 기능이 어디까지 허용하는지는 모르겠지만, 채널이나 필드 정보 등을 표시한다면, 이것 또한 레디스를 활용하지 않을까 싶다.

 

그 외: 거래소, 원정대 영지

  • 거래소나 원정대 영지도 위 두 가지 부류 중 하나인 것 같다. 거래소는 아이템이 등록되는 순간 월드와 독립적으로 운영될 수 있을 것처럼 보이고, 원정대 영지도 인스턴스 던전과 같이 운영될 수 있을 것 같다.