اتخطّى للمحتوى

المرحلة 04 · الاحتراف والإنترفيودرس 18 من 219 دقيقة قراءةآخر تحديث:

Lesson 18 / 21

System Designتصميم e-commerce.

لو اتسألت "صمّم نظام e-commerce من الصفر" — ده الـ artifact بتاعك. المنهجية الكاملة: إزاي تبدأ، المكوّنات المعمارية، المقايضات، وإزاي توسّع لملايين المستخدمين. مع ربط بـ Magento حيث يفيد.

● Architecture Scaling Trade-offs Methodology

عشان تصمّم نظام e-commerce في الإنترفيو، ابدأ بتوضيح المتطلبات وتقدير الحجم، وبعدين ارسم المعمارية: load balancer، و application servers، و database بنسخ للقراءة، و cache، و queue للشغل غير المتزامن، و search engine. بعدها ناقش التوسّع ومشاكل التجارة الإلكترونية زي تضارب المخزون والدفع المكرّر والمقايضات بين الحلول.

// أهم نصيحة قبل ما تبدأ في System Design، مفيش إجابة صح واحدة. المُقابِل بيقيّم منهجيتك ومقايضاتك، مش حفظك. ابدأ دايمًا بالأسئلة (توضيح المتطلبات)، فكّر بصوت عالي، واشرح "ليه اخترت كذا" مش بس "إيه اللي هعمله". ده اللي بيميّز الـ senior.
01

المنهجية — إزاي تبدأ

الإطار اللي بتمشي عليه في أي سؤال system design. احفظ الترتيب ده.

اتبع الترتيب ده دايمًا

أي سؤال system design بيتحل بنفس الإطار. لو مشيت عليه بترتيب، بتبان منظّم ومحترف.

  • وضّح المتطلبات — اسأل أسئلة. مين المستخدمين؟ إيه الـ features الأساسية؟ الحجم؟
  • قدّر الحجم — عدد المستخدمين، الطلبات في الثانية، حجم البيانات.
  • ارسم المعمارية العامة — المكوّنات الرئيسية وإزاي بتتكلم.
  • غُص في التفاصيل — الـ DB schema، الـ APIs، المكوّن الأصعب.
  • ناقش المقايضات والتوسّع — bottlenecks، caching، scaling، failure.
i
القاعدة الذهبية: اقضِ أول 5 دقايق في الأسئلة مش الرسم. اللي بيبدأ يرسم على طول من غير ما يفهم المطلوب، بيبان متسرّع.
• • •
02

توضيح المتطلبات

أهم خطوة. تفصل المتطلبات لنوعين: وظيفية وغير وظيفية.

FUNCTIONALوظيفية

  • تصفّح المنتجات
  • بحث وفلترة
  • سلة وطلبات
  • دفع (payment)
  • حسابات المستخدمين
  • إدارة المخزون

NON-FUNCغير وظيفية

  • توفّر عالي (availability)
  • سرعة (latency)
  • قابلية التوسّع
  • اتساق البيانات
  • أمان (المدفوعات)
  • تحمّل الضغط
ليه التقسيم ده مهم

الـ وظيفية بتحدد "النظام بيعمل إيه". الـ غير وظيفية بتحدد "بيعمله كويس إزاي" — وهي اللي بتشكّل المعمارية فعليًا. مثلًا "توفّر عالي" بيفرض redundancy، و"سرعة" بتفرض caching.

!
في e-commerce، ركّز على مقايضة مهمة: الاتساق vs التوفّر. المخزون محتاج اتساق قوي (مبيعش حاجة مش موجودة)، بس عرض المنتجات ممكن يقبل اتساق أضعف مقابل سرعة.
• • •
03

التقديرات (Scale)

تقدير الأرقام بيوجّه قراراتك المعمارية. مش لازم دقيق، بس منطقي.

مثال تقدير

افترض 10 مليون مستخدم، 1 مليون نشط يوميًا. لو كل واحد بيتصفّح 20 صفحة، ده ~20 مليون طلب يوميًا. اقسم على 86400 ثانية = ~230 طلب/ثانية متوسط، والذروة ممكن 5x = ~1000+ طلب/ثانية.

  • Read vs Write ratio: في e-commerce، القراءة أكتر بكتير (تصفّح) من الكتابة (شراء). نسبة زي 100:1 شائعة.
  • الخلاصة المعمارية: النظام read-heavy — يعني الـ caching والـ read replicas هيكونوا محوريين.
  • حجم البيانات: ملايين المنتجات × بياناتها + الطلبات + المستخدمين = تقدير للـ storage.
i
الهدف من التقدير مش الرقم الدقيق — الهدف إنك تكتشف إن النظام read-heavy، وده بيوجّه كل قراراتك بعد كده ناحية الـ caching والقراءة السريعة.
• • •
04

المعمارية عالية المستوى

الرسمة اللي بترسمها للمُقابِل. المكوّنات الرئيسية وتدفّق الطلب.

Client
Web / Mobile
Edge
CDN
Load Balancer
Application
API Gateway
Catalog
Cart
Order
Payment
Data & Async
Cache
DB + Replicas
Queue
Search
تدفّق الطلب

الطلب بيجي من الـ client، يعدّي على الـ CDN (للمحتوى الثابت) والـ load balancer، يتوزّع على الـ services، اللي بتقرا من الـ cache الأول وبعدين الـ DB، والعمليات التقيلة بتتحوّل للـ queue.

في Magento Magento بيطبّق أغلب ده جاهز: Varnish كـ full-page cache، Redis للـ cache والـ sessions، Elasticsearch/OpenSearch للبحث، وRabbitMQ للـ queues. لو اتسألت، اربط المكوّنات دي بأدوار Magento.
• • •
05

المكوّنات الأساسية

دور كل مكوّن، وليه محتاجينه.

Load Balancer

بيوزّع الطلبات على عدة سيرفرات عشان محدش يقع تحت الضغط. بيوفّر توسّع أفقي وتحمّل الأعطال (لو سيرفر وقع، الباقي بيشيلوا).

CDN

بيخزّن المحتوى الثابت (صور، CSS، JS) في سيرفرات قريبة جغرافيًا من المستخدم. بيقلّل الـ latency وبيخفّف الحمل على السيرفر الأساسي.

تشبيه الـ CDN زي فروع محل قريبة منك بدل ما تروح للمخزن الرئيسي البعيد كل مرة. أسرع ليك وأخف على المخزن.
ليه محوري هنا

لأن النظام read-heavy. الـ cache بيخزّن النتايج المتكررة في الذاكرة (سريعة جدًا) بدل ما يحسبها أو يجيبها من الـ DB كل مرة.

  • Full-page cache: صفحات كاملة (منتج، category) — الأثقل تأثيرًا.
  • Object cache: نتايج queries أو حسابات (Redis/Memcached).
  • CDN cache: المحتوى الثابت على الحافة.
!
التحدي الأكبر في الـ caching هو invalidation — إمتى تمسح الـ cache. لو منتج اتغيّر سعره، لازم الـ cache بتاعه يتمسح، وإلا هيظهر سعر قديم. ده أصعب جزء.
في Magento ده بالظبط دور الـ Varnish (full-page) وRedis (object/session)، والـ cache tags اللي بتحل مشكلة الـ invalidation بذكاء.
ليه محتاجينه

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

  • إرسال إيميلات / إشعارات
  • تحديث أنظمة خارجية (ERP)
  • معالجة تقارير تقيلة
  • تحديثات المخزون المؤجّلة
في Magento الـ Message Queue Framework (مبني على RabbitMQ) بيعمل بالظبط ده — publisher بيحط رسالة، consumer بياخدها في الخلفية.
ليه مش الـ DB العادية

البحث النصّي والفلترة المعقّدة (facets) بطيئة جدًا على DB عادية مع ملايين المنتجات. محرك بحث مخصّص زي Elasticsearch مبني للغرض ده — بحث سريع، فلترة، وترتيب بالصلة.

في Magento من الإصدارات الأخيرة، الـ Elasticsearch / OpenSearch إجباري للبحث في الكتالوج — مش اختيار.
• • •
06

قاعدة البيانات

اختيار وتصميم الـ DB، وأهم المقايضات.

الإجابة المتوازنة

مش لازم تختار واحد. Polyglot persistence — كل نوع بيانات في الـ DB المناسبة ليه:

  • SQL (MySQL/Postgres) — للطلبات والمدفوعات والمخزون. محتاجة ACID transactions (اتساق قوي).
  • NoSQL — للـ sessions، الـ carts المؤقتة، أو الـ catalog اللي محتاج قراءة سريعة ومرونة.
  • Search index — Elasticsearch للبحث.
  • Cache — Redis للبيانات السريعة المؤقتة.
i
القاعدة: الطلبات والمدفوعات لازم SQL عشان الـ transactions والاتساق. متعملش النقطة دي NoSQL — الفلوس محتاجة ضمانات قوية.
  • Read Replicas: نسخ للقراءة بس. مثالية للنظام read-heavy — القراءة تتوزّع، الكتابة تروح للـ master.
  • Sharding: تقسيم البيانات على عدة DBs (مثلًا حسب الـ region أو الـ user id) لما البيانات تكبر جدًا.
  • Indexing: فهارس على الأعمدة المستخدمة في البحث والفلترة.
  • Denormalization: تكرار بعض البيانات لتسريع القراءة (زي فكرة الـ index tables).
في Magento Magento بيدعم split databases (فصل الـ checkout والـ order والـ catalog على DBs مختلفة) وread replicas للتوسّع. والـ indexers نفسها تطبيق لفكرة الـ denormalization.
• • •
07

التوسّع (Scaling)

إزاي تتعامل مع نمو المستخدمين. المبادئ العامة.

  • Vertical (سيرفر أقوى): أسهل بس ليه سقف، ونقطة فشل واحدة.
  • Horizontal (سيرفرات أكتر): الأفضل للتوسّع الكبير — بتضيف أجهزة بدل ما تكبّر واحد.
شرط أساسي للـ horizontal

الـ services لازم تكون stateless — متخزّنش حالة المستخدم محليًا. الحالة (زي الـ session) بتروح لـ store مشترك (Redis) عشان أي سيرفر يقدر يخدم أي مستخدم.

تشبيه Vertical زي إنك تكبّر عربية واحدة. Horizontal زي إنك تجيب عربيات أكتر. الأولى ليها حد، التانية بتوسّع لأبعد.
الإجابة الناضجة

مش دايمًا microservices أحسن. الـ monolith (زي Magento) أبسط في البداية وأسرع تطوير. الـ microservices بتفيد لما الفريق يكبر والأجزاء تحتاج توسّع مستقل — بس بتضيف تعقيد شبكي كبير.

i
الإجابة اللي بتعجب المُقابِل: "ابدأ monolith، وافصل الأجزاء اللي محتاجة توسّع مستقل لـ services لما الحاجة تظهر" — ده تفكير عملي مش مثالي.
في Magento Magento monolith، بس ممكن تفصل أجزاء زي الـ catalog أو الـ checkout عن طريق الـ APIs والـ headless approach لو احتجت توسّع مستقل.
• • •
08

تحديات e-commerce الخاصة

المشاكل اللي بتميّز الـ e-commerce عن أي نظام تاني — دي اللي بتفرّقك.

المشكلة

لو آخر قطعة في المخزون، ومستخدمين اتنين طلبوها في نفس اللحظة — مين ياخدها؟ ده race condition كلاسيكي في e-commerce (oversell problem).

الحلول

1) Database locking (pessimistic/optimistic) عند خصم المخزون. 2) Reserve on add-to-cart — تحجز الكمية مؤقتًا. 3) Atomic operations في الـ DB تضمن إن الخصم يحصل مرة واحدة.

في Magento الـ Inventory Reservations (MSI - Multi-Source Inventory) بيحل ده — بيحجز الكمية وقت الطلب بدل ما يستنى، عشان يمنع الـ overselling.
التحدي

الدفع لازم يكون موثوق ومتّسق تمامًا. مينفعش يتخصم من العميل والطلب ميتعملش، أو العكس. وكمان لازم آمن (PCI compliance).

  • Idempotency: لو الطلب اتبعت مرتين (بسبب retry)، ميتخصمش مرتين. مفتاح فريد لكل عملية.
  • Payment gateway خارجي: متخزّنش بيانات الكروت بنفسك — استخدم Stripe/PayPal.
  • Saga pattern: للعمليات الموزّعة، لو خطوة فشلت، الباقي بيترجع (compensating transactions).
!
الـ Idempotency مفهوم مهم جدًا هنا. لو المُقابِل سأل "إزاي تمنع الدفع المزدوج؟" الإجابة idempotency key.
التحدي

في عروض زي Black Friday، الضغط بيقفز عشرات الأضعاف فجأة. النظام لازم يستحمّل أو "يتعطّل بلطف" (graceful degradation).

  • Auto-scaling: إضافة سيرفرات أوتوماتيك مع الضغط.
  • Queue-based load leveling: استقبال الطلبات في queue ومعالجتها بمعدّل ثابت.
  • Rate limiting: حماية النظام من الانهيار.
  • Aggressive caching: تخفيف الحمل عن الـ DB قدر الإمكان.
• • •
09

سيناريو كامل — مثال

إزاي تجمّع كل ده في إجابة واحدة متماسكة.

إزاي تجاوب بالترتيب
  • أسأل: كام مستخدم؟ B2C ولا B2B؟ عالمي ولا محلي؟ الـ features الأساسية؟
  • أقدّر: read-heavy، ~1000 طلب/ثانية ذروة، ملايين المنتجات.
  • أرسم: Client → CDN → LB → Services (Catalog/Cart/Order/Payment) → Cache + DB + Queue + Search.
  • أفصّل المخزون: مشكلة الـ race condition وحلها بالـ reservations.
  • أفصّل الدفع: gateway خارجي + idempotency + اتساق قوي.
  • أوسّع: read replicas للقراءة، caching للصفحات، queue للعمليات البطيئة.
  • أناقش المقايضات: اتساق المخزون vs سرعة العرض، monolith vs services.
i
لاحظ إنك بتمشي على نفس الـ 5 خطوات من القسم الأول. الإطار ثابت، بس بتملّاه بتفاصيل e-commerce.
TIPالجملة اللي تقفل بيها
"التصميم ده نقطة بداية — في الواقع كنت هقيس الأداء وأحسّن الـ bottlenecks بناءً على بيانات حقيقية." الجملة دي بتوضّح نضج هندسي: مفيش تصميم مثالي، فيه تحسين مستمر.

System Design ✓

دلوقتي عندك المنهجية الكاملة لأي سؤال system design في e-commerce: من توضيح المتطلبات، للمعمارية، للتوسّع، وتحديات المجال الخاصة. والأهم — طريقة التفكير المنظّمة.

افتكر: المُقابِل بيقيّم منهجيتك ومقايضاتك، مش إجابة واحدة صح. فكّر بصوت عالي، اسأل الأول، واشرح "ليه" مع كل قرار. ده اللي بيميّز الـ senior.

// system design · e-commerce architecture · methodology

خلّصت الدرس؟علّمه عشان تتابع تقدّمك في الكورس.

كاتب الدرس

Abdulrahman Masoud

عندك سؤال على الدرس أو محتاج مساعدة في مشروع Magento؟ كلّمني.

أسئلة شائعة

إزاي أبدأ أجاوب على سؤال System Design في الإنترفيو؟

امشي على خمس خطوات بالترتيب: وضّح المتطلبات، قدّر الحجم، ارسم المعمارية العامة، غُص في التفاصيل، وبعدين ناقش المقايضات والتوسّع. اقضِ أول 5 دقايق في الأسئلة مش الرسم، لأن المُقابِل بيقيّم منهجيتك ومقايضاتك مش حفظك.

ما الفرق بين المتطلبات الوظيفية وغير الوظيفية في System Design؟

الوظيفية بتحدد النظام بيعمل إيه، زي تصفّح المنتجات والبحث والسلة والدفع. غير الوظيفية بتحدد بيعمله كويس إزاي، زي الـ availability والـ latency والـ scalability والأمان، وهي اللي بتشكّل المعمارية فعليًا: التوفّر العالي بيفرض redundancy والسرعة بتفرض caching.

ليه نظام الـ e-commerce بيتقال عليه read-heavy وده بيأثر على التصميم إزاي؟

في الـ e-commerce القراءة (التصفّح) أكتر بكتير من الكتابة (الشراء)، ونسبة زي 100:1 شائعة. عشان كده الـ caching بأنواعه (full-page وobject وCDN) والـ read replicas بيبقوا محوريين في التصميم، وأصعب جزء في الـ caching هو الـ invalidation.

SQL ولا NoSQL لمتجر إلكتروني؟

مش لازم تختار واحد، الإجابة المتوازنة هي polyglot persistence. الطلبات والمدفوعات والمخزون في SQL عشان محتاجة ACID transactions واتساق قوي، والـ sessions والـ carts المؤقتة ممكن تبقى NoSQL، والبحث في Elasticsearch، والبيانات السريعة المؤقتة في Redis.

ما الفرق بين Horizontal و Vertical scaling؟

الـ Vertical معناه تكبّر سيرفر واحد، وده أسهل بس ليه سقف ونقطة فشل واحدة. الـ Horizontal معناه تضيف سيرفرات أكتر، وده الأفضل للتوسّع الكبير، بشرط إن الـ services تكون stateless والـ session تتخزّن في store مشترك زي Redis.

إزاي أمنع بيع آخر قطعة في المخزون لعميلين في نفس اللحظة؟

دي race condition كلاسيكية اسمها oversell problem. حلولها: database locking (pessimistic أو optimistic) عند خصم المخزون، أو حجز الكمية مؤقتًا عند الإضافة للسلة، أو atomic operations في الـ DB تضمن إن الخصم يحصل مرة واحدة.

إزاي أمنع الدفع المزدوج في نظام e-commerce؟

الحل هو idempotency key: مفتاح فريد لكل عملية دفع، فلو الطلب اتبعت مرتين بسبب retry ميتخصمش مرتين. ومعاه استخدم payment gateway خارجي زي Stripe أو PayPal بدل ما تخزّن بيانات الكروت بنفسك، والـ Saga pattern للعمليات الموزّعة.