مقابلة تصميم الأنظمة: صمّم WhatsApp
«صمّم WhatsApp» يختبر التسليم في الوقت الفعلي على نطاق ضخم، والتخزين الدائم للرسائل، والحضور (متصل/آخر ظهور)، ومسألة إدارة الاتصالات المتمثلة في إبقاء مئات الملايين من الأجهزة متصلة. وكما هو الحال دائمًا، يريد القائم بالمقابلة منطقك ومقايضاتك، لا نسخة من النظام الحقيقي.
تقدّم بشكل منهجي: وضّح المتطلبات، قدّر الحجم، صمّم مسار الاتصال والتسليم، قرر كيفية تخزين الرسائل، ثم تعامل مع الدردشة الجماعية والحالات الصعبة مثل التسليم دون اتصال والترتيب. يتبع الشرح أدناه هذا المسار.
1. توضيح المتطلبات
حدّد النطاق أولًا. الجزء الأساسي هو المراسلة الفردية (واحد إلى واحد) مع تسليم موثوق؛ وضّح إن كانت الدردشة الجماعية والوسائط والتشفير التام بين الطرفين داخل نطاق هذه الجولة.
- وظيفي: إرسال/استقبال الرسائل، إشعارات التسليم والقراءة، الحضور عبر الإنترنت، الدردشة الجماعية، التسليم دون اتصال عندما يكون المستقبل غير متصل.
- غير وظيفي: كمون منخفض، توافر عالٍ، ديمومة (عدم فقدان الرسائل)، ترتيب داخل المحادثة الواحدة.
- يحتاج إلى توضيح: التشفير التام بين الطرفين ومعالجة الوسائط — اذكرهما ثم حدد بوضوح إن كانا داخل النطاق أم لا.
2. تقدير الحجم
حدّد الأرقام التي توجّه التصميم. افترض نحو 2 مليار مستخدم وعشرات المليارات من الرسائل يوميًا؛ وهذا يعني مئات آلاف الرسائل في الثانية في وقت الذروة، ومئات الملايين من الأجهزة المتصلة في آنٍ واحد — تصبح إدارة الاتصالات مسألة جوهرية.
3. مسار الاتصال والتسليم
تحتاج المراسلة إلى اتصال دائم، لا إلى استقصاء طلب/استجابة. تحتفظ الأجهزة باتصال WebSocket مفتوح مع خادم بوابة (gateway). يجب أن يعرف مكوّن مركزي أي بوابة تحتفظ حاليًا باتصال كل مستخدم حتى يمكن توجيه الرسالة إلى الخادم الصحيح.
- بوابة WebSocket: تحافظ على اتصالات الأجهزة النشطة، وتتعامل مع الإرسال/الاستقبال.
- سجل الجلسة/الحضور: يربط المستخدم بخادم البوابة الحالي (مثل Redis)، ويُحدَّث عند الاتصال/الانقطاع.
- توجيه الرسائل: تبحث بوابة المرسل عن بوابة المستقبل وتُعيد توجيه الرسالة؛ وإذا كان غير متصل، توضع الرسالة في قائمة انتظار.
4. تخزين الرسائل والتسليم دون اتصال
يجب أن تنجو الرسائل من انقطاع المستقبل. خزّن كل رسالة بشكل دائم، وتتبّع حالة التسليم لكل مستقبل؛ سلّمها فورًا إذا كان المستقبل متصلًا، وإلا خزّنها وأعد توجيهها عند إعادة الاتصال.
نموذج وصول مكثف الكتابة، يُفتاح بحسب المحادثة، يفضّل مخزنًا واسع الأعمدة (wide-column) مثل Cassandra (إنتاجية كتابة عالية، توسّع أفقي) على قاعدة بيانات علائقية واحدة. وبعد تأكيد تسليم رسالة إلى جميع المستقبلين، يمكن حذفها أو انتهاء صلاحيتها، لأن WhatsApp لا يحتفظ بالرسائل المُسلَّمة على الخادم إلى أجل غير محدد.
5. الدردشة الجماعية
المراسلة الجماعية هي عملية تفرّع (fan-out): يتحول إرسال واحد إلى N عملية تسليم. بالنسبة إلى أحجام المجموعات المعتادة، يكون التفرّع عند الكتابة (fan-out-on-write) — أي الدفع إلى مسار تسليم كل عضو — بسيطًا وسريع القراءة. لاحظ المقايضة: المجموعات الكبيرة جدًا تجعل التفرّع عند الكتابة مكلفًا، ولهذا تُعد مجموعات البث الضخمة مسألة تصميم مختلفة.
6. مقايضات يجب التصريح بها
اختم بذكر التوترات: الترتيب (أرقام تسلسل لكل محادثة مقابل ترتيب عام)، الاتساق مقابل التوافر في إشعارات التسليم (الاتساق النهائي مناسب لـ «آخر ظهور»، وأقوى بالنسبة للتسليم)، والتفرّع عند الكتابة مقابل عند القراءة للمجموعات. ذكر هذه الأمور بوضوح هو ما يجعل الإجابة على مستوى أعلى.
تدرّب على تصميم نظام WhatsApp بمساعدة فورية
يمكن لـمساعد مقابلات تصميم الأنظمة من Natively أن يحافظ على تنظيمك خلال جولة مباشرة — يقترح البُعد التالي الذي يجب تغطيته ويعرض المقايضات في الوقت الفعلي، كل ذلك على جهازك الخاص.
