Thử lại

Chương này giới thiệu cơ chế thử lại của các yêu cầu Go Resty.

Resty sử dụng backoff để tăng khoảng thời gian thử lại sau mỗi lần thử lại.

Ví dụ sử dụng:

// Tạo một client Resty
client := resty.New()

// Cấu hình số lần thử lại trên mỗi client
client.
    // Đặt một số lần thử lại khác không để kích hoạt thử lại
    SetRetryCount(3).
    // Bạn có thể tùy chỉnh thời gian chờ ban đầu cho việc thử lại.
    // Mặc định là 100 miligiây.
    SetRetryWaitTime(5 * time.Second).
    // MaxWaitTime cũng có thể được ghi đè.
    // Mặc định là 2 giây.
    SetRetryMaxWaitTime(20 * time.Second).
    // Đặt RetryAfter để tính toán hàm gọi lại cho thời gian chờ giữa các lần thử lại.
    // Giá trị mặc định (nil) có nghĩa sử dụng thời gian backoff tăng theo mũ và jitter.
    SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
        return 0, errors.New("Đã vượt quá hạn mức")
    })

Mặc định, resty sẽ thử lại các yêu cầu trả về lỗi khác không trong quá trình thực thi. Do đó, cấu hình trên sẽ khiến resty thử lại các yêu cầu trả về lỗi khác không trong quá trình thực thi, đồng thời tăng độ trễ sau mỗi lần thử, tối đa là 3 lần.

Bạn cũng có thể cung cấp điều kiện thử lại tùy chỉnh cho client:

// Tạo một client Resty
client := resty.New()

client.AddRetryCondition(
    // Loại RetryConditionFunc được sử dụng cho các hàm điều kiện thử lại
    // Đầu vào: Response khác không hoặc lỗi thực thi yêu cầu
    func(r *resty.Response, err error) bool {
        return r.StatusCode() == http.StatusTooManyRequests
    },
)

Ví dụ trên sẽ khiến resty thử lại các yêu cầu kết thúc với mã trạng thái 429 Too Many Requests. Điều quan trọng cần lưu ý rằng khi bạn chỉ định các điều kiện bằng cách sử dụng AddRetryCondition, nó sẽ ghi đè hành vi thử lại mặc định, tức là thử lại khi gặp lỗi trong quá trình yêu cầu. Nếu bạn muốn thử lại theo hành vi mặc định khi gặp lỗi trong quá trình yêu cầu, bạn cần cấu hình như sau:

// Tạo một client Resty
client := resty.New()

client.AddRetryCondition(
    func(r *resty.Response, err error) bool {
        // Bao gồm "err != nil" để mô phỏng hành vi thử lại mặc định khi gặp lỗi trong quá trình yêu cầu.
        return err != nil || r.StatusCode() == http.StatusTooManyRequests
    },
)

Có thể thêm nhiều điều kiện thử lại. Điều quan trọng cần lưu ý rằng nếu có nhiều điều kiện được chỉ định, miễn là một trong số các điều kiện được đáp ứng, thì sẽ thực hiện lần thử lại.

Bạn cũng có thể sử dụng resty.Backoff(...) để thực hiện các kịch bản thử lại tùy ý.