أساسيات تصميم الأنظمة
التصميم للتوسع والموثوقية
التوسع والموثوقية هما ما يفصل المشاريع التجريبية عن أنظمة الإنتاج. يتوقع المقابلون أن تناقش هذه المواضيع بشكل طبيعي، خاصة في المستويات L4+.
التوسع الأفقي مقابل العمودي
| النهج | كيف | المزايا | العيوب |
|---|---|---|---|
| العمودي (ترقية) | آلة أكبر (CPU أكثر، RAM أكثر) | بسيط، لا تغييرات في الكود | حدود العتاد، نقطة فشل واحدة |
| الأفقي (توسعة) | آلات أكثر | لا حدود للعتاد، تحمل الأخطاء | تعقيد الكود، اتساق البيانات |
قاعدة عامة: ابدأ عموديًا للبساطة، انتقل أفقيًا عند الوصول للحدود. في المقابلات، صمم دائمًا للتوسع الأفقي.
استراتيجيات تجزئة قاعدة البيانات
| الاستراتيجية | كيف تعمل | الأفضل لـ |
|---|---|---|
| قائمة على النطاق | التقسيم بنطاق القيم (A-M, N-Z) | بيانات السلسلة الزمنية، الوصول التسلسلي |
| قائمة على التجزئة | hash(key) % عدد_الأقسام | التوزيع المتساوي |
| التجزئة المتسقة | حلقة افتراضية، تقليل إعادة التوزيع | التوسع الديناميكي |
| جغرافية | التقسيم حسب المنطقة | التطبيقات العالمية |
التعمق في التجزئة المتسقة:
التجزئة التقليدية (hash % N) تنكسر عند إضافة/إزالة خوادم -- تقريبًا كل المفاتيح تُعاد تعيينها. التجزئة المتسقة تستخدم حلقة افتراضية حيث يُعاد توزيع K/N فقط من المفاتيح (K = إجمالي المفاتيح، N = الخوادم).
الحلقة الافتراضية:
الخادم A ──── الخادم B
│ │
│ المفاتيح تُربط │
│ لأقرب خادم │
│ باتجاه الساعة │
الخادم D ──── الخادم C
البنية القائمة على الأحداث
بدلاً من الطلب-استجابة المتزامن، استخدم الأحداث للربط المرن:
إجراء المستخدم → منتج الأحداث → ناقل الأحداث (Kafka) → مستهلكو الأحداث
├── خدمة التحليلات
├── خدمة الإشعارات
└── مفهرس البحث
الفوائد: الخدمات مستقلة، يمكن توسيعها منفصلة، أسهل لإضافة مستهلكين جدد.
أنماط الموثوقية
قاطع الدائرة (Circuit Breaker)
يمنع الفشل المتسلسل عندما تكون خدمة المصب غير سليمة:
| الحالة | السلوك |
|---|---|
| مغلق | تشغيل عادي، الطلبات تمر |
| مفتوح | الخدمة مكتشفة كمعطلة، الطلبات تفشل فورًا |
| نصف مفتوح | السماح بطلبات محدودة لاختبار التعافي |
فحوصات الصحة
| النوع | ما يفحصه | التكرار |
|---|---|---|
| الحيوية | هل العملية تعمل؟ | كل 10 ثوانٍ |
| الجاهزية | هل يمكنها التعامل مع الطلبات؟ | كل 5 ثوانٍ |
| العميق | هل التبعيات سليمة؟ | كل 30 ثانية |
إعادة المحاولة مع التراجع الأسّي
المحاولة 1: انتظر 1 ثانية
المحاولة 2: انتظر 2 ثانية
المحاولة 3: انتظر 4 ثوانٍ
المحاولة 4: انتظر 8 ثوانٍ (+ ارتعاش عشوائي)
استسلم بعد أقصى محاولات → طابور الرسائل الميتة
SLOs و SLIs و SLAs
| المصطلح | التعريف | مثال |
|---|---|---|
| SLI (مؤشر مستوى الخدمة) | المقياس الذي تقيسه | 99.2% من الطلبات تكتمل في أقل من 200ms |
| SLO (هدف مستوى الخدمة) | الهدف الذي تسعى إليه | توفر 99.9% شهريًا |
| SLA (اتفاقية مستوى الخدمة) | عقد مع العملاء | وقت تشغيل 99.95% أو إصدار رصيد |
التسعات:
| التوفر | التعطل/سنة | التعطل/شهر |
|---|---|---|
| 99% | 3.65 يوم | 7.3 ساعة |
| 99.9% | 8.76 ساعة | 43.8 دقيقة |
| 99.99% | 52.6 دقيقة | 4.38 دقيقة |
| 99.999% | 5.26 دقيقة | 26.3 ثانية |
CQRS (فصل مسؤولية الأوامر والاستعلامات)
فصل نماذج القراءة والكتابة عندما تكون لها متطلبات مختلفة:
مسار الكتابة: API → معالج الأوامر → DB الكتابة (PostgreSQL)
↓ (حدث)
مسار القراءة: API → معالج الاستعلامات → DB القراءة (Elasticsearch/Redis)
متى تستخدم: أنماط القراءة والكتابة مختلفة جدًا (مثلاً: وسائل التواصل: كتابات قليلة، قراءات كثيرة باستعلامات معقدة).
نصيحة للمقابلات: عند مناقشة أي تصميم، اذكر دائمًا: "ماذا يحدث عندما يفشل هذا المكوّن؟" هذا يُظهر أنك تفكر في الموثوقية بشكل استباقي.
مع تغطية تصميم الأنظمة، لننتقل إلى إتقان جولة البرمجة -- المهارات العملية للأداء تحت الضغط. :::