지속적인 데이터 분석 상황 모니터링을 위한 로깅 적용
- 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 용량을 효율적으로 관리하기 위해 다음과 같은 기준으로 데이터를 관리합니다.
- 분석된 데이터들 중 최신 패치버전의 게임데이터 수가 서비스 환경에 적합한 개수가 되면 이전 패치 버전은 삭제합니다.
Outdated한 패치버전 데이터 폐기 로직 코드스니펫
- 로우데이터의 key값인 matchId는 패치버전과 더불어, 분석 상태값(analyzed)이 2(분석 오류를 의미)인 경우 폐기합니다.
분석 상태값에 따른 데이터 폐기 로직 코드스니펫
Child-Process로 데이터 분석 자동화 개선
기존 방식의 문제점
- 기존 데이터 분석 프로세스는 toad-sceduler라는 npm 패키지를 활용하여, 특정 시간 간격을 기준으로 스케줄을 주기적으로 실행하는 방식이었습니다.
- 예컨대, 1시간에 한번씩 데이터 분석 로직을 실행시키는 것입니다.
- 분석하는 데이터의 양이 증가함에 따라, 한 스케줄이 종료되기 전에 다음 스케줄이 실행되는 문제가 발생했습니다. 한 스케줄의 실행 소요 시간이 스케줄 기준 시간을 초과해버린 것입니다.
Child-Process를 활용한 프로세스 개선
- 위 문제로 인해, 특정 시간 간격을 기준으로 실행되는 것이 아니라, 로직의 종료 여부를 기준으로 실행되는 스케줄러의 필요성을 느꼈습니다.
- 이에, Child-Process를 이용해 다음과 같이 데이터 분석 프로세스 구조를 개선했습니다.
- handler (소스 코드 바로가기)
- 부모 프로세스로, 자식 프로세스인 task를 생성하고, task로부터 메시지를 받아 실행시켜야 할 다음 로직을 task에게 메시지로 전달합니다.
- task (소스 코드 바로가기)
- 자식 프로세스로, 부모 프로세스로부터 메시지를 받아, 메시지에 해당하는 로직을 실행합니다.
- 로직은 DB 연결/ 데이터 수집 / 데이터 분석 / 데이터 이관으로 구분됩니다.