Bắt đầu ngayBắt đầu miễn phí

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

Xem khóa học

Hướng dẫn bài tập

  • Bên trong khối try, gọi flaky_call với payload và trả về kết quả của nó.
  • Tính "exponential cap" cho lần thử này dựa trên base và số lần attempt hiện tại.
  • Áp dụng full jitter bằng cách chọn thời gian chờ ngẫu nhiên giữa 0cap với random.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)
Chỉnh sửa và Chạy Mã