0Pricing
Go Academy · บทเรียน

การจัดการข้อผิดพลาดและตรรกะการลองใหม่

ตรวจสอบรหัสสถานะและใช้การลองใหม่

การจัดการข้อผิดพลาดและตรรกะการลองใหม่ เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

ข้อผิดพลาด HTTP ไม่ใช่ข้อผิดพลาดของ Go

สถานะ HTTP 404 หรือ 500 ไม่ใช่ข้อผิดพลาดของ Go — http.Client.Do จะส่งคืนข้อผิดพลาดเป็น nil สำหรับการตอบกลับ HTTP ที่ถูกต้องทุกกรณี โปรดตรวจสอบ resp.StatusCode อย่างชัดเจน

การห่อข้อผิดพลาด

ห่อข้อผิดพลาดพร้อมบริบทโดยใช้ fmt.Errorf("operation: %w", err) เพื่อให้ผู้เรียกตรวจสอบสาเหตุได้ด้วย errors.Is / errors.As

if err != nil {
    return fmt.Errorf("fetch users: %w", err)
}

ข้อผิดพลาดที่ลองใหม่ได้และลองใหม่ไม่ได้

ควรลองใหม่: การหมดเวลาของเครือข่าย, 429 Too Many Requests, 503 Service Unavailable ไม่ควรลองใหม่: 400 Bad Request, 401 Unauthorized, 404 Not Found — การลองใหม่จะไม่ช่วยแก้ปัญหา

การหน่วงเวลาแบบเพิ่มขึ้นทวีคูณ

รอให้นานขึ้นระหว่างการลองใหม่แต่ละครั้ง เพื่อลดภาระของเซิร์ฟเวอร์ที่กำลังมีปัญหา ตัวอย่างการทำงานอย่างง่าย:

for i := 0; i < maxRetries; i++ {
    resp, err := client.Do(req)
    if err == nil && resp.StatusCode < 500 { break }
    time.Sleep(time.Duration(math.Pow(2, float64(i))) * time.Second)
}

การสุ่มหน่วงเวลา

เพิ่มการสุ่มหน่วงเวลาเล็กน้อยในการหน่วงเวลาแบบเพิ่มขึ้นทวีคูณ เพื่อป้องกันไม่ให้ไคลเอนต์หลายตัวลองใหม่พร้อมกัน (ฝูงชนแห่กันเข้ามา)

wait := time.Duration(math.Pow(2, float64(i)))*time.Second + time.Duration(rand.Intn(1000))*time.Millisecond

ส่วนหัว Retry-After

การตอบกลับ 429 มักมีส่วนหัว Retry-After รวมอยู่ด้วย โปรดแยกวิเคราะห์และปฏิบัติตามค่านี้ แทนการใช้การหน่วงเวลาแบบตายตัว

retryAfter := resp.Header.Get("Retry-After")
if secs, err := strconv.Atoi(retryAfter); err == nil {
    time.Sleep(time.Duration(secs) * time.Second)
}

การลองใหม่ที่คำนึงถึงบริบท

ตรวจสอบบริบทก่อนพยายามลองใหม่แต่ละครั้ง เพื่อหยุดการลองใหม่หากคำขอถูกยกเลิก

for i := 0; i < maxRetries; i++ {
    if ctx.Err() != nil { return nil, ctx.Err() }
    // attempt
}

ชนิดข้อผิดพลาดแบบกำหนดเอง

กำหนดข้อผิดพลาด HTTP แบบมีชนิดเพื่อเก็บรหัสสถานะและเนื้อหาไว้ ทำให้ผู้เรียกสามารถตัดสินใจอย่างละเอียดว่าจะลองใหม่หรือไม่

type HTTPError struct {
    Status int
    Body   string
}
func (e *HTTPError) Error() string { return fmt.Sprintf("HTTP %d: %s", e.Status, e.Body) }

ตัวเลือกไลบรารี

ลองพิจารณา hashicorp/go-retryablehttp หรือ cenkalti/backoff สำหรับตรรกะการลองใหม่ในระบบจริงที่มีนโยบายการหน่วงเวลาแบบกำหนดค่าได้ จำนวนการลองใหม่สูงสุด และการรองรับบริบท

คีย์ป้องกันการทำซ้ำ

สำหรับคำขอ POST ที่ลองใหม่ ให้ใส่ส่วนหัวคีย์ป้องกันการทำซ้ำ (UUID) เพื่อให้เซิร์ฟเวอร์กำจัดคำขอซ้ำและส่งคืนผลลัพธ์เดิม โดยไม่สร้างทรัพยากรซ้ำ

ตัวตัดวงจร

ตัวตัดวงจรจะติดตามอัตราความล้มเหลวและหยุดส่งคำขอไปยังบริการที่ล้มเหลวเป็นช่วงเวลาพักฟื้น ไลบรารีอย่าง sony/gobreaker ใช้รูปแบบนี้

ตรวจสอบอย่างรวดเร็ว

เหตุใดจึงควรเพิ่มการสุ่มหน่วงเวลาในการหน่วงเวลาแบบเพิ่มขึ้นทวีคูณ

ทบทวน: การจัดการข้อผิดพลาดและการลองใหม่

ประเด็นสำคัญ:

  • ตรวจสอบ resp.StatusCode — ข้อผิดพลาด HTTP ไม่ใช่ข้อผิดพลาดของ Go
  • ลองใหม่เมื่อเกิด 429, 503 และการหมดเวลาของเครือข่าย แต่ไม่ควรลองใหม่เมื่อเกิดข้อผิดพลาดฝั่งไคลเอนต์ 4xx
  • การหน่วงเวลาแบบเพิ่มขึ้นทวีคูณร่วมกับการสุ่มหน่วงเวลาช่วยป้องกันฝูงชนแห่กันเข้ามา
  • ตรวจสอบบริบทก่อนลองใหม่เสมอ

คำถามที่พบบ่อย

บทเรียน “การจัดการข้อผิดพลาดและตรรกะการลองใหม่” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจัดการข้อผิดพลาดและตรรกะการลองใหม่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อผิดพลาดและตรรกะการลองใหม่”

ตรวจสอบรหัสสถานะและใช้การลองใหม่ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การจัดการข้อผิดพลาดและตรรกะการลองใหม่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การส่งคำขอ HTTP
  2. การตั้งเวลาหมดอายุและส่วนหัว
  3. การถอดรหัสการตอบกลับ JSON
  4. การจัดการข้อผิดพลาดและตรรกะการลองใหม่
← กลับไปที่ Go Academy