Bulkhead
نمط Bulkhead — عزل الموارد Bulkhead
يعزل موارد كل استدعاء خارجي (اتصالات، خيوط تنفيذ) عن غيره، فلا يستهلك استدعاء واحد بطيء كل الموارد ويُسقط بقية النظام معه.
الاسم مستعار من الحواجز الفاصلة في هيكل السفينة (Bulkheads) — لو تضرر قسم واحد وامتلأ بالماء، الحواجز تمنع انتقال الضرر لبقية السفينة فلا تغرق كلها. بنفس المنطق، لو خدمة واحدة بطيئة استهلكت كل اتصالات HTTP المتاحة أو كل خيوط التنفيذ، تتوقف استدعاءات خدمات أخرى سليمة تماماً بسبب نفاد الموارد المشتركة.
Bulkhead يخصص مجموعة موارد منفصلة (Connection Pool مستقل، حد أقصى طلبات متزامنة) لكل استدعاء خارجي، بحيث يبقى فشل أحدها معزولاً ولا يمتد لغيره.
الصياغة
serviceClients = {
serviceA: pool(maxConnections: N, timeout: T1),
serviceB: pool(maxConnections: M, timeout: T2),
}📄 مثال
// عميل منفصل بحدود موارد مستقلة لكل خدمة خارجية
const clients = {
user: axios.create({ baseURL: 'http://user-service', timeout: 2000 }),
payment: axios.create({ baseURL: 'http://payment-service', timeout: 10000 }),
};
// بطء payment-service لا يستهلك اتصالات user-service ولا يبطئهاأهم النقاط
| العنصر | الوظيفة |
|---|---|
| عزل الموارد | مجموعة اتصالات/خيوط منفصلة لكل استدعاء خارجي |
| احتواء الفشل | استنفاد موارد استدعاء واحد لا يمتد لبقية النظام |
💡 نصائح عملية
- غالباً يُطبَّق مع Circuit Breaker معاً — Bulkhead يعزل الموارد، Circuit Breaker يوقف المحاولات الفاشلة
- اضبط حجم كل تجمّع موارد حسب أهمية الخدمة وحساسيتها للزمن، لا بقيمة موحّدة للجميع
⚠️ أخطاء شائعة
- مشاركة نفس عميل HTTP (وبالتالي نفس تجمّع الاتصالات) بين استدعاءات لخدمات مختلفة تماماً
- تجاهل Bulkhead لأن Circuit Breaker وحده كافٍ — بدون عزل موارد، قد ينفد الاتصال قبل أن يلاحظ Circuit Breaker الفشل
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار MICROSERVICES الكامل بالعربي.