منهجية التصميم

صمّم خدمة اختصار روابط

يبدو لعبة: تلصق رابطاً طويلاً فتحصل على قصير. لكن داخل هذه اللعبة تسكن التقديرات والـhashing والـcaching وقرار إعادة توجيه يساوي مالاً حقيقياً. بعد ساعة من الآن ستستطيع تصميمه على السبورة دون أن ترمش.

الخطوة 1 — المتطلبات
  1. وظيفية: أعطِ رابطاً طويلاً فتحصل على رمز قصير؛ وأعطِ الرمز فتُعاد توجيهك إلى الرابط الطويل بسرعة.
  2. الحجم: 100 مليون رابط جديد يومياً، ونسبة القراءة إلى الكتابة ≈ 10:1 — عمليات إعادة التوجيه تفوق الإنشاء بمراحل.
  3. الاحتفاظ: خمس سنوات. غير وظيفية: يجب أن تكون إعادة التوجيه شبه فورية، وألا تفقد الخدمة أي ربط بين رمز ورابط.
الخطوة 2 — ظرف الورقة

الكتابات: 100 مليون يومياً ÷ 86,400 ≈ 1,160 في الثانية — تافهة لقاعدة بيانات واحدة. القراءات: عشرة أضعاف ≈ 11,600 في الثانية — تستحق cache لكنها ليست مخيفة. التخزين: ‏~500 بايت للسجل × 100 مليون ≈ 43 GB يومياً؛ وعلى مدى 5 سنوات ≈ 78 TB. الخلاصة: مجموعة صغيرة من خوادم web عديمة الحالة، وقاعدة بيانات قوية واحدة، وcache أمامها. لا حاجة للتقسيم (sharding) — بعد.

الخطوة 3 — الرسم

الـAPI نقطتا وصول: ‏POST /api/shorten يستقبل رابطاً طويلاً ويعيد رمزاً؛ و‏GET /{code} يبحث عن الرمز ويصدر إعادة توجيه. نموذج البيانات جدول واحد: code وlongUrl وcreatedAt وexpiresAt. وخلف الـAPI: خوادم web عديمة الحالة، وcache يحتفظ بأسخن الرموز، وقاعدة بيانات واحدة تملك الحقيقة. هذا هو النظام كله.

توليد الرمز، بصدق

الخيار الأول: عدّاد فريد (من قاعدة البيانات أو خدمة مخصصة) يُرمَّز بنظام base62 — الأرقام والحروف الصغيرة والكبيرة. سبعة أحرف تعطي ‏62⁷ ≈ 3.5 تريليون رمز، بلا تصادمات إطلاقاً، ورموز قصيرة. الخيار الثاني: طبّق دالة hash على الرابط الطويل (مثل MD5) واقتطع أول 7 أحرف — لا عدّاد مركزي، لكن التصادمات ممكنة، فيجب فحص قاعدة البيانات وإعادة المحاولة بلاحقة. العدّاد بسيط لكنه مركزي؛ والـhash عديم الحالة لكنه يحتاج معالجة تصادمات. كلاهما قابل للدفاع — والدفاع هو الهدف.

إعادة التوجيه قرار تجاري

إعادة التوجيه 301 دائمة — المتصفحات تخزنها وقد لا تسأل خادمك مرة أخرى: حملك ينخفض، لكن تحليلات النقرات تصاب بالعمى. أما 302 فمؤقتة — كل نقرة تمر بك: تعدّ كل شيء، وتحمل الحمل كله. لا أحدهما خطأ؛ اختر عن قصد. إن كان المنتج هو التحليلات، فالاختيار 302. وإن كان مجرد أداة توجيه صرفة، فـ301 هدية. وأيهما اخترت، يجلس الـcache بين الـload balancer وقاعدة البيانات، محتفظاً بأسخن 20% من الرموز التي تولّد 80% من إعادات التوجيه.

كتابة — إنشاء رابط قصيرالعميلAPIيتحقق وينسّقمولّد الأكوادbase62Databasecode → long URLPOST /shortenاطلب كودًاخزّنقراءة — فتح رابط قصيرالعميلAPICacheالروابط الساخنةDatabaseGET /abc123ابحثعند الـ miss302 redirect ← الرابط الطويل
مسار الكتابة: POST ← توليد الرمز ← قاعدة البيانات. مسار القراءة: GET ← الـcache ← (غياب) ← قاعدة البيانات ← إعادة توجيه 302.
المبدأ

نظام صغير، وكل فكرة كبيرة حاضرة فيه: التقدير أخبرك بالشكل، والـhashing صنع الرموز، والـcache حمل القراءات، والمقايضات — العدّاد مقابل الـhash، و301 مقابل 302 — حُسمت بالحجج، لا بإجابات جاهزة.

تحقّق سريع

لماذا لا تحتاج خدمة اختصار روابط تستقبل 100 مليون كتابة يومياً إلى sharding — وما الشيء الوحيد الذي سيغيّر رأيك؟ (1,160 كتابة/ثانية و78 TB على خمس سنوات تسعهما قاعدة بيانات واحدة مجهزة جيداً مع تكرير؛ تقسّم عندما تتجاوز الكتابات في الثانية أو الحجم الكلي قدرة جهاز واحد — الأرقام هي التي تقرر، لا الإحساس.)

الخلاصة

نفّذ المنهجية من البداية للنهاية ويصبح «سؤال المقابلة الصعب» روتيناً: حدّد نقطتي وصول، قدّر 1,160 كتابة و11,600 قراءة، ارسم أربعة صناديق، ثم صبّ طاقتك حيث تسكن الحجج الحقيقية — توليد الرموز ودلالات إعادة التوجيه.

منهجية التصميم