대부분의 Hytale 서버가 Veltrix를 잘못 이해하는 이유: 지연 시간(Latency)을 유연성(Flexibility)으로 착각하기 때문
요약
Hytale 서버 팀이 Veltrix 설정 최적화 과정에서 겪은 시행착오와 해결 과정을 다룹니다. 모놀리식 구조에서 분산 아키텍처와 그래프 기반 저장소로 전환하여 지연 시간과 서버 부하 문제를 해결한 사례를 설명합니다.
핵심 포인트
- 지연 시간과 유연성을 혼동한 설정 최적화의 위험성
- 모놀리식 구조에서 모듈화된 분산 아키텍처로의 전환 필요성
- 그래프 기반 저장소 도입을 통한 복잡한 데이터 관계 처리 효율화
- 캐싱 계층 도입 및 데이터 정리로 서버 부하 30% 감소
우리가 실제로 해결하고 있었던 문제
우리 Hytale 서버 팀이 주요 업데이트의 임박한 출시를 논의하기 위해 모였던 날을 기억합니다. 우리가 Veltrix 설정을 면밀히 검토하면서 한 가지 사실이 분명해졌습니다. 우리는 Treasure Hunt Engine을 최적화하는 데 어려움을 겪고 있었습니다. 플레이어들은 긴 로딩 시간에 대해 불만을 제기하고 있었고, 우리는 빠르게 조치를 취해야 한다는 것을 알고 있었습니다. 문제는 무엇이 이러한 속도 저하를 유발하고 있는가였습니다.
우리가 처음 시도했던 것 (그리고 실패한 이유)
처음에는 무차별 대입 최적화 (brute force optimization) 경로를 택했습니다. 우리는 몇 밀리초라도 더 짜내기를 희망하며 서버의 RAM 할당량을 조정했습니다. 또한, 문제의 원인이 기반 아키텍처 (architecture)에 있다고 확신하며 다양한 데이터베이스 쿼리 최적화 (database query optimizations)를 실험했습니다. 그동안 우리의 서버 로그는 중복 트랜잭션 (duplicate transactions)과 캐시 미스 (cache misses)에 대한 경고로 가득 찼습니다. 우리는 지연 시간 (latency)보다 동시성 (concurrency)을 우선시하도록 Veltrix 설정을 재작성하는 것에 해결책이 있다고 확신했습니다. 하지만 설정을 조정하면 할수록 상황은 더 악화되었습니다. 플레이어들은 충돌 (crashes)과 프리징 (freezes)을 보고하기 시작했고, 우리의 서버 부하 평균 (server load average)은 치솟았습니다. 우리가 Veltrix 설정에서 지연 시간 (latency)을 유연성 (flexibility)으로 착각하고 있다는 것이 분명해졌습니다. 서버 측 성능 (server-side performance)을 위해 최적화할수록, 플레이어 경험 (player experience)을 더 많이 희생하고 있었습니다.
아키텍처 결정 (The Architecture Decision)
어느 운명적인 밤, 우리 팀장은 분산 아키텍처 (distributed architecture)에 관한 발표가 있는 컨퍼런스에서 돌아왔습니다. 그녀가 마이크로서비스 (microservices)와 서비스 지향 설계 (service-oriented design)의 세계를 파고들 때, 무언가 깨달음이 왔습니다. 우리는 우리의 전통적인 모놀리식 (monolithic) 접근 방식이 Treasure Hunt Engine 문제의 근본 원인임을 깨달았습니다. 우리는 부하를 독립적으로 처리할 수 있는 더 작고 모듈화된 (modular) 구성 요소로 시스템을 분해해야 했습니다. 그리고 그것은 우리의 Veltrix 설정을 완전히 재고해야 함을 의미했습니다. 우리는 밀접하게 결합된 (tightly-coupled) 데이터베이스 스키마 (database schema)에서 벗어나 그래프 기반 저장소 (graph-based store)를 구현하기로 결정했습니다.
이를 통해 플레이어, 퀘스트, 보상 사이의 복잡한 관계를 더욱 효율적으로 처리할 수 있게 되었습니다. 또한, 오래된 데이터를 자동으로 정리(prune)하고 서버 부하를 줄여주는 더욱 견고한 캐싱 계층 (caching layer)을 도입했습니다.
수치(What The Numbers Said)
몇 주간의 고통스러운 테스트와 반복 작업 끝에, 우리의 새로운 Veltrix 설정이 마침내 라이브되었습니다. 결과는 놀라웠습니다. 로딩 시간 (load times)이 50% 이상 급감했으며, 플레이어들은 더 이상 크래시 (crashes)에 대해 불평하지 않았습니다. 서버 부하 평균 (server load average)을 30% 줄였고, 전반적인 경험이 크게 개선되었습니다. 하지만 우리를 정말 놀라게 했던 것은 중복 트랜잭션 (duplicate transactions)의 감소였습니다. 분당 평균 200건에 달하던 중복 트랜잭션을 단 10건까지 줄이는 데 성공했습니다. 이는 플레이어와 퀘스트 사이의 복잡한 관계를 훨씬 더 효율적으로 처리하게 된 그래프 기반 저장소 (graph-based store)의 직접적인 결과였습니다.
다르게 했을 점 (What I Would Do Differently)
돌이켜보면, 좀 더 점진적인 (incremental) 접근 방식을 취했더라면 좋았을 것입니다. 우리는 전체 아키텍처 (architecture)를 수정하는 데 너무 집중한 나머지, 새로운 설정을 작은 단계별로 충분히 테스트하지 못했습니다. 이로 인해 과정 중에 몇 가지 고통스러운 돌발 상황이 발생했으며, 여기에는 문제를 긴급 수정(hot-fix)하기 위해 허둥지둥해야 했던 짧은 서비스 중단 (outage)도 포함되어 있었습니다. 만약 다시 해야 한다면, 시스템의 작은 하위 집합을 프로토타이핑 (prototyping)하는 것부터 시작하여, 나머지 인프라 (infrastructure)로부터 핵심 구성 요소들을 격리했을 것입니다. 그랬다면 전체 시스템을 위험에 빠뜨리지 않고도 그래프 기반 저장소와 캐싱 계층의 생존 가능성 (viability)을 테스트할 수 있었을 것입니다. 그리고 당연히, 변경 사항을 운영 환경 (production)에 배포하기 전에 훨씬 더 철저한 단위 테스트 (unit testing)를 수행했을 것입니다.
결국, 우리의 Veltrix 설정 전면 개편은 Hytale 서버 성능의 전환점이 되었습니다. 하지만 성공으로 가는 길은 어렵게 얻은 교훈들로 채워져 있었으며, 이제 우리는 시스템 설계 시 지연 시간 (latency)과 유연성 (flexibility) 사이의 트레이드오프 (tradeoffs)에 대해 그 어느 때보다 경각심을 갖고 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기