지터를 활용한 지수 백오프 구현
간헐적으로 일시적 오류를 반환하는 불안정한 서드파티 결제 API와 통합 작업을 진행 중입니다. 서비스가 이미 과부하 상태일 때 요청이 폭주하는 것을 방지하기 위해, 완전 지터(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)