เริ่มต้นใช้งานเริ่มต้นใช้งานได้ฟรี

การ implement Exponential Backoff พร้อม Jitter

คุณกำลังเชื่อมต่อกับ API ของระบบชำระเงินของบุคคลที่สามที่มีความไม่เสถียร ซึ่งอาจเกิด transient error ได้เป็นครั้งคราว เพื่อหลีกเลี่ยงการส่งคำขอซ้ำๆ ไปยังบริการที่กำลังมีปัญหา คุณจะ implement กลยุทธ์การ retry โดยใช้ exponential backoff แบบ full jitter ซึ่งจะเพิ่มระยะเวลารอระหว่างการพยายามแต่ละครั้ง พร้อมเพิ่มความสุ่มเพื่อป้องกันไม่ให้ client หลายรายพยายาม retry พร้อมกันในทันที

มีฟังก์ชัน flaky_call(payload) ให้ใช้งาน โดยฟังก์ชันนี้จะล้มเหลวพร้อม TransientError ใน 3 การเรียกแรก แล้วจึงสำเร็จในการเรียกครั้งที่ 4 ทั้ง time, random และ TransientError ถูก import ไว้แล้ว

แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร

การพัฒนาแอปพลิเคชันบน AWS

ดูคอร์ส

คำแนะนำการฝึกหัด

  • ภายใน block try ให้เรียก flaky_call พร้อม payload แล้ว return ผลลัพธ์
  • คำนวณค่าสูงสุดแบบ exponential สำหรับการพยายามครั้งนี้โดยใช้ base และค่า attempt ปัจจุบัน
  • ใช้ full jitter โดยสุ่มเวลารอระหว่าง 0 ถึง cap ด้วย random.uniform()

แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ

ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์

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)
แก้ไขและรันโค้ด