أساسيات تصميم الأنظمة

مسائل تصميم الأنظمة الكلاسيكية

5 دقيقة للقراءة

هذه المسائل الخمس تظهر بشكل متكرر في المقابلات. معرفة حلولها تبني الذاكرة العضلية لمعالجة أي مسألة تصميم.

1. مختصر الروابط (مثل bit.ly)

المتطلبات: توليد روابط قصيرة، إعادة التوجيه للأصلي، التعامل مع حركة قراءة عالية.

قرارات التصميم الرئيسية:

المكوّنالاختيارلماذا
توليد المعرّفاتترميز Base62 (a-z, A-Z, 0-9)62^7 = 3.5 تريليون كود فريد
قاعدة البياناتNoSQL (DynamoDB)بحث مفتاح-قيمة بسيط، إنتاجية عالية
الكاشRedisقاعدة 80/20: 20% من الروابط تحصل على 80% من الحركة
البنيةكثيفة القراءةنسبة قراءة:كتابة 100:1

المسار:

إنشاء: العميل → API → توليد المعرّف → التخزين في DB → إعادة الرابط القصير
إعادة التوجيه: العميل → CDN/كاش → DB (عند الفقدان) → إعادة توجيه 301

2. محدد المعدل (Rate Limiter)

المتطلبات: تحديد طلبات API لكل مستخدم/IP لمنع الإساءة.

الخوارزميات:

الخوارزميةكيف تعملالمزاياالعيوب
Token Bucketإضافة رموز بمعدل ثابت، كل طلب يستهلك رمزًايسمح بالانفجارات، سلسيحتاج ضبط
Sliding Window Logتتبع أوقات الطلبات في نافذةدقيقكثيف الذاكرة
Sliding Window Counterجمع عدادات النافذة الثابتة مع حساب منزلقذاكرة منخفضة، دقيق كفايةتقريبي
Fixed Windowعدّ الطلبات في نوافذ زمنية ثابتةبسيطمشكلة انفجار الحدود

أين يوضع: بوابة API أو كوسيط. استخدم Redis لتحديد المعدل الموزع عبر خوادم متعددة.

3. نظام المحادثة (مثل WhatsApp/Slack)

المتطلبات: مراسلة 1:1، محادثات جماعية، حالة الاتصال، سجل الرسائل.

المكونات الرئيسية:

العملاء ↔ خوادم WebSocket ↔ طابور رسائل (Kafka)
                              مخزن الرسائل
                              (Cassandra)
القرارالاختيارلماذا
البروتوكولWebSocketثنائي الاتجاه، فوري، اتصال مستمر
تخزين الرسائلCassandraكثيف الكتابة، بيانات سلسلة زمنية، تقسيم بـ chat_id
تسليم الرسائلدفع (WebSocket) + سحب (عند إعادة الاتصال)تسليم موثوق
حالة الاتصالRedis مع TTLبحث سريع، انتهاء تلقائي
رسائل المجموعاتFan-out عند الكتابة (مجموعات صغيرة) أو عند القراءة (مجموعات كبيرة)مفاضلة: تضخم الكتابة مقابل زمن القراءة

4. موجز الأخبار (مثل Twitter/Facebook)

المتطلبات: المستخدمون ينشرون محتوى، المتابعون يرون المنشورات بترتيب زمني/مرتب.

نهجان:

النهجكيفالمزاياالعيوب
Fan-out عند الكتابةعند النشر، ادفع لموجز جميع المتابعينقراءة سريعةكتابة بطيئة للمشاهير (ملايين المتابعين)
Fan-out عند القراءةعند فتح الموجز، اسحب من المتابَعينكتابة سريعةقراءة بطيئة، يحتاج دمج
هجينFan-out عند الكتابة للعاديين، عند القراءة للمشاهيرمتوازنأكثر تعقيدًا

البنية:

خدمة النشر → خدمة Fan-out → كاش الموجز (Redis)
                                خدمة الموجز → العميل

5. خدمة الإشعارات

المتطلبات: إرسال إشعارات دفع/بريد/SMS بموثوقية على نطاق واسع.

التصميم:

حدث المشغّل → خدمة الإشعارات → طابور الأولوية
                                ┌───────┼───────┐
                                ↓       ↓       ↓
                              دفع    بريد    SMS
                             (APNs/  (SES)  (Twilio)
                              FCM)

اعتبارات رئيسية:

  • إزالة التكرار: مفاتيح عدم التكرار لمنع الإشعارات المكررة
  • تحديد المعدل: لا تُغرق المستخدمين
  • الأولوية: الإشعارات العاجلة تتجاوز الطابور
  • إعادة المحاولة: تراجع أسّي مع طابور رسائل ميتة للفشل
  • القوالب: إدارة قوالب مركزية للاتساق

قالب إجابة تصميم الأنظمة

عند شرح أي تصميم، اتبع هذا الهيكل:

  1. "النظام يحتاج..." (المتطلبات)
  2. "على هذا النطاق، هذا يعني..." (التقدير)
  3. "البنية عالية المستوى هي..." (المخطط)
  4. "لـ [المكوّن]، سأختار [X] لأن..." (قرارات مبررة)
  5. "المفاضلة هنا هي..." (تُظهر النضج)
  6. "للتعامل مع [الحالة الحدية]، سنقوم..." (يُظهر العمق)

التالي: لنغطي أنماط التوسع والموثوقية -- المواضيع التي تميّز المرشحين ذوي الخبرة. :::

اختبار

اختبار الوحدة 4: أساسيات تصميم الأنظمة

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.