ROLE : 1인 백엔드 서버 개발자로 설계 및 전체 개발을 담당
SKILL : Java 17, Spring Boot 3.*, GRPC, Apache Ignite, Kafka, MySQL, AWS
------------------------------------------------------------------------------
⦿ MENORI 실시간 대전 퍼즐 게임 CBT 출시
1️⃣ 접속자 수에 유연한 Scale-Out 아키텍처 구축
→ 문제상황
• 유저의 상태를 관리하는 일반적인 온라인 대전 게임의 경우 서버별로 유저를 분산시켜 같은 서버 내에서만 대전 및 소통이 가능함, 서버 추가시 관리 부담과 부하 집중 문제가 발생할 수 있음
→ 해결과정
• Apache Ignite IMDG (인메모리 DB) 클러스터를 구축하여 분산된 서버들을 하나의 컴퓨터처럼 연결 (필요시 서버만 Scale-Out)
• 유저와 연결된 GRPC 서버와 다른 서버에서 실행되는 게임 쓰레드가 실시간 통신하는 구조를 설계
• Ignite & Spring 통합 캐시 스토어를 구축하여 모든 유저가 자원을 공유
→ 결과
• 접속자가 증가해도 서버만 늘리면 되는 구조를 완성하여, 부하 집중 문제 해결 및 유지보수 향상
• 캐싱을 활용하여 게임 데이터 조회 속도를 20ms 이내로 최적화
2️⃣ 이벤트 기반의 STATEFUL 서버 구현하여 어뷰징 방지
→ 문제상황
• 일반적인 게임 서버의 경우 클라이언트가 상태를 관리하여 어뷰징 가능성이 존재
→ 해결과정
• 이벤트 기반 STATEFUL 서버로 설계하여 클라이언트는 서버의 상태 변화만 반영하고, 서버는 유저 행동을 실시간으로 동기화
• 게임 쓰레드(시간, 공통 상태 관리)와 유저별 보드 쓰레드(개별 상태 관리)를 분리하여 멀티쓰레드 환경에서 Thread-Safety한 구조 구현
• Ignite 분산 메시징을 활용해 유저와 쓰레드 간 실시간으로 소통하고, 순차적 이벤트 처리로 동시성 문제 해결 (QPS2500 시나리오 부하 테스트로 확장성과 안정성 검증)
→ 결과
• 어뷰징 방지, 실시간 데이터 동기화, 재접속 처리, Thread-Safety를 모두 충족하는 서버 구축
3️⃣ Ignite 캐시 기반 분산락을 활용하여 동시성을 고려한 1:1 유저 매칭 시스템 구현
→ 문제상황
• 매칭 가용성 위험 및 동시성 문제로 인한 중복 매칭 오류 발생 가능성 존재
→ 해결과정
• 장애처리 대응을 위해 모든 서버에서 매칭 쓰레드가 각기 동작하며 동시성처리를 위해 티켓 개념 도입
• IgniteReentrantLock(모든 노드에서 공유)을 이용하여 매칭 티켓 조회에 대한 동기화 처리
→ 결과
• 동기화처리로 인한 매칭 시스템 안정성 향상 & 서버별 초당 100TPS 처리 확인
4️⃣ Docker를 활용해 로컬 서버 실행 환경을 구축, 비개발자도 쉽게 협업할 수 있도록 지원
• 미사용 PC를 개발 서버처럼 사용, 게임 옵션값 세부 변경 테스트 가능 → 접근성 개선 & 비용절감
더보기