Triển khai exponential backoff với jitter
Bạn đang tích hợp với một API thanh toán bên thứ ba không ổn định, đôi khi trả về lỗi tạm thời. Để tránh "dồn dập" gọi dịch vụ khi nó đang gặp khó, bạn sẽ triển khai chiến lược thử lại sử dụng exponential backoff với full jitter, vừa tăng thời gian chờ giữa các lần thử, vừa thêm yếu tố ngẫu nhiên để một "đàn" client không cùng thử lại ở đúng một thời điểm.
Đã có sẵn hàm flaky_call(payload): hàm này thất bại với TransientError trong 3 lần gọi đầu tiên, rồi thành công ở lần thứ 4. time, random, và TransientError đã được nạp sẵn.
Bài tập này là một phần của khóa học
Phát triển ứng dụng trên AWS
Hướng dẫn bài tập
- Bên trong khối
try, gọiflaky_callvớipayloadvà trả về kết quả của nó. - Tính "exponential cap" cho lần thử này dựa trên
basevà số lầnattempthiện tại. - Áp dụng full jitter bằng cách chọn thời gian chờ ngẫu nhiên giữa
0vàcapvớirandom.uniform().
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
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)