المحاولة مجدداً

هذا الفصل يُقدم آلية إعادة المحاولة لطلبات Go Resty.

يستخدم Resty العودة التدريجية لزيادة فترة المحاولة بعد كل محاولة.

مثال على الاستخدام:

// إنشاء عميل Resty
client := resty.New()

// تكوين عدد محاولات إعادة المحاولة داخل كل عميل
client.
    // قم بتعيين عدد محاولات إعادة المحاولة غير الصفر لتمكين المحاولات 
    SetRetryCount(3).
    // يمكنك تخصيص الوقت الابتدائي لانتظار إعادة المحاولة.
    // القيمة الافتراضية هي 100 ميلي ثانية.
    SetRetryWaitTime(5 * time.Second).
    // يمكن أيضًا تجاوز MaxWaitTime.
    // القيمة الافتراضية هي 2 ثانية.
    SetRetryMaxWaitTime(20 * time.Second).
    // قم بتعيين RetryAfter لحساب دالة الاستدعاء لفترة الانتظار بين محاولات إعادة المحاولة.
    // القيمة الافتراضية (nil) تعني استخدام وقت الانتظار التدريجي المتزايد والتشويش.
    SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
        return 0, errors.New("تم تجاوز الحصة")
    })

بشكل افتراضي، سيقوم resty بإعادة محاولة الطلبات التي تعيد أخطاء غير صفرية أثناء التنفيذ. لذلك، ستقوم الإعدادات أعلاه بجعل resty يعيد محاولة الطلبات التي تعيد أخطاء غير صفرية مع زيادة التأخير بعد كل محاولة، مع حد أقصى لعدد المحاولات يبلغ 3.

يمكنك أيضًا توفير شروط إعادة محاولة مخصصة للعميل:

// إنشاء عميل Resty
client := resty.New()

client.AddRetryCondition(
    // يُستخدم نوع RetryConditionFunc للدوال المتعلقة بشروط إعادة المحاولة
    // المُدخل: استجابة (Response) غير صفرية أو خطأ في تنفيذ الطلب
    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(...) لتنفيذ سيناريوهات إعادة المحاولة التي لا تُحدَّد.