การจัดการข้อผิดพลาดและตรรกะการลองใหม่
ตรวจสอบรหัสสถานะและใช้การลองใหม่
การจัดการข้อผิดพลาดและตรรกะการลองใหม่ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การส่งคำขอ HTTP
- การตั้งเวลาหมดอายุและส่วนหัว
- การถอดรหัสการตอบกลับ JSON
- การจัดการข้อผิดพลาดและตรรกะการลองใหม่