Post

(TIL) 2025-03-13 FINAL(28)

(TIL) 2025-03-13 FINAL(28)

최종 프로젝트 및 스파르타 코스 마지막 D-1


오늘은 프로젝트 마지막날이다. 내일 마지막 발표를 위해서 최종 점검 및 정리 작업을 하였다. 오늘은 여태 작업하면서 올리지 못했던 트러블 슈팅 몇개를 올릴려고 한다.

Gateway의 HealthCheck 설계 오류

  1. 전개

기존 Gateway가 1개의 서버로 돌아갔을땐 문제가 없었으나, Gateway가 다중화 되면서 일부 서버와의 연결이 끊기는 문제가 생기기 시작했다.

001

  1. 원인/분석

Gateway 2 서버에서 HealthCheck 의 Stack이 서버가 온전함에도 올라가는걸 확인할 수 있었다.

  • 현재 HeathCheck 로직
    1. Gateway에 서버가 연결되면 5초마다 서버마다 HealthCheck 함수를 실행한다
    2. HealthCheck 함수는 Redis에 저장된 서버의 Hash Table에 접근하여> ’check’ 라는 필드를 읽는다
    3. 만약 ‘check’라는 필드가 ‘testing’ 이면 스택을 쌓고 아니면 스택을 초기화 한다
    4. 스택이 3이상이 되면 서버와의 연결을 끊는다
    5. HealthCheck 요청을 위해 Redis에 저장된 서버의 Hash Table의 ‘check’ 필드에 ‘testing’을 저장하고 Pub/Sub을 이용해 서버에게 알려준다
    6. 연결된 서버는 Pub/Sub을 통해 이를 알게되고, 자신의 ‘check’ 필드를 ‘update’로 변경해준다
  1. 해결

기존의 서버 중심(Health Check 대상) 의 기록에서 Gateway 중심(Health Check의 주체)의 기록으로 자료 구조를 변경한다

001

이렇게 서버와의 연결이 갑자기 끊기게 되는 오류를 해결할 수 있었다.

패킷 전송 주기 조절

  1. 전개

분산서버 구조로 변경하고 나서 테스트를 진행하였을 때 그 전에는 보통 혼자서 테스트를 하거나 많아도 2~3명이서 하다보니 다 인원이었을 때 문제점을 확인 할 수 없었다. 처음으로 6명 이상이서 플레이 했을 때 갑자기 서버의 패킷이 밀리는 현상을 발견할 수 있었다.

  1. 원인/분석

정확한 원인을 찾기 위해 패킷이 밀리는 시점을 찾고자 한명만 움직이고 나머지는 멈춰있다거나, 공격만 시도하는 이러한 실험들을 통해 한가지 사실을 알 수 있었다. 플레이어가 움직이기 시작하면 서버에서 패킷을 0.2초당 4개씩 보내는.. 악독하게 그지없는 전송주기를 가지고 있었던 것이다!

  1. 해결

일단 이 부분은 기존 위치를 서버에서 받아서 다른 플레이어에게 바로 전달해주는 방식이 아닌, 일정 주기에 플레이어의 위치들을 모아둬 1번만에 전달해주도록 변경하였다. 추가로 몬스터 위치 동기화도 위와 비슷한 문제가 있었기에 몬스터 위치도 일정 주기마다 동기화 하는 방식으로 변경하여 문제를 해결할 수 있었다.

This post is licensed under CC BY 4.0 by the author.