우리가 실제로 해결하고 있었던 문제
우리의 주요 목표는 사용자들에게 원활한 게임 경험을 제공하는 것이었지만, 실제 과제는 Treasure Hunt Engine이 대규모 플레이어 유입을 수용할 수 있도록 수평적 확장(Scale horizontally)을 보장하는 것이었습니다. 우리는 높은 부하를 처리할 수 있다고 홍보된 프레임워크인 Veltrix가 왜 따라오지 못하고 고전하고 있는지 파악해야 했습니다.
우리가 처음 시도했던 것 (그리고 실패한 이유)
처음에는 지연 시간(Latency)을 줄이고 응답 시간을 개선하기 위해 코드를 최적화했지만, 문제는 지속되었습니다. 운영자들은 Treasure Hunt Engine이 여전히 병목 현상(Bottlenecks)을 일으키고 있다는 점을 발견했으며, 이는 SQL 데이터베이스에서 데이터를 캐싱(Caching)하고 검색하는 방식과 관련이 있는 것으로 보였습니다. 우리는 더 자세히 조사하기로 결정하고 데이터베이스 쿼리를 줄이기 위해 캐싱 레이어(Caching layer)를 구현했습니다. 하지만 이는 근본적인 문제를 가릴 뿐이었으며, 문제의 근본 원인을 해결하지는 못했습니다.
아키텍처 결정
Veltrix 문서를 재검토하고 내부 논의를 거친 후, 우리는 Treasure Hunt Engine이 이벤트 기반 시스템(Event-driven system)으로 설계되었다는 것을 깨달았습니다. 이러한 방식은 소규모 애플리케이션에는 효율적이지만, 사용자 기반이 성장함에 따라 병목 현상이 되었습니다. 우리는 시스템을 재설계(Re-architecture)하기로 결정하고, 들어오는 요청을 워커 노드(Worker nodes) 클러스터가 처리하는 워커 큐(Worker queue) 기반 방식으로 전환했습니다. 이를 통해 부하를 더 고르게 분산할 수 있었고, 이벤트 기반 설계로 인해 발생하는 단일 장애점(Single point of failure)을 피할 수 있었습니다.
수치가 말해주는 결과
새로운 아키텍처를 배포한 후, 성능이 크게 향상되었고 충돌(Crashes) 및 타임아웃(Timeouts)이 급격히 감소하는 것을 확인했습니다. 우리의 지표에 따르면 평균 응답 시간이 30% 감소했고 오류율은 50% 감소했습니다. 이제 시스템은 20,000명 이상의 동시 접속자(Concurrent users)를 문제없이 처리하고 있으며, 우리의 운영자들은 안도의 한숨을 내쉴 수 있게 되었습니다.
내가 다르게 했을 것들: 돌이켜보면, 나는 처음부터 Treasure Hunt Engine의 아키텍처(Architecture)와 수평적 확장(Scale horizontally) 능력에 더 세심한 주의를 기울였을 것입니다. 캐싱(Caching)과 쿼리 최적화(Query optimization)의 중요성을 지나치게 강조함으로써, 우리는 실제 문제를 가렸고 소중한 시간과 자원을 낭비했습니다. 만약 다시 해야 한다면, 나는 시스템 아키텍처에 대한 철저한 분석을 수행하고 사용자 기반의 필연적인 성장을 고려한 솔루션을 설계했을 것입니다.