سعی مجدد

در این فصل، مکانیزم سعی مجدد در درخواست‌های Go Resty معرفی شده است.

Resty از backoff برای افزایش فاصله سعی مجدد بعد از هر بار سعی استفاده می‌کند.

مثال استفاده:

// ایجاد یک کلاینت Resty
client := resty.New()

// پیکربندی تعداد سعی مجدد برای هر کلاینت
client.
    // تنظیم تعداد سعی‌های غیر صفر برای فعال‌سازی سعی مجدد
    SetRetryCount(3).
    // شما می‌توانید زمان انتظار اولیه سعی مجدد را سفارشی کنید.
    // مقدار پیش‌فرض 100 میلی‌ثانیه است.
    SetRetryWaitTime(5 * time.Second).
    // MaxWaitTime همچنین می‌تواند بازنویسی شود.
    // مقدار پیش‌فرض 2 ثانیه است.
    SetRetryMaxWaitTime(20 * time.Second).
    // تنظیم RetryAfter برای محاسبه تابع بازگشتی برای زمان انتظار بین سعی‌ها.
    // مقدار پیش‌فرض (nil) به معنای استفاده از زمان backoff به صورت نمایی و jitter است.
    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(...) برای پیاده‌سازی سناریوهای متعدد سعی مجدد استفاده کنید.