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

تقدير الأرقام بالحساب السريع

18 دقيقة الدرس 4 من 10

تقدير الأرقام بالحساب السريع

قبل أن ترسم أي مكوّن في تصميم النظام، تحتاج إلى معرفة حجم المشكلة التي تحلّها. تقدير الأرقام بالحساب السريع هو مهارة احتساب أعداد الرتب الكبيرة بسرعة — الاستعلامات في الثانية، ومساحة التخزين، وعرض النطاق الترددي، والذاكرة — باستخدام حسابات بسيطة وعدد محدود من الثوابت المحفوظة. في مقابلات تصميم الأنظمة وفي تخطيط الهندسة الحقيقية، تضع هذه الحسابات القيود التي تحكم كل قرار يليها.

لماذا تهمّ: النظام الذي يعالج 100 استعلام في الثانية يختلف اختلافًا جذريًا عن النظام الذي يعالج 100,000 استعلام في الثانية. الأول يعمل على خادم واحد، أما الثاني فيحتاج إلى موزّع أحمال، وكتلة ذاكرة تخزين مؤقت، وربما طابور رسائل. الخطأ في تقدير الحجم يعني تصميم نظام خاطئ من الأساس.

الأرقام المرجعية التي يجب حفظها

المُقدِّر الجيد لا يبحث عن الأرقام أثناء النقاش، بل يحتفظ بجدول صغير في ذاكرته:

  • مراسي زمن الاستجابة: ذاكرة L1 ~0.5 نانوثانية  |  قراءة RAM ~100 نانوثانية  |  قراءة SSD ~100 ميكروثانية  |  بحث HDD ~10 ميليثانية  |  RTT بين مراكز البيانات ~150 ميليثانية
  • مراسي الإنتاجية: SSD تسلسلي ~500 MB/ث  |  شبكة (1 Gbps) ~125 MB/ث  |  قراءة صف قاعدة بيانات ~1 ميكروثانية من المعالج
  • أحجام البيانات: حرف ASCII = 1 B  |  UUID = 36 B  |  تغريدة متوسطة ≈ 280 B  |  صورة مصغّرة ≈ 50 KB  |  صورة HD ≈ 3 MB  |  MP3 مدة 4 دقائق ≈ 4 MB  |  دقيقة فيديو 720p ≈ 50 MB
  • قوى الاثنين / تكافؤ العشرة: 210 ≈ 103 (1 KB)  |  220 ≈ 106 (1 MB)  |  230 ≈ 109 (1 GB)  |  240 ≈ 1012 (1 TB)
  • تحويلات الوقت: يوم واحد ≈ 86,400 ث ≈ 105 ث  |  شهر ≈ 2.5 × 106 ث  |  سنة ≈ 3 × 107 ث
التقريب سلوك صحيح. أنت تقدّر، لست تحرّر فاتورة. قرّب بجرأة — 86,400 تصبح 100,000، وتُبقي على عامل أمان 2-3× في النهاية. الدقة في هذه المرحلة تُضيّع الوقت وتُعطي ثقة زائفة.

الأعمدة الأربعة للتقدير

كل تقدير سريع يُنتج أربعة أرقام. لنمرّ على كل منها باستخدام مثال ملموس: خدمة تدوين مصغّر (مثل تويتر) بـ300 مليون مستخدم نشط شهريًا (MAU)، منهم 10% ينشرون مرة يوميًا والبقية يقرؤون فحسب.

1. الاستعلامات في الثانية (QPS)

QPS هو نبضة قلب نظامك. كل شيء — تجمّعات الخيوط، وحدود الاتصالات، ومحدّدات المعدل، وقدرة موزّع الأحمال — يُحجَّم وفقه.

معدل الكتابة (تغريدات جديدة):

الكتّاب النشطون يوميًا = 300 مليون × 10% = 30 مليون مستخدم الكتابات يوميًا = 30 مليون × 1 تغريدة = 30 مليون تغريدة/يوم معدل الكتابة = 30,000,000 / 86,400 ≈ 350 كتابة/ث ذروة الكتابة = 350 × 3 (عامل الذروة) ≈ 1,000 كتابة/ث

معدل القراءة: بافتراض أن كل قارئ نشط يُحمّل تايم لاين بـ20 تغريدة، مما يُولّد قراءة واحدة من قاعدة البيانات أو الكاش لكل تغريدة.

القراء النشطون يوميًا = 300 مليون × 50% (DAU تقريبي) = 150 مليون تحميلات التايم لاين/يوم = 150 مليون × 5 جلسات = 750 مليون قراءة/يوم معدل القراءة = 750,000,000 / 86,400 ≈ 8,700 قراءة/ث ذروة القراءة = 8,700 × 3 ≈ 26,000 قراءة/ث

قاعدة بيانات علائقية مُضبَّطة جيدًا تتحمّل ~10,000 قراءة بسيطة في الثانية. عند 26,000 قراءة في الثانية في الذروة، نعرف فورًا أننا نحتاج إلى نسخة قراءة أو طبقة كاش — وذلك قبل أن نناقش مخطط البيانات. هذه هي قوة هذا الحساب.

2. التخزين

تقدير التخزين يُخبرنا بنوع البنية التحتية للبيانات المطلوبة ومعدل النمو.

نص التغريدة (متوسط 140 حرف) = 140 B البيانات الوصفية (user_id، timestamp) = 30 B الإجمالي لكل تغريدة ≈ 170 B → نقرّب إلى 200 B التخزين اليومي (تغريدات جديدة) = 30 مليون × 200 B = 6 GB/يوم التخزين الشهري = 6 GB × 30 = 180 GB/شهر تخزين 5 سنوات (نص فقط) = 180 GB × 60 ≈ 10.8 TB

10.8 تيرابايت تتسع في مصفوفة NVMe واحدة كبيرة، لكن الآن أضف الوسائط: افترض أن 10% من التغريدات تحمل صورة بحجم 1 MB.

كتابات الصور/يوم = 30 مليون × 10% = 3 مليون صورة التخزين/يوم = 3 مليون × 1 MB = 3 TB/يوم صور 5 سنوات = 3 TB × 365 × 5 ≈ 5.5 PB

5.5 بيتابايت من الصور في خمس سنوات يُخبرنا فورًا أننا نحتاج إلى مخزن كائنات (S3 أو GCS أو ما شابه)، لا عمود BLOB في قاعدة بيانات علائقية. تخزين الوسائط يُفصل دائمًا عن التخزين الخاصة بالمعاملات عند الحجم الكبير.

3. عرض النطاق الترددي

يتحكّم النطاق الترددي في تكاليف البنية التحتية للشبكة، ومتطلبات CDN، وما إذا كانت منطقة واحدة كافية.

--- الوارد (الرفع) --- كتابات النص/يوم = 6 GB/يوم → 6 GB / 86,400 ث ≈ 70 KB/ث وارد (نص) رفع الصور/يوم = 3 TB/يوم → 3 TB / 86,400 ث ≈ 35 MB/ث وارد (وسائط) إجمالي الوارد ≈ 35 MB/ث --- الصادر (التقديم) --- التايم لاين: كل تحميل يعرض 20 تغريدة × 200 B نص = 4 KB نص/تحميل مع الصور المصغّرة (50 KB، 5 لكل تحميل): 5 × 50 KB = 250 KB/تحميل الإجمالي لكل تحميل ≈ 254 KB تحميلات/ث = 8,700 (متوسط QPS أعلاه) الصادر = 8,700 × 254 KB ≈ 2.2 GB/ث

2.2 GB/ث في المتوسط صادر يعني أننا نحتاج إلى CDN للوسائط، وعلى الأرجح نقاط حضور متعددة حول العالم. بطاقة شبكة واحدة بـ10 Gbps (~1.25 GB/ث) في مركز بيانات واحد ستكون مُشبَعة بالفعل — وهذا محرّك تصميمي آخر اكتشفناه من الرياضيات البحتة.

4. الذاكرة (حجم الكاش)

الكاش فعّال فقط عندما يتسع مجموعة البيانات الساخنة في الذاكرة العشوائية. السؤال هو: كم من الذاكرة نحتاج فعلًا؟

القاعدة الكلاسيكية 80/20: 20% من المحتوى يُولّد 80% من القراءات. خزّن هذه الـ20% في الكاش.

التغريدات المخزّنة يوميًا = 30 مليون التغريدات "الساخنة" (20%) = 6 مليون تغريدة الحجم لكل تغريدة في الكاش ≈ 300 B (نص + نفقات التسلسل) الذاكرة للتغريدات الساخنة = 6 مليون × 300 B = 1.8 GB/يوم الاحتفاظ ببيانات 3 أيام ساخنة = 1.8 × 3 = 5.4 GB → نقرّب إلى 10 GB (هامش أمان) حجم Redis المطلوب ≈ 10–20 GB RAM (يناسب r5.large بسهولة)

10–20 GB من ذاكرة Redis يمكنها استيعاب 26,000 QPS في الذروة بشكل شبه كامل، مما يُتيح لقاعدة البيانات التفرّغ للكتابات وقراءات إخفاق الكاش. هذه هي الفائدة المعمارية التي يُقدّمها تقدير الذاكرة.

تجميع كل شيء — مخطط ملخص التقدير

Back-of-the-Envelope Estimation Flow Users / Scale 300 M MAU QPS 1K wr / 26K rd Storage 6 GB/day text + media Bandwidth + Memory 2.2 GB/s out / 10 GB cache Insight: Need cache layer Insight: Need object store Insight: Need CDN + multi-region Estimation Pipeline: Inputs → Numbers → Architectural Insights Step 0 Step 1 Step 2 Step 3 & 4 Each estimation step produces a concrete architectural decision. Round aggressively; multiply by a 2–3× safety factor at the end.
مسار التقدير: بدءًا من حجم المستخدمين، يكشف كل خطوة حسابية قيدًا معماريًا مختلفًا.

دليل بصري لحجم البيانات

Data Size Ladder Data Size Ladder — Common Reference Points Smaller → Larger 1 B 1 character (ASCII) 1–50 KB Short text, JSON payload, thumbnail image 1–5 MB HD photo, 1-min audio, small video clip 1–10 GB App data/day (medium-scale service), DVD 1–100 TB Year of data for large service, data warehouse 1 PB+ Web-scale media storage (photos, video)
سلّم أحجام البيانات: حفظ هذه المراجع يجعلك قادرًا على تصنيف متطلبات التخزين والنطاق الترددي فورًا.

الأخطاء الشائعة وكيفية تجنّبها

  • نسيان عامل الذروة. متوسط QPS نادرًا ما يُعطّل الأنظمة. اضرب دائمًا في 2-5× لمحاكاة حركة المرور في الذروة (الأحداث، اللحظات الفيروسية، مهام cron منتصف الليل).
  • إهمال نفقات النسخ المتماثل. إذا كنت تكتب إلى قاعدة بيانات رئيسية تتضاعف إلى نسختين، فتضخيم الكتابة هو 3×. خذ هذا في الحسبان في تقديرات التخزين والإدخال/الإخراج.
  • خلط أرقام الضغط وغير المضغوط. كن صريحًا: "3 TB/يوم غير مضغوط؛ بنسبة ضغط 3:1، نخزّن ~1 TB/يوم." لا تخلطهما دون إشارة.
  • معاملة DAU = MAU. عادةً DAU هو 20-50% من MAU للتطبيقات الاستهلاكية. استخدام MAU للحسابات اليومية ينفّخ كل رقم.
  • عدم ذكر الافتراضات. في المقابلات والوثائق الهندسية، اذكر كل افتراض صراحةً — "أفترض أن 10% من المستخدمين ينشرون مرة واحدة يوميًا" — حتى يتمكن المراجعون من التشكيك في المدخلات، لا في حساباتك.
التقديرات فرضيات وليست حقائق. أنماط حركة المرور الحقيقية وسلوك المستخدم وتوزيعات البيانات تختلف دائمًا تقريبًا عن التقديرات. عامل أرقامك كمدخلات لقرارات معمارية وكمحفّزات لتنبيهات السعة — وليس أهدافًا دقيقة. ابنِ المراقبة والتوسّع التلقائي حتى يتكيّف النظام ذاتيًا عندما يختلف الواقع عن التقدير.

التقدير في المقابلة

في مقابلة تصميم أنظمة مدتها 45 دقيقة، خصّص 5-8 دقائق للتقدير. الهدف ليس الحصول على إجابة رياضية مثالية — بل إظهار تفكير منظّم. نمط جيد للاتباع:

  1. اذكر مدخل الحجم: "مع 300 مليون MAU و10% ينشرون يوميًا…"
  2. اشتق QPS الكتابة ثم QPS القراءة (بافتراض نسبة قراءة/كتابة).
  3. قدّر التخزين لـ5 سنوات. لاحظ ما إذا كانت الوسائط تستلزم مخزن كائنات.
  4. تحقق من النطاق الترددي. لاحظ متطلب CDN إذا تجاوز الصادر ~1 GB/ث.
  5. قدّر حجم الكاش. اذكر افتراض نسبة البيانات الساخنة.
  6. لخّص: "إذن نتحدث عن ~1,000 كتابة في الثانية، 26,000 قراءة في الثانية، ~10 TB تخزين نصي، ~5 PB وسائط على مدى 5 سنوات، 2+ GB/ث صادر، وكاش 10-20 GB."

هذا الملخص من ستة أسطر يُخبر المهندس ذا الخبرة بما يجب أن تشتمل عليه البنية قبل رسم أي مكوّن.