피드로 돌아가기
The Day the Treasure Hunt Engine Drowned in 300 ms Queries
Dev.toDev.to
Backend

PostGIS 의존성 제거 및 서비스 분리로 1.1M TPS 달성

The Day the Treasure Hunt Engine Drowned in 300 ms Queries

Lillian Dube2026년 5월 27일5advanced

Context

1.2M개 폴리곤 대상의 Random Spatial Query로 인한 PostgreSQL 부하 및 Connection Pool 고갈 발생. 단일 RDBMS 기반의 공간 쿼리 처리 방식이 12k 동시 접속자의 초당 92k 쿼리를 감당하지 못해 P99 레이턴시가 1.8s까지 치솟은 상황.

Technical Solution

  • Static Geometry와 Dynamic Treasure 서비스 분리를 통한 Read/Write 관심사 분리
  • PostgreSQL 15 기반 Static Geometry Microservice 구축으로 고정 맵 데이터의 단순 PK 조회 최적화
  • Rust 기반 geo-tile 라이브러리를 활용한 좌표의 1m 격자 타일 ID 변환으로 연산 복잡도 제거
  • Redis 7.2 기반 In-memory Hash Map 셔딩 구조를 도입하여 타일 ID 기반의 O(1) 조회 성능 확보
  • NATS 2.9.6를 활용한 비동기 이벤트 발행으로 보물 수집 시의 Cache Invalidation 병목 해결
  • ORDER BY RANDOM()의 고비용 연산을 타일 내 Deterministic Round-robin 방식으로 대체하여 캐시 효율 극대화

1. 런타임 Critical Path에서 PostGIS와 같은 무거운 공간 연산 라이브러리 배제 검토

2. 고빈도 읽기 데이터의 경우, 정적 참조 데이터와 동적 상태 데이터를 물리적으로 분리하여 저장소 최적화

3. 분산 캐시 환경에서 강한 일관성(Strong Consistency) 대신 NATS와 같은 메시지 브로커를 통한 최종 일관성(Eventual Consistency) 모델 적용 고려

원문 읽기