0Pricing
Go Academy · درس

معالجة الأخطاء ومنطق إعادة المحاولة

التحقق من رموز الحالة وتنفيذ إعادة المحاولة

معالجة الأخطاء ومنطق إعادة المحاولة درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

أخطاء HTTP ليست أخطاء Go

حالة HTTP مثل 404 أو 500 ليست خطأً في Go — إذ يعيد http.Client.Do قيمة خطأ nil لأي استجابة HTTP صالحة. تحقق صراحةً من resp.StatusCode.

تغليف الأخطاء

غلّف الأخطاء مع إضافة سياق باستخدام fmt.Errorf("operation: %w", err) حتى يتمكن المستدعون من فحص السبب باستخدام errors.Is / errors.As.

if err != nil {
    return fmt.Errorf("fetch users: %w", err)
}

الأخطاء القابلة لإعادة المحاولة وغير القابلة لها

أعد المحاولة عند حدوث: مهلات الشبكة، و429 Too Many Requests، و503 Service Unavailable. لا تعد المحاولة عند حدوث: 400 Bad Request، و401 Unauthorized، و404 Not Found — فلن تفيد إعادة المحاولة.

التأخير الأسي

انتظر مدة أطول بين كل محاولة وأخرى لتقليل الحمل على خادم يواجه صعوبات. إليك تطبيقًا بسيطًا:

for i := 0; i < maxRetries; i++ {
    resp, err := client.Do(req)
    if err == nil && resp.StatusCode < 500 { break }
    time.Sleep(time.Duration(math.Pow(2, float64(i))) * time.Second)
}

التذبذب العشوائي

أضف تذبذبًا عشوائيًا إلى التأخير لمنع عدة عملاء من إعادة المحاولة في الوقت نفسه (تأثير القطيع المتدافع).

wait := time.Duration(math.Pow(2, float64(i)))*time.Second + time.Duration(rand.Intn(1000))*time.Millisecond

رأس Retry-After

غالبًا ما تتضمن الاستجابة 429 رأسًا باسم Retry-After. حلّله والتزم به بدلًا من استخدام تأخير ثابت.

retryAfter := resp.Header.Get("Retry-After")
if secs, err := strconv.Atoi(retryAfter); err == nil {
    time.Sleep(time.Duration(secs) * time.Second)
}

إعادة المحاولة المراعية للسياق

تحقق من السياق قبل كل محاولة إعادة، لإيقاف إعادة المحاولة إذا أُلغي الطلب.

for i := 0; i < maxRetries; i++ {
    if ctx.Err() != nil { return nil, ctx.Err() }
    // attempt
}

أنواع الأخطاء المخصّصة

عرّف أخطاء HTTP ذات أنواع محددة لحمل رمز الحالة والجسم، مما يتيح للمستدعين اتخاذ قرارات دقيقة بشأن إعادة المحاولة.

type HTTPError struct {
    Status int
    Body   string
}
func (e *HTTPError) Error() string { return fmt.Sprintf("HTTP %d: %s", e.Status, e.Body) }

خيارات المكتبات

يمكنك استخدام hashicorp/go-retryablehttp أو cenkalti/backoff لمنطق إعادة المحاولة في بيئة الإنتاج، مع سياسات تأخير قابلة للتهيئة وعدد أقصى للمحاولات ودعم السياق.

مفاتيح منع التكرار

بالنسبة إلى طلبات POST التي يُعاد إرسالها، أدرج رأس مفتاح لمنع التكرار (UUID) حتى يزيل الخادم تكرار المحاولات ويعيد النتيجة نفسها من دون إنشاء موارد مكررة.

قاطع الدائرة

يتتبع قاطع الدائرة معدلات الفشل ويوقف إرسال الطلبات إلى خدمة متعثرة لفترة تهدئة. وتطبّق مكتبات مثل sony/gobreaker هذا النمط.

تحقق سريع

لماذا ينبغي إضافة تذبذب عشوائي إلى التأخير الأسي؟

خلاصة: معالجة الأخطاء وإعادة المحاولة

النقاط الأساسية:

  • تحقق من resp.StatusCode — أخطاء HTTP ليست أخطاء Go
  • أعد المحاولة عند 429 و503 ومهلات الشبكة، وليس عند أخطاء العميل 4xx
  • يمنع التأخير الأسي مع التذبذب العشوائي تأثير القطيع المتدافع
  • تحقق دائمًا من السياق قبل إعادة المحاولة

الأسئلة الشائعة

هل درس «معالجة الأخطاء ومنطق إعادة المحاولة» مجاني؟

نعم — نص درس «معالجة الأخطاء ومنطق إعادة المحاولة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «معالجة الأخطاء ومنطق إعادة المحاولة»؟

التحقق من رموز الحالة وتنفيذ إعادة المحاولة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «معالجة الأخطاء ومنطق إعادة المحاولة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إجراء طلبات HTTP
  2. ضبط المهلات والترويسات
  3. فك ترميز استجابات JSON
  4. معالجة الأخطاء ومنطق إعادة المحاولة
← العودة إلى Go Academy