ลองอีกครั้ง
บทนี้นำเสนอกลไกการลองอีกครั้งของคำขอ Go Resty
Resty ใช้ backoff เพื่อเพิ่มช่วงเวลาลองอีกครั้งหลังจากทุกครั้งที่ลอง
ตัวอย่างการใช้งาน:
// สร้างไคลเอ็นต์ Resty
client := resty.New()
// การกำหนดจำนวนการลองอีกครั้งอยู่ที่ลูกค้าแต่ละรายการ
client.
// กำหนดจำนวนการลองอีกครั้งที่ไม่เท่ากับศูนย์เพื่อเปิดใช้งานการลองอีกครั้ง
SetRetryCount(3).
// คุณสามารถกำหนดเวลารอการลองอีกครั้งเริ่มต้นเองได้
// ค่าเริ่มต้นคือ 100 มิลลิวินาที
SetRetryWaitTime(5 * time.Second).
// สามารถเข้ารหัส MaxWaitTime ได้เช่นกัน
// ค่าเริ่มต้นคือ 2 วินาที
SetRetryMaxWaitTime(20 * time.Second).
// กำหนด RetryAfter เพื่อคำนวณฟังก์ชัน callback สำหรับเวลารอระหว่างการลองอีกครั้ง
// ค่าเริ่มต้น (nil) หมายถึงใช้เวลารอย้อนหลังที่เพิ่มขึ้นแบบกำกวม
SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
return 0, errors.New("Quota exceeded")
})
โดยค่าเริ่มต้น Resty จะลองอีกครั้งในการขอข้อมูลที่มีข้อผิดพลาดที่ไม่เท่ากับศูนย์ในระหว่างการดำเนินการ ดังนั้นการตั้งค่าดังกล่าวจะทำให้ Resty ลองขอข้อมูลที่มีข้อผิดพลาดที่ไม่เท่ากับศูนย์ในระหว่างการดำเนินการ โดยเพิ่มค่าหน่วงหลังทุกครั้ง โดยสูงสุดไม่เกิน 3 ครั้ง
คุณยังสามารถกำหนดเงื่อนไขการลองอีกครั้งที่ปรับได้สำหรับลูกค้า:
// สร้างไคลเอ็นต์ Resty
client := resty.New()
client.AddRetryCondition(
// ประเภท RetryConditionFunc ใช้สำหรับฟังก์ชันเงื่อนไขการลองอีกครั้ง
// นำเข้า: ตอบสนองที่ไม่เท่ากับศูนย์ หรือ ข้อผิดพลาดในการดำเนินการขอข้อมูล
func(r *resty.Response, err error) bool {
return r.StatusCode() == http.StatusTooManyRequests
},
)
ตัวอย่างด้านบนจะทำให้ Resty ลองขอข้อมูลที่มีโค้ดสถานะ 429 Too Many Requests
สำคัญที่จะทำความรู้จักเมื่อคุณกำหนดเงื่อนไขโดยใช้ AddRetryCondition
จะแทนที่พฤติกรรมการลองอีกครั้งเริ่มต้น ซึ่งคือการลองใหม่เมื่อเผชิญเจอข้อผิดพลาดในระหว่างกระบวนการขอข้อมูล ถ้าคุณต้องการลองอีกครั้งเมื่อเผชิญเจอข้อผิดพลาดในระหว่างกระบวนการขอข้อมูลเป็นพฤติกรรมเริ่มต้น คุณต้องกำหนดดังนี้:
// สร้างไคลเอ็นต์ Resty
client := resty.New()
client.AddRetryCondition(
func(r *resty.Response, err error) bool {
// รวมถึง "err != nil" เพื่อจำลองพฤติกรรมการลองเริ่มต้นเมื่อเผชิญเจอข้อผิดพลาดในระหว่างกระบวนการขอข้อมูล
return err != nil || r.StatusCode() == http.StatusTooManyRequests
},
)
สามารถเพิ่มเงื่อนไขการลองอีกครั้งได้หลายอย่าง สำคัญที่จะทำความรู้เมื่อกำหนดเงื่อนไขหลายอย่างว่าเมื่อมีการตรวจสอบใด ๆ ที่ถูกกำหนดไว้ โดยสักตัวไม่ว่าจะตรวจพบเงื่อนไขใด ๆ ก็จะมีการลองใหม่
คุณยังสามารถใช้ resty.Backoff(...)
เพื่อดำเนินการสถานการณ์การลองอีกครั้งที่ไม่แน่นอนได้อีกด้วย