실패시 재시도 하는 코드 만들기

2024년 8월 6일 화요일

Today I Learned

날짜

2024년 8월 6일 화요일

내용

너무 많은 요청과 재시도

네이버는 초당 20~30회 가 넘어가는 요청이 발생할 경우, 429 code를 반환해준다.

{"code":429,"message":"Too Many Requests"} 이런 모양새인데,

관리자의 말에 따르면 1초 후 재시도하라고 한다. 그래서 코드를 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def create_naver_stat_report(
    start_date: datetime,
    end_date: datetime,
    naver_account_id: int,
    report_type: RawDataFormat,
    db: Session,
    max_retries: int = 5,
):
    try:
    
        # 파라미터 설정하는 코드
       
        while current_date >= end_date:
            formatted_date = current_date.strftime("%Y%m%d")
            for report_type in report_types:
                params = {
                    "reportTp": report_type,
                    "statDt": formatted_date,
                }

                res = requests.post(url=NAVER_URL + uri, headers=headers, json=params)
                if res.status_code == 429:  # Too Many Requests
                    if max_retries > 0:
                        time.sleep(1)
                        return create_naver_stat_report(
                            start_date=start_date,
                            end_date=end_date,
                            naver_account_id=naver_account_id,
                            report_type=report_type,
                            db=db,
                            max_retries=max_retries - 1,
                        )
                    else:
                        raise HTTPException(
                            status_code=429,
                            detail="Too Many Requests. Max retries exceeded.",
                        )
                
                if res.status_code == 200:
                    result.append(res.json())
            current_date -= timedelta(days=1)
        return result
    except Exception as e:
        logging.info(f"catch exception in create_naver_stat_report: {e}")

시도하다 status_code가 429면 1초 후 재시도 하도록. 혹시나 무한루프에 빠질까봐, max_retires를 설정해서 재귀 깊이가 5가 넘어가면 멈추도록 구현해놨다. 근데 계속 레포트 생성이 실패한다!

네이버에서 데이터를 가져오기 위해선, 각 날짜별로 보고서를 만들어야 한다. 7월 30일부터 7월 1일까지 보고서를 만들다가 7월 9일 보고서를 만드는 시점에 “429”가 뜬다면? 처음부터 다시한다.

그럴 필요가 있나? 7월 8일부터 다시 하면 된다. 오히려 다시 7월 30일부터 하면 7월 9일쯤에, 혹은 그 전에 오류가 뜰 가능성이 더 높겠다 싶었다.

재귀를 호출할 때는 시작 날짜인 start_date를 현재 탐색하는 날짜인 current_date 로 처리하도록 바꿔줬다. 일단 되는데.. 기능이 상당히 불안정하다..

회고

왜 돌아갈까??

왜 안 돌아갈까? 방금은 됐는데…

왜 또 갑자기 돌아갈까? 로깅문만 추가했잖아

왜 이젠 안될까?? 필요없는 로깅문만 지웠잖아

왜 이번엔 될까? 계정만 바꾼거잖아요