System Design

توزيع الأحمال التكيفي لخدمات المايكرو

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

المشكلة مع الأوزان الثابتة

في بنية خدمات المايكرو النموذجية، قد يكون لديك خمسة نطاقات لخدمة الدفع. في البداية، تكون جميع النطاقات سليمة. ومع ذلك، قد تبدأ إحدى النطاقات في experiencing فترات توقف لجمع القمامة، أو استخدامًا مرتفعًا لوحدة المعالجة المركزية، أو تسربًا في الذاكرة. يستمر موزع الأحمال الثابت في إرسال الحركة إلى جميع النطاقات الخمسة، مما يسبب زيادة في زمن الاستجابة للمستخدمين الذين يصلون إلى العقدة المتعثرة. في النهاية، قد تفشل تلك العقدة تمامًا، مما يؤدي إلى فشل متسلسل إذا لم يستجب موزع الأحمال بسرعة كافية.

فحوصات الصحة في الوقت الفعلي

يبدأ التوزيع التكيفي الفعال بفحوصات صحة دقيقة. بدلاً من الاعتماد حصريًا على رموز حالة HTTP، نراقب أوقات الاستجابة، ومعدلات الأخطاء، ومؤشرات التشبع. نحدد ثلاث حالات لكل نطاق خدمة: سليم، متدهور، وغير سليم. يُعتبر النطاق متدهورًا إذا تجاوز زمن استجابته حدًا معينًا (مثلًا، إذا كان زمن الاستجابة عند النسبة المئوية الخامسة والتسعين مرتين أعلى من الأساس) أو إذا تجاوز معدل أخطائه نسبة مئوية محددة.

خوارزمية الوزن الديناميكي

بمجرد حصولنا على بيانات الصحة، نحسب وزنًا ديناميكيًا لكل نطاق. يحدد الوزن احتمال استقبال النطاق للطلب التالي. يعمل نموذج الاضمحلال الأسي البسيط جيدًا هنا. نحافظ على "درجة أداء" لكل نطاق تتلاشى مع مرور الوقت. تزيد الطلبات الناجحة من الدرجة، بينما تقلل الطلبات البطيئة أو الفاشلة منها. ثم يتم تطبيع الوزن بناءً على هذه الدرجات.


function calculateDynamicWeight(instance, healthData) {
    const baselineLatency = 100; // ms
    const currentLatency = healthData.latency;
    const errorRate = healthData.errorRate;
    
    // عقوبة على زمن الاستجابة المرتفع
    const latencyPenalty = Math.max(0, (currentLatency - baselineLatency) / baselineLatency);
    
    // عقوبة على الأخطاء
    const errorPenalty = errorRate * 10;
    
    // الدرجة المجمعة: الأقل أفضل
    const totalPenalty = latencyPenalty + errorPenalty;
    
    // الأوزان تتناسب عكسيًا مع العقوبة
    // يضمن الوزن الأدنى تدفق بعض الحركة لاختبار التعافي
    return Math.max(0.1, 1.0 - totalPenalty);
}

استراتيجية التنفيذ

في الممارسة العملية، غالبًا ما يتم تضمين هذه المنطق داخل جانب الشبكة (مثل Envoy أو Linkerd) أو موزع أحمال مركزي. يوفر التوزيع التكيفي القائم على الجانب (Sidecar) زمن استجابة أقل لأن فحوصات الصحة محلية. يتتبع الجانب أداء كل نطاق صاعد ويضبط قرارات التوجيه خلال أجزاء من الثانية. على سبيل المثال، إذا ارتفع زمن استجابة النطاق أ، فإن الجانب في خدمة العميل ينقل الحركة فورًا إلى النطاق ب وج، دون انتظار رد فعل من المنسق المركزي.

معالجة التذبذب والهستيريسيس

من الأخطاء الشائعة هي "التذبذب"، حيث يتبدل النطاق بسرعة بين حالتي سليم وغير سليم بسبب مشاكل عابرة. لمنع ذلك، نستخدم الهستيريسيس. يجب أن يكون النطاق سليمًا لمدة معينة (مثلًا، 30 ثانية) قبل استعادة وزنه بالكامل. وبالمثل، يجب أن يفشل باستمرار لفترة قصيرة (مثلًا، 5 ثوانٍ) قبل أن يُصنف كغير سليم. يمنع هذا التنعيم موزع الأحمال من تذبذب الحركة دون داعٍ.


class InstanceTracker {
    constructor(instanceId) {
        this.instanceId = instanceId;
        this.state = 'HEALTHY';
        this.lastStateChange = Date.now();
        this.consecutiveFailures = 0;
        this.consecutiveSuccesses = 0;
    }

    recordResult(success, latencyMs) {
        if (success) {
            this.consecutiveSuccesses++;
            this.consecutiveFailures = 0;
            
            // الهستيريسيس: تتطلب 30 ثانية من النجاح للتعافي من الحالة المتدهورة
            if (this.state === 'DEGRADED' && Date.now() - this.lastStateChange > 30000) {
                this.state = 'HEALTHY';
                this.lastStateChange = Date.now();
            }
        } else {
            this.consecutiveFailures++;
            this.consecutiveSuccesses = 0;
            
            // الهستيريسيس: تتطلب 5 إخفاقات لتعليم الحالة كغير سليمة
            if (this.consecutiveFailures >= 5) {
                this.state = 'UNHEALTHY';
                this.lastStateChange = Date.now();
            } else if (this.consecutiveFailures >= 2) {
                this.state = 'DEGRADED';
                this.lastStateChange = Date.now();
            }
        }
    }
}

الخاتمة

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

Share: