ลองอีกครั้ง

บทนี้นำเสนอกลไกการลองอีกครั้งของคำขอ 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(...) เพื่อดำเนินการสถานการณ์การลองอีกครั้งที่ไม่แน่นอนได้อีกด้วย