Table of Contents
مقدمة: تحدي المرونة في الحاسوب الذي لا يُحصى
وقد أعادت الحواسيب التي لا تحصى تشكيل كيفية قيام المطورين ببناء ونشر التطبيقات عن طريق إدارة الهياكل الأساسية المجزأة وتقديم توسيع تلقائي، ومنابر مثل " لامبدا " ، ووظائف " أزوير " ، ووظائف " غوغل " ، تتيح للأفرقة التركيز على منطق الأعمال التجارية، مع دفع تكاليف الاستخدام الفعلي فقط، إلا أن هذا النموذج يستحدث تحديات فريدة في مجال القدرة على التكيف، كما أن الأعمال غير قابلة للتكافلة، وكثيرا ما تكون موزعة.
ويستخدم جهاز " كسر الدائرة " كموقوف أمان لتطبيقكم، ويرصد المكالمات التي توجه إلى الخدمات أو الموارد النائية ويمنع المحاولات الأخرى عندما تتجاوز معدلات الفشل عتبة، ويحمي النظام من أن يُغلب عليه الزمن، ويتيح الوقت اللازم لاسترداد الخدمات، ويوفر تراجعا نظيفا للمستعملين، وفي هذه المادة، نتوسع في المحتوى الأصلي لكي نقدم لكم دليلا شاملا وقابلا للتطبيقات المحددة في التطبيقات التي لا تقدم لها أي معلومات.
فهم دورية "إكسر" في "ديبث"
The Circuit Breaker pattern was popularized by Michael Nygard in his book Release It! ] and later formalized in cloud-native patterns. It behaves like an electrical circuit breaker: when a circuit detects a fault (e.g., a shortuit), it opens and stops the flowci in software,
- Closed:] requests flow normally to the downstream service. The breaker monitors failure rates (e.g., HTTP 5x errors, timeouts) If failures exceed a configured threshold within a given time window (e.g., 10 failures in 30 seconds), the circuit trips to
- Open:] requests are immediately rejected (or fallback logical is invoked) without calling the failing service. This prevents wasteted resources and gives the downstream service a recovery window. After a timeout period (e.g., 30 seconds), the circuit transitions to ]Half-Open.
- Half-Open:] A limited number of trial requests are allowed through. If these succeeded (within defined success criteria), the circuit resets to ]Closed. If failures persist, it returns to Open[FLT time:5]
وهذه الآلة الحكومية حرجة، فبدونها، يمكن أن يؤدي انقطاع مؤقت لجميع العملاء إلى العودة في وقت واحد، أو إيجاد قطيع رعد يمتد من الرحل، كما أن نمط كسر الدائرة يوفر الفشل المبكر في تلقي ردود الفعل على العملاء، مما يتيح تدهوراً سميناً، مثلاً، إعادة البيانات المخبأة أو رسالة خطأ ودية بدلاً من الاستراحة.
Martin Fowler’s seminal article on Circuit Breaker] remains the foundational reference. He explains how the pattern integrates with other resilience patterns like Retry and Bulkhead.
البارامترات الرئيسية للتطوين
فكل عملية من عمليات كسر الدوائر تكشف عن معايير قابلة للتشكيل يجب تعديلها وفقا لسلوك تطبيقك:
- عتبة التحمل: ] عدد حالات الفشل المتتالية (أو المعدل فوق النافذة) في فتح الدائرة.
- Timeout duration:] How long the circuit remains open before transitioning to half-open.
- إحصاء محاكمات من الدرجة الأولى: ] عدد الطلبات الناجحة اللازمة لإغلاق الدائرة.
- Error classification:] What responses count as failures? only 5x? Timeouts? 4x? (Usually only server-side errors).
- Recovery timeout:] Optionally incremental (exponential backoff) to prevent toggling.
فالتطبيقات التي لا تُستخدم تُضاف تعقيدات: فلأن المهام هي في الجو، لا يمكن أن تعتمد على الحالة الداخلية للدائرة، وإذا فشلت حالة لامبدا، قد تضيع ولاية الدائرة، وبالتالي، فإن تخزين الدولة الخارجي (DynamoDB، أو Redis، أو خدمة مُدارة) أمر ضروري في كثير من الأحيان.
تنفيذ نظام " كسر الدائرة " في البيئات التي لا توصف
تنفيذ نظام انفصال الدائرة في هيكل لا يخدم يتطلب تكييف النمط مع قيود المنبر، وسنغطي ثلاثة نُهج رئيسية: استخدام الملامح الإدارية لإدارة شؤون الإعلام، وتعبئة مكتبات الأطراف الثالثة في إطار رمز وظيفتك، واستخدام خدمات التفتيش مثل مهام الخطوة AWS.
النهج 1: نظام تحديد المواقع على مستوى بوابة نظام المعلومات الإدارية المتكامل
ويمكن أن تعمل بوابة نظام AWS API على أنها جهاز تفكك بدائي عن طريق إبطال الطلبات المقدمة إلى وظيفة خلفية في لامبدا، وعندما تعود الوظيفة إلى أخطاء من الدرجة الخامسة أو تتجاوز حدود التطابق، يمكن أن يُحدَّد نظام تقييم الأداء من رد فعل التراجع (مثلاً، رسالة ثابتة من مرخص أو رد فعل مدمج حقيقي).
وضع خطة لاستخدام بوابة نظام المعلومات الإدارية المتكامل مع حد أقصى للانفجار و الحد الأقصى للمعدلات التي تعكس قدرة ظهرك وعندما تُلغى مهمة لامبدا، يستجيب بوابة نظام المعلومات الإدارية المتكامل على الفور بـ ، ويعمل كجهاز لكسر للطريق الواحد، ولكن هذا لا يميز بين الفشل في تقديم الخدمات وفشلها الفعلي.
النهج 2: توزيع المعلومات داخل المكتبات
ويتمثل النهج الأكثر مرونة في إنشاء مكتبة لكسر الدوائر داخل وظائف لامبدا، ونظراً لأن وظائف لامبدا عديمة الجنسية ومتضخمة أفقياً، يجب تخزين ولاية كسر الدوائر خارجياً بحيث يمكن لكل مناصرة التحقق من الحالة الراهنة، واستخدام نمط مشترك [(FLT:0]) [Amazon DynamoDB.
وبالنسبة للندوات، فإن المكتبة Opossum] هي مفرق واسع الانتشار في الدوائر المستخدمة، وهي تدعم وظائف الاسترداد، والتوقيت، وعتبة الحجم، وهنا يتم تبسيط التنفيذ الذي يتم تكييفه مع لامبدا " AWS Lambda:
const CircuitBreaker = require('opossum');
const AWS = require('aws-sdk');
const dynamo = new AWS.DynamoDB.DocumentClient();
const circuitBreakerState = {
state: 'CLOSED',
failureCount: 0,
lastFailureTime: null
};
// Persist state in DynamoDB after each transition
async function persistState(newState) {
await dynamo.put({
TableName: 'CircuitBreakerState',
Item: { serviceId: 'payment-service', ...newState }
}).promise();
}
async function loadState() {
const data = await dynamo.get({
TableName: 'CircuitBreakerState',
Key: { serviceId: 'payment-service' }
}).promise();
return data.Item || circuitBreakerState;
}
// The actual downstream call
async function callPaymentService(payload) {
const http = require('axios');
const response = await http.post('https://payment.example.com/charge', payload);
return response.data;
}
// Circuit breaker options
const options = {
errorThresholdPercentage: 50,
resetTimeout: 30000,
volumeThreshold: 10
};
// Create breaker with external state integration (simplified)
const breaker = new CircuitBreaker(callPaymentService, options);
breaker.fallback(() => ({ error: 'Payment service unavailable, order processed in offline mode' }));
exports.handler = async (event) => {
// Load state from DynamoDB and update breaker
const savedState = await loadState();
// Opossum doesn't natively restore state; you'd need to implement a wrapper.
// For brevity, assume the breaker is fresh per function invocation but uses external checks.
// In production, use a shared cache with TTL instead of per-invocation state load.
return breaker.fire(event.body);
};
وهذا المثال يغفل الإدماج الكامل للوضوح، وفي الممارسة العملية، ستحتاجون إلى التزامن بين حالة كسر الدائرة في العديد من المحركات المتزامنة التي تستخدم الكتابات المشروطة في دينامو دي بي (القفل المؤقت) لتجنب ظروف العرق، وكثيرا ما تكون هناك حالة اعادة تشكيل (مثلا باستخدام الشارب الشارع) أكثر أداء.
النهج 3: وظائف خطوت AWS - مفرق العرض على مستوى الأوركستنغ
وبالنسبة لتدفقات العمل المتعددة المراحل (مثلاً، عمليات التفتيش على التجارة الإلكترونية)، يمكن أن تُمثل المهام المتعلقة بخطوة الدائرة كجهاز حكومي، ويمكن للدولة أن تفحص جهازاً مناظراً أو علم مخزن في طاولة منضدة، وإذا تجاوز عدد الفشل عتبة، فإن تدفق العمل يتجه إلى مسار أعلى من خط التراجع (مثلاً، البريد الإلكتروني).
مثال: وظيفة الخطوة التي تدعو إلى تقديم خدماتين في المجرى السفلي، بعد فشلها، تُعدّ منضدة دينامو دي بي، وقبل كل دعوة لاحقة، يقرأ أداء الخطوة المنضدة، وإذا تجاوز 5، فإن تدفق العمل يسلّط طريق الانهيار، وهذا هو بالفعل كسر دائري على مستوى تدفق العمل.
التحديات والحلول التي لا توصف
- Cold starts:] Circuit breaker state needs to survive function instance recycling. Use external state with a short TTL to automatically close the circuit after a period of no activity.
- Concurrency:] Many function instances may check and update state concur. Use optimistic locking (DynamoDB condition expressions) ortom increment/decrement patterns.
- Cost:] Each state check adds read/write costs. Cache state in-memory with a short expiry (e.g., 1 second) within the same function instance to reduce DynamoDB reads, but accept eventual consistency.
- Timeout granularity:] Lambda functions have a maximum invocation time (15 minutes). Circuit breaker timeouts should be much shorter (seconds) to avoid holding open the function.
فوائد استخدام أجهزة الإرسال
المزايا تتجاوز الحدود الأساسية لنستكشف كل فائدة في سياق لا يُمكن أن تكون
تحسين القدرة على التكيف - منع الفشل في القصف
إن السلاسل التي لا توصف هشة، وإذا كانت الخدمة ألف، باء، و باء تتصل بجيم، وفشلت في ذلك، فإن الفشل ينشر، وسيتسبب انقطاع الدائرة في دعوة بي إلى جيم في فتح دائرة دائرة بعد بعض الفشل، والآن، فإن الطلبات من ألف إلى باء ترفض فورا بتراجع، مما يحول دون استنفاد B من الحد المتزامن للوحدة، ويصبح خنقا.
التعافي السريع - الصحة الذاتية بدون تدخل دليلي
وعندما تكون الدائرة مفتوحة، تُمنح فترة الراحة لا تُرسل طلبات، مما يسمح لها بالتعافي (مثلاً، إعادة التشغيل، أو إزالة تسرب الذاكرة، أو إعادة تشكيلها)، وتُجري الدولة التي تُعتبر نصف مُتاحة دورياً خدمة، وعندما تستجيب بنجاح، تغلق الدائرة تلقائياً، وهذا التلقيم الذاتي حيوي بالنسبة إلى لاسلال الخدمة حيث يصعب إبطال وظائف الكبد.
الخبرة المعززة للمستعملين - التحلل المجيد
وبدلا من أن تظهر صفحة عامة " جبر " أو محمولاً منقولاً، يمكن أن تعيدوا بيانات ثابتة أو نسخة مبسطة من الملامح أو رسالة ودية، مثلاً، قد تستخدم دائرة توصية المنتج جهازاً للكسر: فعندما يكون مفتوحاً، تبين صفحة المنتج " التوصيات غير متاحة مؤقتاً " بدلاً من أن تفشل كلياً.
وفورات التكاليف - تجنب الاحتجاجات غير الضرورية
فالتسعير غير المكفوف يستند إلى الطلبات والمدة، وعندما تفشل خدمة المجرى المائي، يستمر في تسميتها بالنفايات، وكل احتجاج لمهمتك التي تفشل على الفور (أو تؤدي إلى انقطاع زمني في انتظار المجرى) لا يزال يكلفها، ويتوقف جهاز كسر الدائرة هذه المكالمات، ويخفض التكاليف أثناء نوافذ الفشل.
أفضل الممارسات لنشر نشر أجهزة الإرسال
إن تنفيذ نظام " كسر الدائرة " ليس نشاطاً يناسب الجميع، بل استخدام هذه الممارسات لتحقيق أقصى قدر من الفعالية في بيئة لا تخدم أي خدمة.
تحديد أماكن العمل والتوقيت المناسب
فعلى سبيل المثال، إذا كانت خدمة المجرى المائي تهدف إلى 99.9 في المائة من وقت العمل، فإن عتبة 5 حالات فشل في الدقيقة قد تكون حساسة للغاية (يمكن أن تفتح خلال فترات النزيف الطفيفة) وتبدأ بعتبة أعلى (مثلاً، معدل خطأ بنسبة 20 في المائة على نافذة واحدة) وتكيف استخدام بيانات الرصد، وينبغي أن تكون فترات التوقف عن الدراسة أطول قليلاً من وقت الاستجابة المعتاد في المرحلة النهائية، وإن كانت أقصر من وقت عملك العام.
تنفيذ آليات الاسترداد
وينبغي أن يكون لكل طلب من الدوائر المفتوحة تراجعاً، وتشمل الخيارات ما يلي:
- Retrieve cached data (from ElastiCache, CloudFront, or a database).
- Queue the request for later processing (e.g., SQS DLQ).
- أعيدي قيمة ناقصة أو رد ثابت
- Redirect to a degraded version of the feature (e.g., disable personalization).
وينبغي أن تكون الإخفاقات مُثلية حيثما أمكن، لا سيما بالنسبة للكتابات.
دول المراقبة ودائرة اللغم
قم بتصنيف دائرة كل دولة من أجهزة التغيير والفشل، واستعمال مقاييس الكلاود ووتش (مثلاً، القياسات العرفية للعد المفتوح للدائرة، والمحاكمات نصف العينة، واستخدام الخريف) وتضبط أجهزة الإنذار: إذا بقيت الدائرة مفتوحة لفترة طويلة، وتخطر العمليات، وتسجل أيضاً سبب الفشل - التوقيت، والخطأ، وما إلى ذلك - في المساعدة على إبطال مفعولها.
Combine with Other Resilience Patterns
- Retry:] Use a retry pattern inside] the circuit breaker, but with exponential backoff and jitter. The circuit breaker itself should not retry; instead, the client call is wrapped with a retry policy (e,g.
- Bulkhead:] Isolate resources by function or service. For example, reserve a concurrency limit for critical vs. non-critical functions. When a circuit opens, it reduces load on the failing service, preventing it from affecting other parts of the system.
- Timeout:] always set a timeout on downstream calls — shorter than the breaker’s failure window. This prevents long hanging requests from skewing the failure count.
- Health check endpoints:] Use a background process (e.g., a CloudWatch scheduled event) to periodically invoked a health check endpoint. If the health check fails, preemptively open the circuit before users are affected.
اختبروا سيرتك تحت الفشل
هندسة الفوضى هي صديقتك، استخدم أدوات مثل جهاز "إس إس" للتصوير بالحقن الافتراضي لتصوير الفشل في خدماتك في المجرى السفلي وراقب سلوك الكسر الدائري
- الدائرة تفتح في الإطار الزمني المتوقع.
- التراجعات تنفذ بشكل صحيح
- وتسترد الدائرة (نصف ساعة ثم أغلقت) بعد حل الخطأ.
- لا توجد ايجابيات خاطئة تحدث تحت ضغط الدم العادي
الاختبار في بيئة مُضادة تُعكس الإنتاج أمر أساسي، توثيق السلوك المتوقع، وإدارة الحفر بانتظام.
Use an External State Store with TTL
لا يمكنك الاعتماد على الذاكرة المحلية عبر المظاهرات، استخدام دينامو دي بي، إيلاستيكيتش لريديس، أو خدمة مصنوعة مثل يوريكا، ووضع سجل الدولة في الوقت المناسب حتى إذا كانت وظيفتك غير نشطة لفترة طويلة، فإن الدائرة تلقائياً تغلق، وهذا يحول دون عودة دولة مفتوحة إلى مكانها بعد أن تكون الخدمة قد توقفت.
خاتمة
وبما أن الخادم يصبح العمود الفقري للتطبيقات الحديثة، فإن أنماط المرونة مثل مفرقع الدائرة لم تعد اختيارية - فهي ضرورية لمراقبة التكاليف، والوقت الإضافي، وارتياح المستعملين، وبفهم آلة الدولة، وبتنفيذها بشكل صحيح في حدود منصة الخواديم (مدخل أو رمز المهام أو مهام الخطوة)، وباتباع أفضل الممارسات في مجال الرصد والاختبار، يمكنك بناء نظم يدوية تتحلل بشكل جيد دون الفشل والتعافي.
نمط كسر الدائرة هو مجرد قطعة واحدة من أحجية القدرة على الصمود، وتجمعها مع المقادير، والرؤوس السائبة، والفحوصات الصحية، والقابلية للاحتفاظ الشامل لإنشاء بنية قوية حقاً لا تعمل على الخواديم، وبدء تشغيلها على نحو صغير، ورصدها عن كثب، وتكرارها.