Table of Contents
تحدي إدارة الموارد في سكال
وفي نهاية المطاف، يواجه كل تطبيق للإنتاج يعالج الطلبات المتزامنة نفس الاختناقات: كيفية إدارة الموارد المحدودة والمكلفة بكفاءة، كما أن وصلات قواعد البيانات، وجوارب الشبكة، والعمال الجاهزين، وعملاء المنظمة، كلها تمثل موارد باهظة التكلفة لخلق واستهلاك الذاكرة، وتتطلب إدارة دقيقة لدورة الحياة، وفي بيئات عالية الدقة، يؤدي النهج الساذج المتمثل في الحصول على مورد جديد لكل طلب إلى سرعة استنفاد الموارد،
ويتضمن الحل المشترك نمطين راسخين: نمط Singleton pattern] و] تجميع الموارد ]، وفي حين أن كل نمط يعالج شاغلاً متميزاً، فإن الجمع بينهما يوفر أساساً قوياً لبناء نظم قابلة للتنبؤ، وتستكشف هذه المادة عبء العمل وراء كلا الأنماط المعمارية، وتظهر التنفيذ العملي لبرمجيات الإنتاج في ضوءها.
The singleton Pattern: Foundation for Controlled Access
النمط الوحيد يُنفذ أنّ طبقة تنتج بالضبط حالة واحدة طوال عمر التطبيق، وتوفر نقطة وصول عالمية إلى تلك الحالة، في شكلها النقي، يتحكم النمط في الخلق والوصول معاً، ويمنع أيّ مسار رمزي من الإصدار الفوري عرضياً لنسخة ثانية من مدير الموارد.
وكثيرا ما ينتقد العُزُززون لإدخالهم في دولة عالمية مخفية، ولكن عندما يُطبَّق على الهياكل الأساسية يتعلق بمصانع الاتصال، أو مديري المجمعات، أو مكاتب التكوين، أو يقدمون منافع كبيرة، ويقضي أحد نقاط المراقبة على الغموض الذي يُستخدم حاليا في تجميع التطبيقات، ويبسِّط الرصد والقطع، ويقلل من الحمولة المعرفية على المطورين الذين لم يعد عليهم أن يجتازوا إشاراتهم.
غير أن نمط العازبين يستحدث شرطاً ثلاثياً في نظام واحد مصمم ولكن غير مقصود في نظم متزامنة: يجب نشر حالة واحدة بأمان في جميع الخيوط، وبدون التزامن المناسب، يمكن أن يرصد خيطان مختلفان من الوحوش، مما يؤدي إلى تكرار حالات أو فساد في النظام الداخلي، وهذا القلق يسترشد به مباشرة في كل قرار تنفيذي في بيئات عالية الدقة.
تجميع الموارد كإستراتيجية أداء
وتعالج مسألة تجميع الموارد مشكلة مختلفة: تكلفة اقتناء الموارد والتفكك، إذ أن إنشاء وصلة جديدة لقاعدة البيانات تشمل المصافح الشبكية، وتبادل التوثيق، وتخصيص الذاكرة، وفي نظام يتسم بدرجة عالية من التجانس، يقوم على مئات الطلبات في الثانية، يمكن أن يهيمن على الرؤوس العامة لإنشاء وصلات من الخدش وقت الاستجابة الكامل.
ويحتفظ المجمع بمجموعة من الموارد التي تم استقطابها قبل بدء تشغيلها والتي يتم اقتراضها وإعادةها بدلا من إنشائها وتدميرها، ويدير المجمع دورة الحياة، ويتتبع الموارد المستخدمة، والتي تتوافر، وعندما يتعين طرد الموارد بسبب المهارة أو الأخطاء، وتشمل البارامترات الرئيسية الحجم الأولي للمجمع، والحجم الأقصى للمجمع، والتوقيت العازل، وسياسة الإخلاء.
وتظهر البحوث التي أجريت من نظم الإنتاج في شركات مثل أوبر ونتفليكس أن تجميع الاتصالات المناسبة يمكن أن يقلل من حمولة قاعدة البيانات بنسبة 40-60% تحت عبء الذروة، وذلك أساساً بإلغاء وقت إنشاء الاتصال، ويستوعب المجمع حركة المرور المفاجئة عن طريق إعادة استخدام الموارد الموجودة، ويحمي الخدمة في المراحل النهائية من الإفراط في استخدامها من جانب عميل غير منسق قد يفتح في الوقت نفسه مئات من الاتصالات.
Merging sing sing sing sington and Resource Pooling
وينشئ الجمع بين نمط " سينغلتون " ومجموعة موارد مجمعة واحدة يمكن الوصول إليها عالمياً تستخدمها جميع الخيوط بشكل متسق، ويحل هذا النهج مشكلة عملية: فبدون أن تكون واحدة، قد ينشئ كل عنصر مجمعاً خاصاً به، مما يؤدي إلى ازدواجية في الموارد، وازدواجية في النفقات العامة، وسلوك النظام غير قابل للتنبؤ، وبمجموعة واحدة، يتدفق كل طلب من خلال نفس المجموعة من الموارد التي تدار، مما يجعل تخطيط القدرات أمراً أفضل واستخداماً للموارد.
ويجب أن يتناول مجمع العازبات ثلاث مسؤوليات:
- Safe initialization] "mdash; The pool must be created once, even under concurrent calls to the accessor method.
- Thread-safe resource accessmdash; Borrow and release operations must be nuclear or properly coincidehronized to prevent data races.
- Life cycle management] "mdash; The singleton must handle resource validation, eviction of stale connections, and brful closure.
وتُتخذ كل مسؤولية قرارات تصميمية تؤثر على الأداء والموثوقية والقابلية للملاحظة.
Tread Safety in singleton Resource Pools
ويستخدم أبسط نظام أمني متزامن طريقة الدخول، كما هو مبين في التعليمات المشتركة، ويسير هذا النهج بشكل صحيح، ولكنه يستحدث اختناق: فكل دعوة للحصول على مركز التجميع تكتسب قفلا، حتى بعد الاستهلال، وفي نظم عالية المخرجات، يمكن أن تصبح هذه القفل نقطة خلاف تحد من إمكانية التصعيد.
ويستخدم نهج محسن نمط القفل المدقق الذي يُحد من التزامن إلى البداية الأولى ويستخدم حقل متقلب أو ذري في حالة المخبأ، وفي جافا، تضمن [الكلمات الرئيسية] أن تكون الشطبات في الميدان واضحة لجميع الخيوط، مما يحول دون التنفيذ المبكر للحشرات.
للغات التي تدعم الإبتدائية الذريّة مثل (جوفا) أو مندوب (كوتلين) يصبح التنفيذ آمناً و مُؤدّياً بدون تزامن يدوي
استراتيجيات الاستبدال البديلة
وبدلاً من أن تُدخل في البداية البكرون في أول الوصول، يفضل العديد من نظم الإنتاج ] الاستهلال المائي ] أثناء بدء التطبيق، ويُبسط الرمز بشكل متلهف، ويتجنب التزامن تماماً، ويُستَجمع السطحات سوء التداول قبل أن يبدأ التطبيق في خدمة حركة المرور، ويُعتبر التداول أطول قليلاً في التطبيقات التي تكون مقبولة عادة.
وهناك استراتيجية ثالثة، مشتركة في هياكل الخدمات الصغرى، تستخدم حاوية لأجهزة تحديد مواقع الخدمة أو التبعية لإدارة دورة الحياة الوحيدة، ويمكن أن تقوم أطر مثل الربيع أو الميكروناوت أو كواركوس بتفسير المجمع في البداية، وتحقنه في الفاصوليا المعالين، وضمان الإغلاق الرخيص من خلال خطافات دورة الحياة، ويفصل هذا النهج بين المجمع من مستهلكيه ويسهل الاختبارات بإتاحة إمكانية إجراء اختبارات في شكل مراكب.
A Production-Ready Java Implementation
ويظهر المثال التالي مجموعة موارد تُوازن بين السلامة والأداء والقابلية للملاحظة، وتستخدم عملية الاستبدالية المتوقّعة، ومساحة مجمّعة مُحدّدة للتجميع الأساسي، وآلية للتخلّص من الوقت لمنع الانتظار إلى أجل غير مسمى.
التصميم المشترك
public interface Pool<T> {
T borrow() throws InterruptedException, PoolExhaustedException;
void release(T resource);
void invalidate(T resource);
int availableCount();
int borrowedCount();
void shutdown();
}
وتفصل هذه العلاقة بين عقد التجميع عن التنفيذ، مما يتيح تبادل الاستراتيجيات المختلفة (الحواجز، وعدم الحجب، والقائمة على الأولوية) مع تطور الاحتياجات.
التنفيذ الأساسي
public class ResourcePool<T> implements Pool<T> {
private final BlockingQueue<T> available;
private final AtomicInteger borrowedCount = new AtomicInteger(0);
private final AtomicBoolean shutdown = new AtomicBoolean(false);
private final ResourceFactory<T> factory;
private final int maxSize;
public ResourcePool(int coreSize, int maxSize, ResourceFactory<T> factory) {
this.maxSize = maxSize;
this.factory = factory;
this.available = new LinkedBlockingQueue<>(maxSize);
for (int i = 0; i < coreSize; i++) {
available.offer(factory.create());
}
}
@Override
public T borrow() throws InterruptedException, PoolExhaustedException {
if (shutdown.get()) {
throw new PoolExhaustedException("Pool is shut down");
}
T resource = available.poll(5, TimeUnit.SECONDS);
if (resource == null) {
throw new PoolExhaustedException("No resources available within timeout");
}
borrowedCount.incrementAndGet();
return resource;
}
@Override
public void release(T resource) {
if (resource != null) {
available.offer(resource);
borrowedCount.decrementAndGet();
}
}
@Override
public void invalidate(T resource) {
if (resource != null) {
factory.destroy(resource);
borrowedCount.decrementAndGet();
// optionally replenish the pool
}
}
@Override
public void shutdown() {
shutdown.set(true);
available.forEach(factory::destroy);
available.clear();
}
// Accessor methods omitted for brevity
}
ويستخدم هذا التنفيذ للمجمع المتاح الذي يوفر عرض السلامة من الخيوط وعمليات الاقتراع دون التزامن الخارجي، وتشمل طريقة ] استراحة زمنية، تمنع الخيوط من الانتظار إلى أجل غير مسمى عندما يستنفد المجمع، ويتيح أسلوب للمتصلين الإشارة إلى أن مورداً مكسوراً وينبغي إزالته بدلاً من إعادته.
الاتحاد والتأجير
أداء المجمع يعتمد بشدة على ثلاثة معايير تشكيلية:
- Core pool size] "mdash; The number of resources created at startup. Set this to the expected baseline concurrency level.
- Maximum pool size 'mdash; The upper bound on resources. Set this to the maximum number of concur operations the downstream system can handle.
- كم من الوقت ينتظر الخيط لمورد ما هذا سيكون أقل قليلاً من وقت التطبيق
ومن النقاط الرئيسية التي تبدأ فيها مجموعات الاتصالات بقاعدة البيانات حجم أساسي يساوي عدد سلاسل التطبيقات وحجم أقصى قدره 10-20 في المائة فوق القاع، وضبط فترات الانتظار وحجم المجمع العالق في الإنتاج، وتعديله تبعا لذلك.
ما وراء جافا: أحواض منفردة في لغات أخرى
وينطبق نفس النمط على النظم الإيكولوجية، رغم اختلاف تفاصيل التنفيذ استنادا إلى البدائيات المتعلقة بموافقة اللغات.
نوع السرب/ال Node.js Example
ويستخدم النودج حلقة أحداث بدلاً من الخيوط الصريحة، ولكن تجميع الموارد يظل حاسماً لإدارة وصلات قواعد البيانات، وعملاء حزب العمل الديمقراطي، والمناولة الخارجية للتحالف، ويحظى نمط العازب في نودج بالتأييد الطبيعي من خلال التقاط النماذج: وهو نموذج يُصدر نموذجاً يقوم بدور المجمّع كعنصر واحد للعملية برمتها.
import { createPool, Pool } from 'generic-pool';
const factory = {
create: async () => {
const client = await createDatabaseClient();
return client;
},
destroy: async (client) => {
await client.close();
}
};
const pool = createPool(factory, {
min: 5,
max: 20,
acquireTimeoutMillis: 3000,
idleTimeoutMillis: 30000
});
export default pool;
وهذه الوحدة الوحيدة التي تُعنى بتلقي كل استيراد من نفس مركز التجميع، وتعالج المكتبة مسألة التزامنة الداخلية، والتحقق من الموارد، ومنطق الإخلاء، ويستخدم المقترعون و للتفاعل مع المجمع.
وفي بيئات النودج، يوفر مجمع العازبات نفس الفوائد التي يوفرها في جافا: إدارة الموارد المركزية، وتخفيض النفقات العامة للوصلات، والشحن الخاضع للمراقبة في الخدمات في المراحل النهائية، والفرق الرئيسي هو أن عمليات الحجب تستبدل بأنماط الإسينك/الانتظار، وأن مناولة الوقت تصبح جزءا من دورة الحياة الوعودية.
الشلالات المشتركة وكيفية تجنبها
بل إن مجمعات العازبات التي تنفذ تنفيذا جيدا يمكن أن تفشل في الإنتاج، فهم أساليب الفشل أمر أساسي لبناء نظم مرنة.
Memory Leaks from Unreturned Resources
وتنشأ أكثر المسائل غموضا عندما يكتسب الخيط مورداً ولكنه لا يعيده، ويمكن أن يحدث ذلك بسبب الاستثناءات أو العودة المبكرة أو الرقابة على المطور، وعلى مر الزمن، تستنفد المجمعات إلى الصفر، وجميع الطلبات اللاحقة، سواء كانت قائمة أو متوقفة عن تقديمها.
- استخدام كتل (جوفا) أو (C#, TypeScript) لضمان الإفراج
- تعبئة الموارد في أجسام بديلة تعود تلقائياً على مقربة أو متصرفة
- تحديد أقصى وقت للاحتياز لمنع اللمسات إلى أجل غير مسمى
- تنفيذ الكشف عن تسرب الموارد عن طريق إجراء فحصات دورية على الصحة
هزّة الصوف والفشل في الإمساك
وعندما تصل المجموعة إلى أقصى حجمها، يجب أن تنتظر الطلبات الجديدة أو تفشل، وإذا كان نظام المراحل النهائية بطيئا، فإن الخيوط قد تحافظ على الموارد لفترة أطول، مما يزيد من حدة النقص، وهذا يمكن أن يخلق سلسلة من التعاقب: العوادم المجمعة، وطلبات الوقت، وإعادة نظر العملاء، وتشديد عمليات الفرز على المجمع.
To mitigate pool pleplesple, implement:
- سلوك سريع الفشل مع خطأ واضح بدلا من اللمس
- أنماط كسر الدائرة التي تتوقف عن إرسال الطلبات إلى أسفل المجرى
- التعبئة الديناميكية التي يمكن أن تنمو تحت حمولة ثقيلة وتتقلص خلال فترات العضلات
معالجة الموارد الأساسية
ويمكن أن تصبح موارد مثل وصلات قواعد البيانات ثابتة بسبب تقسيم الشبكات أو انقطاع جدران الحماية أو قطع ربطات عنقية جانب الخواديم، وتتسبب مجموعة تعود إلى الموارد الثابتة في حالات إخفاق متقطعة يصعب تشخيصها.
- تقييم الموارد قبل إعادتها إلى المقترض
- يمر الإخلاء الدوري الذي يختبر الموارد العالقة ويزيل الفاشلة منها
- وضع وقت عاطل يدمر تلقائيا الموارد التي كانت طويلة جدا
مؤشرات الأداء والأثر الحقيقي العالمي
وتؤكد دراسات إفرادية عديدة عن الإنتاج قيمة مجمعات الموارد التي يديرها كل واحد من الأفراد، ففي مثال واحد موثق توثيقا جيدا، أدى تطبيق الخدمات المالية إلى خفض مستوى قاعدة البيانات بنسبة 62 في المائة، وإلغاء فترات التجاوزات المتصلة بالوصلات عن طريق التحول من إنشاء وصلات فيما يتعلق بالطلب إلى مجمع واحد يديره كل واحد من الوحدات، يتكون من 15 من الحجم الأساسي و 30 من الحجم الأقصى.
ويأتي تحسين الأداء من مصدرين: أولا، إن إنشاء وصلة جديدة لقاعدة البيانات يستغرق عادة ما يتراوح بين 50 و200 ميلي ثانية، بينما يُستعير من مجمع يقل عن 1 مللي ثانية، ثانيا، يعمل المجمع كمستوي للحمّل الطبيعي، وييسر ارتفاع حركة المرور ويمنع أن تُغنى قاعدة البيانات عن طريق عواصف الاتصال.
ويبين تخصيص مجموعة من الروابط النموذجية التنفيذ ما يلي:
- متوسط وقت الاقتراض: 0.3 ملي ثاني (مُنَزَّع) ضد 85 مللي ثانية (الصلة الجديدة)
- 99 في المائة من وقت الاقتراض: 1.2 مليون ثانية (مُنَزَّع) مقابل 320 مللي ثانية (الصلة الجديدة)
- النفقات العامة لوحدة مكافحة الفساد: أقل بنسبة 40 في المائة بسبب انخفاض تغيير السياق وجمع القمامة
وتبين هذه الأرقام سبب كون التجميع نمطاً قياسياً في نظم النواتج العالية، ولماذا تعتبر إدارة أحادية هذه المجمعات أمراً حاسماً للحفاظ على الاتساق.
الاستنتاج: متى تستخدم مجموعة موارد (سينغلتون)
إن الجمع بين نمط العنبر الواحد وتجميع الموارد أداة معمارية قوية، ولكنه غير مناسب عالمياً، واستخدام هذا النهج في الحالات التالية:
- الموارد باهظة الثمن لتوليدها وتكلفة لتدميرها
- تحتاج العناصر المتعددة أو الخيوط إلى الوصول المنسق إلى مجموعة محدودة من الموارد
- تحتاج إلى رصد مركزي ومراقبة استخدام الموارد
- الاستفادة من نظم التوليد في أسفل المجرى من مستوى التحميل ومن تآكل الاتصالات
تجنب تجمعات العازبات عندما تكون الموارد رخيصة للخلق عندما يستخدم هيكلك بالفعل ميدوش أو سيارة خدمة تدير الاتصالات أو عندما تحتاج إلى عزل المستأجرين في نظام متعدد العوامل (حيث تكون المجاميع المنفصلة لكل مستأجر أفضل).
For further reading on production pooling strategies, consult the Oracle Java concurrency tutorial on thread pools and the Martin Fowler analysis of the singleton pattern in distributed systems. For practical connection pool tuning guidance, the Hika
وفي نهاية المطاف، فإن مجمع الموارد الوحيد هو نمط ثابت يمكن أن يؤدي، عند تنفيذه مع الاهتمام بالسلامة والتشكيل وطرائق الفشل، إلى تحسين كبير لاستقرار نظم الازدراء العالية وأدائها، وهو لبنة أساسية لأي نظم تصميم معمارية يجب أن تعالج آلاف الطلبات في الثانية مع الحفاظ على درجة من الكفاءة واستخدام الموارد على نحو يمكن التنبؤ به.