지터를 적용한 지수 백오프 구현하기
가끔 일시적인 오류를 반환하는 불안정한 타사 결제 API와 연동하는 상황입니다. 이미 부하가 걸린 서비스에 과도한 요청이 몰리지 않도록, 풀 지터를 적용한 지수 백오프(Exponential Backoff with Full Jitter) 재시도 전략을 구현해 보겠습니다. 이 전략은 재시도 사이의 대기 시간을 점점 늘리면서 무작위성을 더해, 여러 클라이언트가 동시에 재시도하는 현상(Thundering Herd)을 방지합니다.
flaky_call(payload) 함수가 준비되어 있습니다. 이 함수는 처음 3번 호출에서는 TransientError로 실패하고, 4번째 호출에서 성공합니다. time, random, TransientError는 이미 불러와져 있습니다.
이 연습은 강의의 일부입니다
AWS에서 애플리케이션 개발하기
연습 안내
try블록 안에서payload를 인자로flaky_call을 호출하고 그 결과를 반환하세요.base와 현재attempt횟수를 사용해 이번 시도의 지수 상한값(Cap)을 계산하세요.random.uniform()을 사용해0과cap사이의 무작위 대기 시간을 선택하여 풀 지터를 적용하세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
def retry_with_backoff(payload, max_attempts=5, base=0.2):
last_error = None
for attempt in range(max_attempts):
try:
# Try the call
return ____(payload)
except TransientError as err:
last_error = err
# Cap grows exponentially with each attempt
cap = ____ * (2 ** attempt)
# Pick a random wait between 0 and cap (full jitter)
wait = random.____(0, cap)
time.sleep(wait)
# All attempts failed; surface the last error
raise last_error
result = retry_with_backoff({"order_id": 42})
print(result)