การ 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)