أساسيات تصميم الأنظمة
اللبنات الأساسية
كل نظام واسع النطاق يُبنى من نفس المكونات الأساسية. معرفة هذه اللبنات ومتى تستخدم كل واحدة منها أمر ضروري لمقابلات تصميم الأنظمة.
موزعات الحمل (Load Balancers)
توزع حركة المرور عبر خوادم متعددة لمنع أي خادم واحد من أن يصبح عنق زجاجة.
| النوع | الطبقة | كيف يعمل | حالة الاستخدام |
|---|---|---|---|
| L4 (النقل) | TCP/UDP | التوجيه بالـ IP والمنفذ | إنتاجية عالية، توجيه بسيط |
| L7 (التطبيق) | HTTP | التوجيه بالـ URL والرؤوس والكوكيز | توجيه قائم على المحتوى، إنهاء SSL |
الخوارزميات: Round Robin، أقل اتصالات، تجزئة IP، Round Robin الموزون
التخزين المؤقت (Caching)
تخزين البيانات المتكررة الوصول في تخزين سريع (الذاكرة) لتقليل حمل قاعدة البيانات وزمن الاستجابة.
استراتيجيات التخزين المؤقت:
| الاستراتيجية | كيف تعمل | الأفضل لـ |
|---|---|---|
| Cache-Aside | التطبيق يفحص الكاش أولاً، يحمّل من DB عند الفقدان | عام، كثيف القراءة |
| Write-Through | الكتابة في الكاش و DB معًا | اتساق البيانات |
| Write-Back | الكتابة في الكاش، كتابة غير متزامنة لـ DB | كثيف الكتابة، خطر فقدان بيانات |
| Read-Through | الكاش يحمّل من DB بشفافية | البساطة |
نمط Cache-Aside:
1. التطبيق يفحص Redis → إصابة؟ أعد البيانات
2. فقدان؟ استعلم من قاعدة البيانات
3. خزّن النتيجة في Redis مع TTL
4. أعد البيانات للعميل
الكاش الشائع: Redis (الأكثر شيوعًا في المقابلات)، Memcached
نصيحة للمقابلات: اذكر دائمًا إبطال الكاش كتحدٍ. إنها من أصعب المشاكل في الأنظمة الموزعة.
قواعد البيانات
SQL مقابل NoSQL
| الميزة | SQL (PostgreSQL, MySQL) | NoSQL (MongoDB, DynamoDB) |
|---|---|---|
| المخطط | ثابت، منظم | مرن، بدون مخطط |
| التوسع | عمودي (ترقية) | أفقي (توسعة) |
| الربط (Joins) | دعم أصلي | محدود أو يدوي |
| المعاملات | متوافق مع ACID | اتساق نهائي (عادةً) |
| الأفضل لـ | استعلامات معقدة، علاقات | إنتاجية عالية، بيانات مرنة |
توسيع قواعد البيانات
النسخ (Replication): نسخ البيانات لخوادم متعددة
- سيد-تابع: كاتب واحد، قارئون كثر
- سيد-سيد: كتّاب متعددون (حل نزاعات معقد)
التجزئة (Sharding): تقسيم البيانات عبر قواعد بيانات متعددة
- قائم على النطاق: معرّفات المستخدم 1-1M على القسم 1، 1M-2M على القسم 2
- قائم على التجزئة: hash(user_id) % عدد_الأقسام
- التجزئة المتسقة: تقلل إعادة التوزيع عند إضافة/إزالة أقسام
طوابير الرسائل (Message Queues)
فصل الخدمات عن طريق التواصل عبر طابور بدلاً من الاستدعاءات المباشرة.
| النظام | نقاط القوة | حالة الاستخدام |
|---|---|---|
| Kafka | إنتاجية عالية، قائم على السجل، إعادة التشغيل | بث الأحداث، السجلات |
| RabbitMQ | توجيه مرن، إشعارات تأكيد | طوابير المهام، RPC |
| SQS | مُدار، بسيط، موثوق | سير عمل AWS الأصلي |
متى تستخدم: المعالجة غير المتزامنة، التعامل مع ذروة الحمل، فصل الخدمات، البنية القائمة على الأحداث.
CDN (شبكة توصيل المحتوى)
تقديم المحتوى الثابت (الصور، CSS، JS) من خوادم قريبة جغرافيًا من المستخدمين.
- Push CDN: ترفع المحتوى إلى CDN (جيد للمواقع الثابتة)
- Pull CDN: CDN يجلب من المصدر عند أول طلب ثم يخزّن (جيد للمحتوى الديناميكي)
تصميم API
| الأسلوب | الشكل | الأفضل لـ |
|---|---|---|
| REST | HTTP + JSON | عمليات CRUD العامة، APIs بسيطة |
| GraphQL | نقطة نهاية واحدة، لغة استعلام | احتياجات بيانات معقدة، تطبيقات الهاتف |
| gRPC | Protocol Buffers, HTTP/2 | تواصل الخدمات المصغّرة، زمن منخفض |
جدول مرجعي للبنات البناء
| الحاجة | الحل |
|---|---|
| توزيع حركة المرور | موزع الحمل |
| تقليل زمن الاستجابة | الكاش (Redis) |
| تخزين بيانات منظمة | قاعدة بيانات SQL |
| تخزين بيانات غير منظمة | قاعدة بيانات NoSQL |
| معالجة غير متزامنة | طابور رسائل |
| تقديم محتوى ثابت عالميًا | CDN |
| البحث النصي | Elasticsearch |
| معرّفات فريدة على نطاق واسع | Snowflake ID / UUID |
التالي: لنطبق هذه اللبنات على مسائل تصميم الأنظمة الكلاسيكية. :::