unionyy / blog

https://blog.uniony.me/
1 stars 0 forks source link

lol/game-duration/ #14

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

[Match-V5 업데이트] gameDuration 변경 및 gameEndTimestamp 추가 (Riot API) - 유년시절

Match-V4 에서 Match-V5 로 넘어가면서 gameDuration(게임 길이) 값이 초단위에서 밀리초단위로 변경되었습니다. 그러나 11.20 패치 이후로 다시 초단위로 돌아가게 되었고 gameEndTimestamp 라는 필드가 새로 생겨났습니다.

https://blog.uniony.me/lol/game-duration/

kizarrd commented 2 years ago

안녕하세요. 저도 전적검색 사이트를 만들고 있는데 블로그 게시글이 많은 도움이 되었습니다 감사합니다.

monstergg.herokuapp.com 이게 제 사이트인데 사이트가 너무 느려서 몇가지 질문드리고 싶은게 있습니다. 현재는 rate limit도 있고 해서 최대 5경기 데이터만 처리하도록 제한을 걸어 두었는데요, 웹사이트를 작동시켜보면 5경기만을 처리하는 시간도 상당히 오래걸립니다.

우선 제 사이트 기능은 소환사가 플레이한 챔피언들의 아군과 상대 챔피언 별 전적을 표로 보여주는 것인데 (예를들어 소환사의 오리아나는 사일러스를 몇번이나 적으로 만났으며 얼마의 승률을 가지고 있는지를 표에 보여주는 식입니다. 따라서 소환사당 수십~수백판의 경기를 처리해야 하는 상황) 이를 구현하기 위해서 소환사의 matchId들을 가지고 플레이한 모든 경기를 한판씩 fetch하고 그때마다 필요한 데이터를 뽑아서 소환사 db instance에 저장하는 식으로 코드를 짰습니다.

그리고 저는 db는 mongodb cloud를 쓰고 deploy는 heroku통해서 했는데(둘다 무료 플랜) 개발자님은 db와 deploy를 어떻게 하셨는지, 또 이것들이 웹사이트 작동 속도에 얼마나 영향을 주는지 궁금합니다.

deploy하고나서만큼은 아니지만 deploy하기 전에 개인 컴퓨터에서 작동시켜 봤을때도 속도가 lolog.me나 다른 통계사이트처럼 빠르지가 않았던걸로 봐서는 코드 자체를 개선해야 하는게 아닌가 싶은데, 어쨌든 조언해주시면 정말 감사하겠습니다.

unionyy commented 2 years ago

@kizarrd 안녕하세요! 제 글을 잘 봐주시고 계시다니 감사합니다 ㅎㅎ

만들고 계신 사이트에 들어가봤는데요, 일단 가장 부하가 많이 걸리는 부분이 Riot API를 호출하는 부분인 것 같아요. 소환사를 처음 검색했을 때는 10초정도 걸리는데 이미 DB에 있는 소환사를 검색했을 때에는 훨씬 빠르게 검색되네요.

이부분을 개선하기 위해서는 matches API를 호출할 때와 같이 다수의 독립적인 요청을 보내야할 때에 하나씩 호출->응답->호출->응답 이런 식으로 하지 마시고 호출->호출->응답->응답 이런식으로 구현해야합니다. 호출을 한번에 다 한 뒤에 응답이 오는 대로 처리하시면 처리 속도가 훨씬 빨라질 거에요.

비슷하게 DB 서버와의 통신에서도 쿼리를 하나씩 보내고 처리하면 처리 속도가 느려집니다. DB 쿼리는 웬만하면 하나로 합쳐서 보내는게 좋을겁니다.

LoLog.me 는 AWS EC2 Linux 서버에서 구동되고 있고, DB는 AWS RDS MySQL 서버를 사용하고 있습니다. 저도 AWS 프리티어를 사용하고 있어서 1년간은 과금 없이 서버를 운영하고 있습니다.

제 서버는 서울 리전에 있어서 지연시간이 그리 크지 않습니다. 검색해보니 heroku 무료 플랜의 경우 미국 리전인 것 같은데 이경우 지연시간이 좀 더 클것 같네요.

어떤 식으로 코드를 작성하셨는지 몰라서 제가 겪었던 시행착오들로 예측해서 답변 드렸습니다. 저도 배워가는 단계라서 정확한 답변은 아닐 수 있으니 참고만 해주세요! 도움이 되셨으면 좋겠네요~

unionyy commented 2 years ago

@kizarrd 깃헙 리포지토리에 코드가 있어서 살펴봤어요. 공부하는 과정 정리가 너무 잘 돼있어서 놀랐습니다!! 저도 배워야겠어요 ㅠ

코드 보니까 제가 말씀드린 부분이 문제가 맞네요. 루프 안에 await fetch() 가 있을 경우 어떻게 동작하는 지 생각해보시면 좋을 것 같아요!

파이팅하세요!!

kizarrd commented 2 years ago

혼자 보려고 아무렇게나 쓴것들이 많아서 부끄럽네요 ㅋㅋㅋ 말씀해주신 키워드로 검색해보니 promise.all 방법을 알게 되어서 api와 db에 적용했더니 속도가 훨씬 빨라졌네요. 또 당장 서버를 옮기기에는 힘들거 같아서 일단 db를 먼저 서버 근처로 (us east)옮겼는데 그것도 효과가 좀 있는거 같습니다. 순식간에 많은걸 배운거같습니다 정말 감사드립니다. production key가 빨리 나왔으면 좋겠네요~