قد يتناوب المُحدِّد تناوبًا مثاليًّا ويظل يختار البروكسي الأول. الخطأ هو إنشاء مُحدِّد جديد لكل طلب عن غير قصد، ما يعيد ضبط عدّاده قبل أن يتمكن من اتخاذ خيار ثانٍ.

أنشئ المُحدِّد مرة واحدة واحتفظ به مع النقل. يمكن لـقائمة بروكسي HTTP أن توفّر مرشّحين عامّين من HTTP لمجموعة عناوين URL عندما تسمح الطلبات بوسطاء عامّين. ابدأ بقائمة عناوين URL للبروكسي جرى التحقق منها سابقًا وغير فارغة:

func rotatingProxy(urls []*url.URL) func(*http.Request) (*url.URL, error) {
    var mu sync.Mutex
    next := 0
    return func(*http.Request) (*url.URL, error) {
        mu.Lock()
        selected := urls[next]
        next = (next + 1) % len(urls)
        mu.Unlock()
        return selected, nil
    }
}

يجب أن يرفض التطبيق المحيط القائمة الفارغة، وأن يتحقق من عناوين URL، وأن يستخدم الاستيرادات العادية net/http وnet/url وsync. ينبغي أن تبقى القائمة غير قابلة للتغيير ما دام هذا المُحدِّد يستخدمها، أو أن تُستبدل عبر تصميم مُزامَن بشكل منفصل.

أرفق الدالة المُعادة بـhttp.Transport واحد محتفظ به. يحمي القفل المتسلسل تسلسل الاختيار عبر النداءات المتزامنة. ولا يتطلب إمساك قفل أثناء اكتمال طلب شبكة بطيء.

لا تستهلك مسارًا لمجرد طباعته

استدعاء المُحدِّد مرة أخرى لرسالة تشخيصية يقدّم العدّاد مرة أخرى. وقد يصف ذلك الناتج المرشّح التالي بدلًا من المرشّح الذي استخدمه الطلب الذي تفحصه. سجّل الاختيار داخل النداء الحقيقي باستخدام معرّف نقطة نهاية آمن.

استدعاء النداء ليس دليلًا على تسليم الطلب بنجاح. فإعادات التوجيه أو محاولات النقل الإضافية قد تُعقّد افتراضًا بسيطًا مثل «استدعاء تطبيق واحد، اختيار واحد». وإذا كان على سير عمل أن يبقي مسارًا واحدًا عبر عدة عمليات، فاختر ذلك المسار عند حدود سير العمل بدلًا من استخدام نداء دوري عام.

كما أن التناوب الدوري لا يَعِد بمخارج عامة متمايزة. إنه يجدول نقاط النهاية. وتبقى الهوية النهائية خاصية للمسار الذي توفّره كل نقطة نهاية.

مقالات ذات صلة