Woozy_DevLog
article thumbnail

지속적인 데이터 분석 상황 모니터링을 위한 로깅 적용

  • winston으로 데이터 분석 계층별로 로깅을 적용하여, 데이터 분석 상황을 모니터링하고, 이를 통해 유지/보수합니다.
  • 로깅은 info, error 두 단계로 구분하여 적용했습니다.

다양한 용도의 상태값 활용

  • 다양한 상태값을 통해 데이터 중복 분석, 스케줄 충돌 등 예기치 않은 상황을 방지, 안정적인 데이터 분석 스케줄링을 도모했습니다.
  • 상태값 예시는 다음과 같습니다.

게임 로우데이터의 분석 여부 상태를 나타내는 analyzed, 게임 로우데이터의 패치버전을 나타내는 version

  • analyzed는 다음과 같이 의미가 구분됩니다.
    • 0: 분석 미완
    • 1: 분석 완료
    • 2: 분석 오류(로우데이터에 원하는 값이 들어있지 않음)

데이터 수집/분석 과정에 offset 방식 페이지네이션 도입

matchId 추출을 위해 필요한 puuId 값을 offset 페이지네이션 방식으로 스케줄 당 2000개씩 DB에서 조회

  • 리그오브레전드가 제공하는 게임 로우데이터는 양이 매우 방대합니다. 방대한 양의 로우데이터를 한번에 분석, 가공하는 것은 현실적인 한계가 있습니다.
  • Carryduo는 분석 상태값인 analyzed 값을 기준으로 offset 방식의 페이지네이션을 도입하여, 효율적인 데이터 분석을 도모했습니다.
  • 아울러, 매치데이터 평균 분석량을 기준으로 데이터 분석 스케줄을 다음과 같이 설정하였습니다.
    • 로우 데이터 수집 스케줄 주기: 게임데이터 30000개 이상 수집시 종료
    • 로우 데이터 분석 스케줄 주기: 오후 1시 ~ 오후 10시

데이터분석용 DB와 서비스용 DB 분리

  • 실시간으로 업데이트되는 DB 정보가 서비스에 그대로 반영되면, 사용자 경험을 크게 저하시킬 뿐더러 유지/보수도 어렵습니다.
  • 이에, Carryduo는 서비스용 DB와 데이터분석용 DB를 별도로 구축하여 운영하고 있습니다.

주기적인 데이터 관리를 통한 데이터 최신화 및 DB 관리

  • 리그오브레전드는 약 2주 간격으로 패치버전 업데이트를 진행합니다.
  • 새로운 패치버전이 업데이트 된 이후에, 이전 패치버전의 데이터는 사용자 관점에서 무의미해집니다.
    • 예컨대, 12.22 패치버전이 업데이트 되었다면, 그 이전 버전인 12.21, 12.20 패치버전은 사용자에게 무용한 데이터가 됩니다.
  • 이에, Carryduo는 사용자에게 최신 데이터를 제공하고, DB 용량을 효율적으로 관리하기 위해 다음과 같은 기준으로 데이터를 관리합니다.
    1. 분석된 데이터들 중 최신 패치버전의 게임데이터 수가 서비스 환경에 적합한 개수가 되면 이전 패치 버전은 삭제합니다.
      Outdated한 패치버전 데이터 폐기 로직 코드스니펫
    2. 로우데이터의 key값인 matchId는 패치버전과 더불어, 분석 상태값(analyzed)이 2(분석 오류를 의미)인 경우 폐기합니다.
      분석 상태값에 따른 데이터 폐기 로직 코드스니펫

Child-Process로 데이터 분석 자동화 개선

기존 방식의 문제점

  • 기존 데이터 분석 프로세스는 toad-sceduler라는 npm 패키지를 활용하여, 특정 시간 간격을 기준으로 스케줄을 주기적으로 실행하는 방식이었습니다.
  • 예컨대, 1시간에 한번씩 데이터 분석 로직을 실행시키는 것입니다.
  • 분석하는 데이터의 양이 증가함에 따라, 한 스케줄이 종료되기 전에 다음 스케줄이 실행되는 문제가 발생했습니다. 한 스케줄의 실행 소요 시간이 스케줄 기준 시간을 초과해버린 것입니다.

Child-Process를 활용한 프로세스 개선

  • 위 문제로 인해, 특정 시간 간격을 기준으로 실행되는 것이 아니라, 로직의 종료 여부를 기준으로 실행되는 스케줄러의 필요성을 느꼈습니다.
  • 이에, Child-Process를 이용해 다음과 같이 데이터 분석 프로세스 구조를 개선했습니다.
    • handler (소스 코드 바로가기)
      • 부모 프로세스로, 자식 프로세스인 task를 생성하고, task로부터 메시지를 받아 실행시켜야 할 다음 로직을 task에게 메시지로 전달합니다.
    • task (소스 코드 바로가기)
      • 자식 프로세스로, 부모 프로세스로부터 메시지를 받아, 메시지에 해당하는 로직을 실행합니다.
      • 로직은 DB 연결/ 데이터 수집 / 데이터 분석 / 데이터 이관으로 구분됩니다.
profile

Woozy_DevLog

@Woozy_Dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!