unsolved.wa 개발하기 2 - api 호출 최적화

Yaminyam·2022년 5월 12일
1
post-thumbnail

시작하기

solved.ac의 api는 커뮤니티에서 돌아다니는 이야기와 개인적인 429에러 발생시점 경험으로 봤을때 약 15분에 300회정도의 호출제한이 걸려있는듯 하다
평소에 유저가 서비스를 이용하면서 그 제한을 넘는경우는 이전까지 잘 없었으나 최근 스트릭 염색 기능이 추가되며 이 기능을 이용하다가 429에러를 만나는 유저들이 가끔 발생하는것 같다

(추가)
해당 글을 작성하며 검색하다가 알게되었는데 solved.ac api 호출제한은 15분에 256회 제한이라고 한다

unsolved.ac의 v0.0.1의 api호출 횟수는 저번 포스팅에서 언급한대로 약 600회이상 정도를 호출해야한다
sleep을 이용하여 각 api호출마다 5초간의 간격을 두어 전체 50분정도의 시간이 소요된다
너무 한번 실행하는데 오랜시간이 걸려 이를 최적화 할 방법에 대해 고민해 보았다

첫번째 고민

먼저 가장 좋은 결과는 256회 제한이하로 줄여 sleep없이 끝까지 처리되도록 하는 방법으로 만드는 것이다
하지만 조직중 가장 많은 인원수를 보유하고 unsolved.wa의 가장 큰 유저로 생각되는 대학교의 인원수를 보면 특이값인 해외 대학교를 제외하면 대부분 500명이상이 가입되어 있다
유저 당 단 한 번의 호출만 하더라도 api 호출 제한을 넘기게 되어버리는 것이다

sleep없이 구현하는 부분은 지금 상황에서는 바로 힘들것이라는 결론이었다
그래서 현재 api 호출 중 필요없는 호출부터 줄이는것을 목표로 했다

  1. 특정 그룹의 유저목록 요청하기
  2. 각 유저별 푼 문제 요청하기
  3. 각 유저별 푼 문제를 모두 set에 담아 그룹이 푼 문제리스트 만들기
  4. tier별 문제 호출하기
  5. tier낮은 순으로 각 tier별 문제에서 그룹이 푼 문제리스트 제외하기

각 단계 중 95퍼센트 이상의 호출은 2번에서 일어난다
그래서 각 유저가 푼 문제를 호출 할 때 푼 문제수의 변화가 없다면 이전에 호출했던 값과 같은 값을 호출하게 되므로 이 부분의 중복 호출을 줄이도록 했다

DB를 만들어 각 유저가 푼 문제수를 저장하고 다음번에 호출 할 때 이값과 현재 푼 문제수를 비교하여 변화가 없다면 그 유저의 호출을 스킵하도록 구현하였다
스킵한 유저만이 풀었던 문제도 그룹이 푼 문제에 포함되어야 하기 때문에 그룹이 푼 전체 문제 목록도 DB로 가지고 있어야한다
유저가 푼 문제목록을 호출할때 가장먼저 하는일이 pagination된 정보를 전부 불러오기 위해 먼저 호출을 한 번하고 count를 이용하여 총 page수를 구하여 호출을 하고 있다
이 과정 중 count값을 DB의 값과 비교하여 같다면 넘어가는 방식으로 해결했다

하루에 한 번씩 이 프로그램을 실행한다고 할 때를 기준으로 약 700~800초 가량의 시간을 줄일 수 있었다

두번째 고민

두번째도 첫번째와 마찬가지로 page 정보를 불러오는 곳에서 최적화를 진행했다
count를 얻기위해 한 번 호출하고 그 이후 다시 유저가 푼 문제를 호출할 때의 1번 page는 같은 정보를 가진다
page를 계산하며 첫번째 페이지의 문제까지 저장하도록 하고 pagination을 처리할 때는 2번 page부터 진행하도록 하여 모든 유저들에서 호출 수가 1번씩 감소하여 약 1000초 가량의 시간을 줄일 수 있었다

마치며

두가지 최적화를 통해 약 50분의 실행시간이 걸리던 프로그램을 20분 정도로 줄일 수 있었다
굉장히 크게 사용경험이 발전되었다고 생각한다
절대적인 시간의 차이보다 50분이라는 마냥 기다리기에는 긴 시간과 잠깐 딴짓하면 보낼 수 있는 20분의 체감차이는 절대적인 시간차보다 훨씬 크게 느껴졌다
https://github.com/AnA-algorithm/boj-organization-solved-list

하지만 이 기능을 웹서비스로 제공하기 위해선 항상 갱신을 할 때마다 20분씩 대기를 할 순 없기에 아예 다른 방식으로 구현 할 수 있도록 계속 고민을 하고 있다

그리고 역시 문제를 공유하기 시작한지 2주가 넘어가기 시작하니 매일 올린 15개의 문제가 전부 풀리지 않기 시작했다
그래서 지금은 문제 수를 10문제로 줄여서 공유하도록 하고있다
어서 웹서비스로 개발해 다들 알고리즘을 더욱 재미있게 풀 수 있도록 노력하겠다
Unsolved.wa 웹서비스 프로젝트 셋팅을 시작했고 자동배포 및 기획, 설계 그리고 컨벤션, 회의 시간같은 팀 설정을 진행하고있다
혹시나 좋은 아이디어가 있다면 해당 레포에 이슈로 남겨주시면 정말 감사드립니다
https://github.com/UNSOLVED-WA/unsolved-back-end

1개의 댓글

comment-user-thumbnail
2023년 5월 30일

호출제한은 ip 기준인가요??

답글 달기