언리얼 엔진을 활용한 멀티 플레이를 구현하기 위해 학습 하던 중, 리슨서버 및 데디케이티드 서버에 대해 학습하였습니다.
해당 과정에서 언리얼 엔진에서 제공하는 리슨서버 및 데디케이티드 서버의 특징, 차이점들을 작성하며
그 외 P2P 서버 및 클라우드 서버 등에서도 간략하게 알아보겠습니다.
멀티플레이 (MultiPlay)
- 여러 플레이어가 네트워크를 통해 같은 게임 월드에서 상호작용 할 수 있도록 구현하는 시스템
- 서버 - 클라이언트 구조로 이루어져있다.
- 언리얼 엔진 내 리플리케이션, 세션을 활용하여 동작한다.
- 서버 (Server) : 게임 상태 관리
- 여러 클라이언트와 상호작용
- 클라이언트에서 해킹당하면 안되는 데이터에 대한 처리
- 플레이어의 상태 관리
- 클라이언트 (Client) : 서버에서 관리하는 데이터를 가져와 게임을 플레이하는 방식
- 리플리케이션(Replication) : 서버의 정보를 클라이언트에 동기화하는 기능
- 세션 (Session) : 멀티플레이 게임에서 클라이언트들이 연결되는 로비 개념
- 서버 (Server) : 게임 상태 관리
리슨서버 (Listen Server)
- 한 플레이어가 직접 서버 역할을 하며 동시에 클라이언트를 수행하는 방식
- Player1 = Server + Client
- Player2,3,4... = Client
- 멀티플레이 관련 설정이 다른 서버 연결방식보다 쉽다.
- 별도의 서버 운영이 필요 없으며, 서버 운영 비용이 발생하지 않는다.
- 서버 호스트가 게임을 종료하면, 모든 플레이어가 해당 세션에서 종료된다.
- 서버 호스트 PC성능에 비례하여 네트워크 성능이 저하 될 수 있다.
- 보안에 취약하다.
- 리슨서버는 게임 데이터를 노출시키는 형식. 데이터를 쉽게 조작 할 수 있다.
- 클라이언트가 서버를 운영하는 방식이기 때문에 데이터를 조작하더라도 감지가 어렵다.
- UFUNCTION(WithValidation)을 사용한 보안 강화 가능.
- 클라우드 서버 환경에서는 토큰과 같은 보안방식을 사용하여 보안을 강화시킬 수 있다.
데디케이티드서버 (Dedicated Server)
- 게임을 플레이하지 않는 독립적인 서버 존재, 클라이언트가 해당 서버에 접속하는 방식
- 서버는 게임 상태 및 데이터를 관리, 클라이언트는 서버의 데이터를 받아온다.
- 고정된 네트워크 환경에서 실행되므로 안정성이 뛰어나다.
- 리슨서버와 다르게 호스트가 종료를 해도 게임이 중단되지 않는다.
- 독립적인 서버를 통한 게임 데이터를 캡슐화 할 수 있다.
- 별도 서버 운영 비용이 발생하며, 서버 유지 보수가 필요하다.
- 고정된 서버 개수로 인해 접속자가 급등하거나 급락할 경우 서버 운영에 문제가 발생한다.
클라우드 서버 (Cloud Server)
- 네트워크를 통해 접근할 수 있는 가상 서버
- 현재 게임 회사들이 가장 많이 사용하는 형태
- 필요할 때만 서버를 생성하는 OnDemand Server 방식을 통해 서버 운영 비용을 절감할 수 있다.
- AWS, SnowFlake, Azure 등의 클라우드 서비스를 통해 운영
- 클라이언트 접속자가 급등하더라도 Auto Scaling기능을 통한 안전한 서버 운영 가능
- 지역별 서버를 배포하므로 글로벌 서버의 경우에도 용이하다.
- 클라우드 서비스 내 보안 시스템을 사용한 보안 기능을 강화시킬 수 있다.
- AWS 모니터링, AWS AccessKey 등
- 서버에 문제가 발생시 별도의 독립된 서버를 통해 모니터링, 프로파일링을 통해 빠른 복구가 가능하다.
게임 서버 품질을 보장하는 4가지
1. 안정성 (Stability)
- 게임 서버가 얼마나 다운되지 않는가. (인듀어 테스트를 통한 검증)
- 게임 서버가 얼마나 오작동을 하지 않는가.
2. 확장성 (Scalability)
- 서버를 얼마나 많이 설치할 수 있는지
- 사용자 수가 늘어나더라도 서비스 품질이 떨어지지 않고 유지되는지
- 수직적 확장 방법 (Scale Up) : CPU,RAM 같은 서버 머신 부품 업그레이드
- 수평적 확장 방법 (Scale Out) : 서버 머신의 개수 증설
- 해당 방법은 데디케이티드 서버일 경우에 대한 방법. 클라우드 서비스에서는 Auto Scaling을 통한 자동 증설기능
3. 성능 (Performance)
- 얼마나 빠르게 처리되는지
- 게임 장르에 따른레이턴시(Latency) 고려
- 코드 및 알고리즘 최적화
- 서버 과부화 영역 분산
- Code Profiling을 통한 함수처리 시간 확인, 개선
- 네트워크 프로토콜 최적화
- 메시지 양 줄이기 (ZLib, 양자화 등)
4. 관리 편의성
- 백그라운드 프로세스에서도 프로그램이 실행되는지
- 윈도우 : 서비스 / 리눅스 : 데몬
안정성을 고려한 서버 개발 방법
- 치밀한 개발 및 단위테스트
- 모든 함수 호출의 반환값을 반드시 체크하는 루틴
- 자동화가 구현되어있는 자가 검증 (단위테스트, Unit Test)
- 80 : 20법칙 유지
- 성능의 80%는 20%의 소스 코드에서 나타난다는 파레토 법칙
- 구조가 복잡해지더라도 성능 최적화 및 유지보수하기 쉬운 단순한 구조 방식 개발
- 1인 이상의 코드리뷰
- 코드리뷰를 통한 지식 공유, 버그 발견
- 가정하지 말고 검증하기
- 봇 테스트, 더미 클라이언트 테스트, 스트레스 테스트를 통한 검증
- 입력 처리, 렌더링 과정이 생략된 프로그래밍된 행동을 반복하는 더미를 서버에 접속
- 서버 성능 프로파일링을 통해 지표 확인
- 봇 테스트, 더미 클라이언트 테스트, 스트레스 테스트를 통한 검증
- 불안정시 극복 과정
- 서버가 다운되더라도 최대한 빠르게 복구
- 서버 프로세스 중단시, 자동으로 복구되는 프로그램 설계
- AWS 내 모니터링 시스템을 통한 자동 복구 프로그램 설계 가능
- 서버가 다운되더라도 최대한 적은 서비스만 다운되게 설계
- 서버 프로세스 분리를 통한 서버 장애 발생시에도 일부 서비스는 작동할 수 있는 설계
- 서버 오작동에 대한 로깅하기
- 서버가 다운되더라도 최대한 빠르게 복구
출처 및 참고내역
'Unreal Engine > 네트워크' 카테고리의 다른 글
[UE5] - 리플리케이션 (Replication) (0) | 2025.02.04 |
---|