English ∙ 日本語 ∙ 简体中文 ∙ 繁體中文 | العَرَبِيَّة ∙ বাংলা ∙ Português do Brasil ∙ Deutsch ∙ ελληνικά ∙ עברית ∙ Italiano ∙ 한국어 ∙ فارسی ∙ Polski ∙ русский язык ∙ Español ∙ ภาษาไทย ∙ Türkçe ∙ tiếng Việt ∙ Français | Add Translation
ساعد في ترجمة هذا الدليل!
مقدمة تصميم الأنظمة
الدافع
تعلم كيفية تصميم الأنظمة واسعة النطاق.>
الاستعداد لمقابلة تصميم الأنظمة.
تعلم كيفية تصميم الأنظمة واسعة النطاق
تعلم كيفية تصميم الأنظمة القابلة للتوسع سيساعدك على أن تصبح مهندسًا أفضل.
تصميم الأنظمة موضوع واسع. هناك كمية هائلة من الموارد المنتشرة عبر الإنترنت حول مبادئ تصميم الأنظمة.
هذا المستودع هو مجموعة منظمة من الموارد لمساعدتك في تعلم كيفية بناء الأنظمة على نطاق واسع.
تعلم من مجتمع المصادر المفتوحة
هذا مشروع مفتوح المصدر يتم تحديثه باستمرار.
المساهمات مرحب بها!
الاستعداد لمقابلة تصميم الأنظمة
بالإضافة إلى مقابلات البرمجة، يعد تصميم الأنظمة عنصرًا مطلوبًا في عملية المقابلة التقنية في العديد من شركات التقنية.
تمرن على أسئلة تصميم الأنظمة الشائعة في المقابلات وقارن نتائجك مع الحلول النموذجية: مناقشات، أكواد، ومخططات.
مواضيع إضافية للاستعداد للمقابلات:
- دليل الدراسة
- كيفية التعامل مع سؤال مقابلة تصميم الأنظمة
- أسئلة مقابلات تصميم الأنظمة، مع حلول
- أسئلة مقابلات التصميم الكينوني (OOP)، مع حلول
- أسئلة إضافية لمقابلات تصميم الأنظمة
بطاقات أنكي التعليمية
تستخدم حزم بطاقات أنكي المقدمة التكرار المتباعد لمساعدتك في تذكر مفاهيم تصميم الأنظمة الرئيسية.
مناسبة جداً للاستخدام أثناء التنقل.مورد البرمجة: تحديات البرمجة التفاعلية
هل تبحث عن موارد لمساعدتك في التحضير لـ مقابلة البرمجة؟
اطلع على المستودع الشقيق تحديات البرمجة التفاعلية، والذي يحتوي أيضًا على حزمة أنكي إضافية:
المساهمة
تعلم من المجتمع.
لا تتردد في إرسال طلبات السحب للمساعدة في:
- تصحيح الأخطاء
- تحسين الأقسام
- إضافة أقسام جديدة
- الترجمة
راجع إرشادات المساهمة.
فهرس مواضيع تصميم الأنظمة
ملخصات لمواضيع مختلفة في تصميم الأنظمة، تشمل الإيجابيات والسلبيات. كل شيء عبارة عن مفاضلات.>
يحتوي كل قسم على روابط لمصادر أكثر تعمقاً.
- مواضيع تصميم الأنظمة: ابدأ هنا
- الخطوة 1: راجع محاضرة الفيديو حول قابلية التوسع
- الخطوة 2: راجع المقال حول قابلية التوسع
- الخطوات التالية
- الأداء مقابل قابلية التوسع
- زمن الاستجابة مقابل معدل النقل
- التوافر مقابل الاتساق
- نظرية CAP
- CP - الاتساق وتحمل التقسيم
- AP - التوافر وتحمل التقسيم
- أنماط الاتساق
- الاتساق الضعيف
- الاتساق النهائي
- الاتساق القوي
- أنماط التوافر
- التحويل التلقائي عند الفشل
- التكرار
- التوافر بالأرقام
- نظام أسماء النطاقات
- شبكة توزيع المحتوى
- CDNs الدفعية
- CDNs السحب
- موازن التحميل
- نشط-احتياطي
- نشط-نشط
- موازنة التحميل من الطبقة الرابعة
- موازنة التحميل من الطبقة السابعة
- التوسع الأفقي
- الوكيل العكسي (خادم الويب)
- موازن التحميل مقابل الوكيل العكسي
- طبقة التطبيق
- الخدمات المصغرة
- اكتشاف الخدمة
- قاعدة البيانات
- نظام إدارة قواعد البيانات العلائقية (RDBMS)
- تكرار رئيس-تابع
- تكرار رئيس-رئيس
- الاتحاد
- التجزئة
- إلغاء التطبيع
- تحسين استعلامات SQL
- NoSQL
- تخزين المفتاح والقيمة
- تخزين المستندات
- تخزين الأعمدة الواسعة
- قاعدة بيانات الرسم البياني
- SQL أم NoSQL
- الذاكرة المؤقتة (الكاش)
- التخزين المؤقت على العميل
- التخزين المؤقت عبر شبكة CDN
- التخزين المؤقت لخادم الويب
- التخزين المؤقت لقاعدة البيانات
- التخزين المؤقت للتطبيق
- التخزين المؤقت على مستوى استعلام قاعدة البيانات
- التخزين المؤقت على مستوى الكائنات
- متى يتم تحديث الكاش
- Cache-aside
- الكتابة المباشرة
- الكتابة المؤجلة (الكتابة للخلف)
- التحديث المسبق
- اللا تزامن
- قوائم الرسائل
- قوائم المهام
- الضغط العكسي
- الاتصال
- بروتوكول التحكم في الإرسال (TCP)
- بروتوكول بيانات المستخدم (UDP)
- الاتصال عن بعد بالإجراء (RPC)
- نقل الحالة التمثيلية (REST)
- الأمان
- الملحق
- جدول قوى الرقم اثنين
- أرقام الكمون التي يجب أن يعرفها كل مبرمج
- أسئلة إضافية لمقابلات تصميم الأنظمة
- هندسات العالم الحقيقي
- هندسات الشركات
- مدونات هندسة الشركات
- قيد التطوير
- الاعتمادات
- معلومات التواصل
- الرخصة
دليل الدراسة
مواضيع مقترحة للمراجعة بناءً على الجدول الزمني لمقابلتك (قصير، متوسط، طويل).

س: هل يجب أن أعرف كل شيء هنا من أجل المقابلات؟
ج: لا، ليس عليك معرفة كل شيء هنا للتحضير للمقابلة.
ما يتم سؤالك عنه في المقابلة يعتمد على متغيرات مثل:
- مدى خبرتك
- خلفيتك التقنية
- الوظائف التي تتقدم لها
- الشركات التي تجري مقابلات معها
- الحظ
ابدأ بشكل عام ثم تعمق في بعض المجالات. من المفيد معرفة القليل عن مختلف مواضيع تصميم الأنظمة الرئيسية. عدّل الدليل التالي بناءً على جدولك الزمني وخبرتك، والوظائف التي تجري مقابلات من أجلها، والشركات التي تتقدم للعمل لديها.
- جدول زمني قصير - استهدف اتساع المعرفة في مواضيع تصميم الأنظمة. تدرب على حل بعض أسئلة المقابلات.
- جدول زمني متوسط - استهدف اتساع المعرفة وبعض العمق في مواضيع تصميم الأنظمة. تدرب على حل العديد من أسئلة المقابلات.
- جدول زمني طويل - استهدف اتساع المعرفة ومزيد من العمق في مواضيع تصميم الأنظمة. تدرب على حل معظم أسئلة المقابلات.
كيفية التعامل مع سؤال مقابلة تصميم الأنظمة
كيف تتعامل مع سؤال مقابلة تصميم الأنظمة.
مقابلة تصميم الأنظمة هي محادثة مفتوحة. من المتوقع أن تقودها بنفسك.
يمكنك استخدام الخطوات التالية لتوجيه النقاش. للمساعدة في ترسيخ هذه العملية، اعمل من خلال قسم أسئلة مقابلة تصميم الأنظمة مع حلول باستخدام الخطوات التالية.
الخطوة 1: تحديد حالات الاستخدام والقيود والافتراضات
اجمع المتطلبات وحدد نطاق المشكلة. اطرح أسئلة لتوضيح حالات الاستخدام والقيود. ناقش الافتراضات.
- من سيستخدم النظام؟
- كيف سيستخدمونه؟
- كم عدد المستخدمين؟
- ماذا يفعل النظام؟
- ما هي مدخلات ومخرجات النظام؟
- كم من البيانات نتوقع معالجتها؟
- كم عدد الطلبات في الثانية نتوقع؟
- ما هي نسبة القراءة إلى الكتابة المتوقعة؟
الخطوة 2: إنشاء تصميم عالي المستوى
ارسم تصميمًا عالي المستوى يضم جميع المكونات الهامة.
- ارسم المكونات الرئيسية والاتصالات بينها
- برر أفكارك
الخطوة 3: تصميم المكونات الأساسية
تعمق في التفاصيل لكل مكون أساسي. على سبيل المثال، إذا طُلب منك تصميم خدمة تقصير الروابط، ناقش:
- توليد وتخزين قيمة هاش للرابط الكامل
- MD5 و Base62
- تصادمات الهـاش
- SQL أو NoSQL
- مخطط قاعدة البيانات
- ترجمة رابط هاش إلى الرابط الكامل
- البحث في قاعدة البيانات
- تصميم واجهة برمجة التطبيقات والتصميم الكائني
الخطوة 4: توسيع نطاق التصميم
حدد عنق الزجاجة وعالجها بناءً على القيود. على سبيل المثال، هل تحتاج إلى ما يلي لمعالجة مشاكل قابلية التوسع؟
- موازن تحميل
- التوسع الأفقي
- التخزين المؤقت
- تقسيم قاعدة البيانات
الحسابات التقريبية السريعة
قد يُطلب منك إجراء بعض التقديرات يدويًا. راجع الملحق للموارد التالية:
- استخدم الحسابات التقريبية السريعة
- جدول القوى الثنائية
- أرقام زمن الاستجابة التي يجب أن يعرفها كل مبرمج
المصدر(المصادر) ومزيد من القراءة
اطلع على الروابط التالية للحصول على فكرة أفضل عما يمكن توقعه:
- كيف تتفوق في مقابلة تصميم الأنظمة
- مقابلة تصميم النظام
- مقدمة في مقابلات الهندسة وتصميم الأنظمة
- قالب تصميم النظام
أسئلة مقابلة تصميم النظام مع حلول
أسئلة مقابلة تصميم النظام الشائعة مع مناقشات نموذجية، وكود، ومخططات.>
الحلول مرتبطة بالمحتوى في مجلد solutions/.| السؤال | | |---|---| | صمم Pastebin.com (أو Bit.ly) | الحل | | صمم الجدول الزمني والبحث في تويتر (أو خلاصة وبحث فيسبوك) | الحل | | صمم زاحف ويب | الحل | | صمم Mint.com | الحل | | صمم هياكل البيانات لشبكة اجتماعية | الحل | | صمم متجر القيم الرئيسية لمحرك بحث | الحل | | صمم ميزة تصنيف المبيعات حسب الفئة في أمازون | الحل | | صمم نظامًا يتوسع ليخدم ملايين المستخدمين على AWS | الحل | | أضف سؤالًا حول تصميم النظام | ساهم |
صمم Pastebin.com (أو Bit.ly)

صمم الجدول الزمني والبحث في تويتر (أو خلاصة وبحث فيسبوك)

صمم زاحف ويب

Design Mint.com

Design the data structures for a social network

Design a key-value store for a search engine

Design Amazon's sales ranking by category feature

Design a system that scales to millions of users on AWS

Object-oriented design interview questions with solutions
Common object-oriented design interview questions with sample discussions, code, and diagrams.>
Solutions linked to content in the solutions/ folder.>Note: This section is under development
| Question | | |---|---| | تصميم خريطة تجزئة (هاش ماب) | الحل | | تصميم ذاكرة تخزين مؤقتة الأقل استخدامًا مؤخرًا | الحل | | تصميم مركز الاتصالات | الحل | | تصميم مجموعة أوراق اللعب | الحل | | تصميم موقف سيارات | الحل | | تصميم خادم الدردشة | الحل | | تصميم مصفوفة دائرية | ساهم | | إضافة سؤال تصميم كائني التوجه | ساهم |
مواضيع تصميم الأنظمة: ابدأ هنا
هل أنت جديد في تصميم الأنظمة؟
أولاً، ستحتاج إلى فهم أساسي للمبادئ الشائعة، والتعرف على ماهيتها، وكيفية استخدامها، وإيجابياتها وسلبياتها.
الخطوة 1: مراجعة محاضرة الفيديو حول قابلية التوسع
محاضرة قابلية التوسع في جامعة هارفارد
- المواضيع المغطاة:
- التوسع الرأسي
- التوسع الأفقي
- التخزين المؤقت (الكاش)
- موازنة الحمل
- تكرار قواعد البيانات
- تقسيم قواعد البيانات
الخطوة 2: مراجعة المقالة حول قابلية التوسع
- المواضيع المغطاة:
- النسخ
- قواعد البيانات
- الكاشات
- العمل غير المتزامن
الخطوات التالية
بعد ذلك، سنلقي نظرة على المقايضات عالية المستوى:
- الأداء مقابل القابلية للتوسع
- الكمون مقابل المعدل الإنتاجي
- التوافر مقابل الاتساق
ثم سنتعمق في مواضيع أكثر تحديدًا مثل نظام أسماء النطاقات (DNS)، وشبكات توصيل المحتوى (CDNs)، وموازنات التحميل.
الأداء مقابل القابلية للتوسع
تكون الخدمة قابلة للتوسع إذا أدت إلى زيادة الأداء بشكل يتناسب مع الموارد المضافة. عادةً، زيادة الأداء تعني تقديم المزيد من وحدات العمل، ولكن يمكن أن يكون أيضًا لمعالجة وحدات عمل أكبر، مثل عندما تنمو مجموعات البيانات.1
طريقة أخرى للنظر إلى الأداء مقابل القابلية للتوسع:
- إذا كان لديك مشكلة أداء، فإن نظامك بطيء لمستخدم واحد.
- إذا كان لديك مشكلة قابلية للتوسع، فإن نظامك سريع لمستخدم واحد لكنه بطيء تحت الحمل الثقيل.
المصدر(المصادر) وقراءة إضافية
الكمون مقابل المعدل الإنتاجي
الكمون هو الوقت اللازم لتنفيذ إجراء ما أو لإنتاج نتيجة معينة.
المعدل الإنتاجي هو عدد هذه الإجراءات أو النتائج في وحدة زمنية معينة.
بشكل عام، يجب أن تهدف إلى أقصى معدل إنتاجي مع كمون مقبول.
المصدر(المصادر) وقراءة إضافية
التوافر مقابل الاتساق
نظرية CAP
في نظام الحوسبة الموزعة، يمكنك فقط دعم اثنين من الضمانات التالية:
- الاتساق - كل قراءة تحصل على أحدث عملية كتابة أو خطأ
- التوافر - كل طلب يحصل على استجابة، دون ضمان أنها تحتوي على أحدث إصدار من المعلومات
- تحمل التقسيم - يواصل النظام العمل بالرغم من التقسيمات التعسفية الناتجة عن فشل الشبكة
#### CP - الاتساق وتحمل التقسيم
انتظار الاستجابة من العقدة المقسمة قد يؤدي إلى خطأ في انتهاء المهلة. CP هو خيار جيد إذا كانت احتياجات عملك تتطلب عمليات قراءة وكتابة ذرية.
#### AP - التوافر وتحمل التقسيم
تُرجع الاستجابات الإصدار الأكثر توفرًا من البيانات على أي عقدة، والذي قد لا يكون الأحدث. قد تستغرق عمليات الكتابة بعض الوقت للانتشار عند حل التقسيم.
AP هو خيار جيد إذا كانت احتياجات العمل تسمح بـ الاتساق النهائي أو عندما يحتاج النظام إلى الاستمرار في العمل رغم الأخطاء الخارجية.
المصدر(المصادر) وقراءات إضافية
أنماط الاتساق
مع وجود نسخ متعددة من نفس البيانات، نحن أمام خيارات حول كيفية مزامنتها حتى يحصل العملاء على رؤية متسقة للبيانات. تذكر تعريف الاتساق من نظرية CAP - كل قراءة تحصل على أحدث كتابة أو خطأ.
الاتساق الضعيف
بعد عملية كتابة، قد ترى أو لا ترى القراءة ذلك. يتم اتباع نهج أفضل جهد ممكن.
يظهر هذا النهج في أنظمة مثل memcached. يعمل الاتساق الضعيف بشكل جيد في حالات الاستخدام الفوري مثل VoIP، والدردشة المرئية، والألعاب متعددة اللاعبين في الوقت الحقيقي. على سبيل المثال، إذا كنت في مكالمة هاتفية وفقدت الاستقبال لبضع ثوانٍ، عند استعادة الاتصال لن تسمع ما تم التحدث به أثناء فقدان الاتصال.
الاتساق النهائي
بعد عملية كتابة، ستتمكن عمليات القراءة من رؤيتها في نهاية المطاف (عادةً خلال أجزاء من الثانية). يتم تكرار البيانات بشكل غير متزامن.
يُلاحظ هذا النهج في أنظمة مثل نظام أسماء النطاقات (DNS) والبريد الإلكتروني. يعمل الاتساق النهائي بشكل جيد في الأنظمة ذات التوافر العالي.
الاتساق القوي
بعد عملية كتابة، ستتمكن عمليات القراءة من رؤيتها. يتم تكرار البيانات بشكل متزامن.
يُلاحظ هذا النهج في أنظمة الملفات وقواعد البيانات العلائقية (RDBMS). يعمل الاتساق القوي بشكل جيد في الأنظمة التي تحتاج إلى معاملات.
المصدر(المصادر) وقراءات إضافية
أنماط التوافر
هناك نمطان متكاملان لدعم التوافر العالي: التحويل عند الفشل و التكرار.
التحويل عند الفشل
#### نشط-سلبي
في التحويل عند الفشل من نوع نشط-سلبي، يتم إرسال نبضات بين الخادم النشط والخادم السلبي الاحتياطي. إذا انقطعت النبضات، يتولى الخادم السلبي عنوان IP للخادم النشط ويستأنف الخدمة.
يتم تحديد مدة التوقف حسب ما إذا كان الخادم السلبي يعمل بالفعل في وضع الاستعداد "الساخن" أو يحتاج إلى البدء من وضع الاستعداد "البارد". الخادم النشط فقط هو من يتعامل مع الحركة.
يمكن أيضًا الإشارة إلى التحويل عند الفشل من نوع نشط-سلبي باسم التحويل عند الفشل رئيس-مرؤوس.
#### نشط-نشط
في وضع نشط-نشط، يتعامل كلا الخادمين مع الحركة، ويتم توزيع الحمل بينهما.
إذا كانت الخوادم متاحة للعامة، يجب أن يعرف DNS بعناوين IP العامة لكلا الخادمين. إذا كانت الخوادم داخلية، يجب أن يعرف منطق التطبيق عن كلا الخادمين.
يمكن أيضًا الإشارة إلى التحويل عند الفشل من نوع نشط-نشط باسم التحويل عند الفشل رئيس-رئيس.
العيب(العيوب): التحويل عند الفشل
- يضيف الانتقال التلقائي المزيد من الأجهزة ويزيد من التعقيد.
- هناك احتمال لفقدان البيانات إذا فشل النظام النشط قبل أن يتم نسخ أي بيانات جديدة إلى النظام الاحتياطي.
النسخ المتماثل
#### رئيسي-ثانوي ورئيسي-رئيسي
تمت مناقشة هذا الموضوع بشكل أكبر في قسم قاعدة البيانات:
التوفر بالأرقام
يتم غالبًا تحديد التوفر من خلال وقت التشغيل (أو وقت التوقف) كنسبة مئوية من الوقت الذي يكون فيه الخدمة متاحة. عادةً ما يتم قياس التوفر بعدد التسعات--الخدمة التي توفر بنسبة 99.99% توصف بأنها لديها أربع تسعات.
#### توفر 99.9% - ثلاث تسعات
| المدة | وقت التوقف المقبول| |----------------------|------------------| | التوقف السنوي | 8س 45د 57ث | | التوقف الشهري | 43د 49.7ث | | التوقف الأسبوعي | 10د 4.8ث | | التوقف اليومي | 1د 26.4ث |
#### توفر 99.99% - أربع تسعات
| المدة | وقت التوقف المقبول| |----------------------|------------------| | التوقف السنوي | 52د 35.7ث | | التوقف الشهري | 4د 23ث | | التوقف الأسبوعي | 1د 5ث | | التوقف اليومي | 8.6ث |
#### التوفر بالتوازي مقابل التتابع
إذا كانت الخدمة تتكون من عدة مكونات معرضة للفشل، فإن التوفر الإجمالي للخدمة يعتمد على ما إذا كانت المكونات في تتابع أو في توازي.
###### في التتابع تنخفض الإتاحة الإجمالية عندما يكون هناك مكونان بإتاحة أقل من 100% متتاليان:
Availability (Total) = Availability (Foo) * Availability (Bar)
إذا كان كل من Foo و Bar يمتلكان معدل توافر 99.9%، فإن التوافر الإجمالي لهما بالتسلسل سيكون 99.8%.###### بالتوازي
يزداد التوافر الكلي عندما يكون هناك مكونان بمعدل توافر أقل من 100% يعملان بالتوازي:
Availability (Total) = 1 - (1 - Availability (Foo)) * (1 - Availability (Bar))
إذا كان كل من Foo و Bar لديه توفر بنسبة 99.9%، فإن توفرهما الإجمالي بشكل متوازي سيكون 99.9999%.نظام أسماء النطاقات
المصدر: عرض تقديمي حول أمان DNS
يحول نظام أسماء النطاقات (DNS) اسم نطاق مثل www.example.com إلى عنوان IP.
يعد DNS نظامًا هرميًا، مع وجود عدد قليل من الخوادم السلطوية في المستوى الأعلى. يوفر جهاز التوجيه أو مزود خدمة الإنترنت معلومات حول أي خادم DNS يجب الاتصال به عند إجراء البحث. تخزن خوادم DNS ذات المستوى الأدنى عمليات التعيين مؤقتًا، والتي قد تصبح قديمة بسبب تأخيرات انتشار DNS. يمكن أيضًا لمتصفحك أو نظام التشغيل تخزين نتائج DNS مؤقتًا لفترة زمنية محددة، يحددها وقت البقاء (TTL).
- سجل NS (خادم الأسماء) - يحدد خوادم DNS لنطاقك/نطاقك الفرعي.
- سجل MX (تبادل البريد) - يحدد خوادم البريد لقبول الرسائل.
- سجل A (العنوان) - يوجه اسمًا إلى عنوان IP.
- CNAME (اسم قياسي) - يوجه اسمًا إلى اسم آخر أو
CNAME(example.com إلى www.example.com) أو إلى سجلA.
- الجولة الدائرية الموزونة
- منع حركة المرور من الذهاب إلى الخوادم التي تحت الصيانة
- التوازن بين أحجام التجمعات المختلفة
- اختبار A/B
- مبنية على زمن الاستجابة
- مبنية على الموقع الجغرافي
العيوب: DNS
- الوصول إلى خادم DNS يضيف تأخيرًا بسيطًا، لكنه يُخفف عبر التخزين المؤقت كما هو موضح أعلاه.
- قد يكون إدارة خوادم DNS معقدة وغالبًا ما تُدار من قبل الحكومات ومزودي خدمة الإنترنت والشركات الكبرى.
- تعرضت خدمات DNS مؤخرًا لهجمات DDoS، مما منع المستخدمين من الوصول إلى مواقع مثل تويتر دون معرفة عنوان(عناوين) IP الخاصة بتويتر.
المصادر وقراءات إضافية
- بنية DNS.aspx)
- ويكيبيديا
- مقالات DNS
شبكة توزيع المحتوى
شبكة توزيع المحتوى (CDN) هي شبكة موزعة عالميًا من خوادم البروكسي، تقدم المحتوى من مواقع أقرب إلى المستخدم. عادةً، يتم تقديم الملفات الثابتة مثل HTML/CSS/JS والصور والفيديوهات من CDN، رغم أن بعض شبكات CDN مثل CloudFront من أمازون تدعم المحتوى الديناميكي. ستحدد عملية حل DNS للموقع أي خادم يجب أن يتواصل معه العميل.
تقديم المحتوى من خلال شبكات CDN يمكن أن يحسن الأداء بشكل كبير بطريقتين:
- يحصل المستخدمون على المحتوى من مراكز بيانات قريبة منهم
- لا تضطر خوادمك إلى خدمة الطلبات التي يلبيها CDN
شبكات CDN الدفعية (Push CDNs)
تستقبل شبكات CDN الدفعية محتوى جديدًا كلما حدثت تغييرات على خادمك. تتحمل المسؤولية الكاملة لتوفير المحتوى، وترفعه مباشرة إلى CDN وتعيد كتابة عناوين URL لتشير إلى CDN. يمكنك ضبط توقيت انتهاء صلاحية المحتوى وتحديثه. يتم رفع المحتوى فقط عندما يكون جديدًا أو تم تغييره، مما يقلل الحركة، لكنه يزيد التخزين.
المواقع ذات الحركة القليلة أو المواقع ذات المحتوى الذي لا يتغير كثيرًا تعمل بشكل جيد مع شبكات CDN الدفعية. يتم وضع المحتوى على CDN مرة واحدة، بدلاً من إعادة تحميله بشكل دوري.
شبكات CDN السحب (Pull CDNs)
تسحب شبكات CDN السحب المحتوى الجديد من خادمك عندما يطلبه أول مستخدم. تترك المحتوى على خادمك وتعيد كتابة عناوين URL لتشير إلى CDN. ينتج عن ذلك طلب أبطأ حتى يتم تخزين المحتوى مؤقتًا على CDN.
يحدد زمن البقاء (TTL) مدة تخزين المحتوى مؤقتًا. تقلل شبكات CDN السحب مساحة التخزين على CDN، لكنها قد تخلق حركة زائدة إذا انتهت صلاحية الملفات وتم سحبها قبل أن تتغير فعليًا.
المواقع ذات الحركة العالية تعمل جيدًا مع شبكات CDN السحب، حيث يتم توزيع الحركة بشكل أكثر توازنًا مع بقاء المحتوى الذي تم طلبه مؤخرًا فقط على CDN.
العيوب: CDN
- قد تكون تكاليف CDN كبيرة حسب حجم الحركة، رغم أنه يجب وزن ذلك مقابل التكاليف الإضافية التي ستتكبدها بدون استخدام CDN.
- قد يكون المحتوى قديمًا إذا تم تحديثه قبل انتهاء صلاحية TTL.
- تتطلب شبكات CDN تغيير عناوين URL للمحتوى الثابت لتشير إلى CDN.
المصادر وقراءات إضافية
موازن التحميل
المصدر: أنماط تصميم الأنظمة القابلة للتوسع
يقوم موازن التحميل بتوزيع طلبات العملاء الواردة على موارد الحوسبة مثل خوادم التطبيقات وقواعد البيانات. في كل حالة، يعيد موازن التحميل الاستجابة من مورد الحوسبة إلى العميل المناسب. موازنات التحميل فعّالة في:
- منع إرسال الطلبات إلى الخوادم غير الصحية
- منع تحميل الموارد بشكل زائد
- المساعدة في القضاء على نقطة فشل واحدة
تشمل الفوائد الإضافية:
- إنهاء SSL - فك تشفير الطلبات الواردة وتشفير استجابات الخادم بحيث لا تضطر الخوادم الخلفية إلى تنفيذ هذه العمليات المكلفة
- يلغي الحاجة إلى تثبيت شهادات X.509 على كل خادم
- استمرارية الجلسة - إصدار ملفات تعريف الارتباط وتوجيه طلبات عميل محدد إلى نفس المثيل إذا لم تحتفظ تطبيقات الويب بتتبع الجلسات
يمكن لموازنات التحميل توجيه الحركة بناءً على مقاييس متنوعة، بما في ذلك:
- عشوائي
- الأقل تحميلًا
- الجلسة/ملفات تعريف الارتباط
- التوزيع الدائري أو الدائري الموزون
- الطبقة الرابعة
- الطبقة السابعة
موازنة التحميل في الطبقة الرابعة
تقوم موازنات التحميل في الطبقة الرابعة بالنظر إلى المعلومات في طبقة النقل لتحديد كيفية توزيع الطلبات. عادةً، يشمل ذلك عناوين IP المصدر والوجهة، والمنافذ في الترويسة، وليس محتوى الحزمة. تقوم موازنات التحميل في الطبقة الرابعة بتمرير حزم الشبكة من وإلى الخادم العلوي، مع إجراء ترجمة عنوان الشبكة (NAT).
موازنة التحميل في الطبقة السابعة
يقوم موازن التحميل من الطبقة السابعة بفحص طبقة التطبيق لتحديد كيفية توزيع الطلبات. يمكن أن يشمل ذلك محتويات الرأس، والرسالة، وملفات تعريف الارتباط. يقوم موازن التحميل من الطبقة السابعة بإنهاء حركة المرور على الشبكة، ويقرأ الرسالة، ويتخذ قرار موازنة التحميل، ثم يفتح اتصالاً بالخادم المحدد. على سبيل المثال، يمكن لموازن التحميل من الطبقة السابعة توجيه حركة مرور الفيديو إلى الخوادم التي تستضيف الفيديوهات بينما يوجه حركة المرور الأكثر حساسية للفوترة إلى خوادم معززة أمنيًا.
على حساب المرونة، يتطلب موازنة التحميل من الطبقة الرابعة وقتًا وموارد حسابية أقل من الطبقة السابعة، على الرغم من أن تأثير الأداء يمكن أن يكون ضئيلًا على الأجهزة الحديثة الشائعة.
التوسيع الأفقي
يمكن أن تساعد موازنات التحميل أيضًا في التوسيع الأفقي، مما يحسن الأداء والتوافر. التوسيع باستخدام أجهزة شائعة أقل تكلفة ويؤدي إلى توافر أعلى من توسيع خادم واحد على أجهزة باهظة الثمن، ويسمى ذلك التوسيع الرأسي. كما أنه من الأسهل توظيف مواهب للعمل على الأجهزة الشائعة أكثر من الأنظمة المؤسسية المتخصصة.
#### العيب/العيوب: التوسيع الأفقي
- التوسيع الأفقي يقدم تعقيدًا ويتطلب استنساخ الخوادم
- يجب أن تكون الخوادم عديمة الحالة: يجب ألا تحتوي على أي بيانات متعلقة بالمستخدم مثل الجلسات أو صور الملف الشخصي
- يمكن تخزين الجلسات في مستودع بيانات مركزي مثل قاعدة بيانات (SQL، NoSQL) أو ذاكرة تخزين مؤقت دائمة (Redis، Memcached)
- يجب على الخوادم المتتالية مثل الذاكرات المؤقتة وقواعد البيانات التعامل مع المزيد من الاتصالات المتزامنة مع زيادة عدد الخوادم العليا
العيب/العيوب: موازن التحميل
- قد يصبح موازن التحميل عنق زجاجة في الأداء إذا لم يكن لديه موارد كافية أو إذا لم يتم تكوينه بشكل صحيح.
- إدخال موازن تحميل للمساعدة في إزالة نقطة فشل واحدة يؤدي إلى زيادة التعقيد.
- موازن التحميل الواحد هو نقطة فشل واحدة، وتكوين عدة موازنات تحميل يزيد التعقيد أكثر.
المصدر(المصادر) وقراءات إضافية
- هندسة NGINX
- دليل هندسة HAProxy
- القابلية للتوسع
- ويكيبيديا)
- موازنة تحميل الطبقة الرابعة
- موازنة تحميل الطبقة السابعة
- تكوين مستمع ELB
البروكسي العكسي (خادم الويب)
الخادم العكسي هو خادم ويب يقوم بمركزة الخدمات الداخلية ويقدم واجهات موحدة للجمهور. يتم تمرير الطلبات من العملاء إلى خادم يمكنه تلبيتها قبل أن يعيد الخادم العكسي استجابة الخادم إلى العميل.تشمل الفوائد الإضافية:
- زيادة الأمان - إخفاء معلومات عن الخوادم الخلفية، حظر عناوين IP، تحديد عدد الاتصالات لكل عميل
- زيادة القابلية للتوسع والمرونة - العملاء يرون فقط عنوان IP للخادم العكسي، مما يتيح لك توسيع الخوادم أو تغيير إعداداتها
- إنهاء SSL - فك تشفير الطلبات الواردة وتشفير استجابات الخادم بحيث لا تضطر الخوادم الخلفية إلى تنفيذ هذه العمليات المكلفة المحتملة
- يزيل الحاجة لتثبيت شهادات X.509 على كل خادم
- الضغط - ضغط استجابات الخادم
- التخزين المؤقت - إعادة الاستجابة للطلبات المخزنة مؤقتًا
- المحتوى الثابت - تقديم المحتوى الثابت مباشرةً
- HTML/CSS/JS
- صور
- فيديوهات
- إلخ
موزع الأحمال مقابل الخادم العكسي
- نشر موزع الأحمال يكون مفيدًا عندما يكون لديك عدة خوادم. غالبًا، يقوم موزع الأحمال بتوجيه الحركة إلى مجموعة من الخوادم التي تؤدي نفس الوظيفة.
- يمكن أن يكون الخادم العكسي مفيدًا حتى مع وجود خادم ويب واحد أو خادم تطبيق واحد، مما يتيح الاستفادة من الفوائد المذكورة في القسم السابق.
- حلول مثل NGINX و HAProxy يمكن أن تدعم كل من البروكسي العكسي من الطبقة 7 وموازنة التحميل.
العيب/العيوب: الخادم العكسي
- إدخال خادم عكسي يؤدي إلى زيادة التعقيد.
- وجود خادم عكسي واحد يمثل نقطة فشل واحدة، وتكوين عدة خوادم عكسية (أي نقل التحميل) يزيد التعقيد أكثر.
المصدر/المصادر وقراءة إضافية
طبقة التطبيق
المصدر: مقدمة حول هندسة الأنظمة للتوسع
فصل طبقة الويب عن طبقة التطبيق (المعروفة أيضاً بطبقة المنصة) يسمح لك بتوسيع وتكوين كل طبقة بشكل مستقل. إضافة واجهة برمجة تطبيقات جديدة يؤدي إلى إضافة خوادم تطبيقات دون الحاجة بالضرورة إلى إضافة خوادم ويب إضافية. يدعو مبدأ المسؤولية الواحدة إلى خدمات صغيرة ومستقلة تعمل معاً. الفرق الصغيرة ذات الخدمات الصغيرة يمكنها التخطيط بشكل أكثر جرأة للنمو السريع.
العاملون في طبقة التطبيق يساعدون أيضاً في تمكين اللا تزامن.
الخدمات المصغرة
ذات صلة بهذا النقاش هي الخدمات المصغرة، التي يمكن وصفها بأنها مجموعة من الخدمات الصغيرة والمستقلة التي يمكن نشرها بشكل منفصل. كل خدمة تعمل في عملية فريدة وتتواصل عبر آلية محددة وخفيفة الوزن لتحقيق هدف تجاري. 1
على سبيل المثال، قد يكون لدى Pinterest الخدمات المصغرة التالية: ملف المستخدم، المتابعون، الخلاصة، البحث، رفع الصور، إلخ.
اكتشاف الخدمة
أنظمة مثل Consul، Etcd، وZookeeper يمكن أن تساعد الخدمات في العثور على بعضها البعض عن طريق تتبع الأسماء والعناوين والمنافذ المسجلة. تساعد فحوصات الصحة في التحقق من سلامة الخدمة وغالباً ما يتم ذلك باستخدام نقطة نهاية HTTP. كل من Consul وEtcd يحتويان على مخزن القيم المفتاحية مدمج يمكن أن يكون مفيداً لتخزين قيم التكوين والبيانات المشتركة الأخرى.
العيوب: طبقة التطبيق
- إضافة طبقة تطبيق مع خدمات مترابطة بشكل ضعيف يتطلب نهجاً مختلفاً من ناحية الهندسة والعمليات والعمليات التشغيلية (مقارنةً بنظام أحادي).
- يمكن أن تضيف الخدمات المصغرة تعقيداً من ناحية النشر والعمليات.
المصادر ومزيد من القراءة
- مقدمة حول هندسة الأنظمة للتوسع
- اجتياز مقابلة تصميم الأنظمة
- هندسة معمارية موجهة بالخدمات
- مقدمة إلى Zookeeper
- ما تحتاج معرفته حول بناء الخدمات المصغرة
قاعدة البيانات
المصدر: التوسع حتى أول 10 ملايين مستخدم
نظام إدارة قواعد البيانات العلائقية (RDBMS)
قاعدة البيانات العلائقية مثل SQL هي مجموعة من عناصر البيانات منظمة في جداول.
ACID هو مجموعة من خصائص المعاملات في قواعد البيانات العلائقية.
- الذَرّية - كل معاملة إما أن تتم بالكامل أو لا تتم إطلاقاً
- الاتساق - أي معاملة ستنقل قاعدة البيانات من حالة صحيحة إلى أخرى صحيحة
- العزل - تنفيذ المعاملات بشكل متزامن يعطي نفس نتائج تنفيذها بشكل متسلسل
- الاستمرارية - بمجرد تأكيد المعاملة، ستظل كذلك
#### تكرار السيد-التابع
السيد يخدم عمليات القراءة والكتابة، وينسخ الكتابات إلى واحد أو أكثر من التوابع، التي تخدم فقط عمليات القراءة. يمكن للتوابع أيضاً أن تنسخ إلى توابع إضافية بشكل هرمي. إذا توقف السيد، يمكن للنظام الاستمرار في العمل بوضع القراءة فقط حتى يتم ترقية تابع إلى سيد أو يتم تجهيز سيد جديد.
المصدر: قابلية التوسع، التوفر، الاستقرار، الأنماط
##### العيب/العيوب: تكرار السيد-التابع
- يلزم منطق إضافي لترقية تابع إلى سيد.
- راجع العيب/العيوب: التكرار للنقاط المتعلقة بكلٍ من السيد-التابع والسيد-سيد.
كلا السيدين يخدمان عمليات القراءة والكتابة ويتنسيقان مع بعضهما البعض في عمليات الكتابة. إذا توقف أي من السيدين، يمكن للنظام الاستمرار في العمل مع عمليات القراءة والكتابة.
المصدر: قابلية التوسع، التوفر، الاستقرار، الأنماط
##### العيب/العيوب: تكرار السيد-سيد
- ستحتاج إلى موازن تحميل أو ستحتاج إلى إجراء تغييرات على منطق تطبيقك لتحديد مكان الكتابة.
- معظم أنظمة السيد-سيد إما متساهلة الاتساق (مخالفة لمبدأ ACID) أو لديها تأخير أكبر في الكتابة بسبب التزامن.
- يصبح حل النزاعات أكثر أهمية كلما زاد عدد عقد الكتابة وكلما زادت زمن الاستجابة.
- راجع العيوب: النسخ المتماثل للنقاط المتعلقة بـ كل من النمط الرئيسي-التابع والنمط الرئيسي-الرئيسي.
- هناك احتمال فقدان البيانات إذا فشل الخادم الرئيسي قبل أن يتم نسخ أي بيانات مكتوبة حديثًا إلى العقد الأخرى.
- تتم إعادة تنفيذ عمليات الكتابة على نسخ القراءة. إذا كان هناك الكثير من عمليات الكتابة، يمكن أن تتعطل نسخ القراءة بسبب إعادة تنفيذ عمليات الكتابة ولا تستطيع إجراء العديد من عمليات القراءة.
- كلما زاد عدد نسخ القراءة، زادت الحاجة إلى النسخ المتماثل، مما يؤدي إلى زيادة تأخر النسخ.
- في بعض الأنظمة، يمكن أن يؤدي الكتابة إلى الخادم الرئيسي إلى إنشاء عدة خيوط للكتابة بالتوازي، في حين أن نسخ القراءة تدعم فقط الكتابة بشكل تسلسلي بخيط واحد.
- يضيف النسخ المتماثل المزيد من الأجهزة والتعقيد الإضافي.
المصدر: التوسع حتى أول 10 ملايين مستخدم
يقوم التقسيم الفيدرالي (أو التقسيم الوظيفي) بتقسيم قواعد البيانات حسب الوظيفة. على سبيل المثال، بدلاً من قاعدة بيانات واحدة ضخمة، يمكنك أن تملك ثلاث قواعد بيانات: المنتديات، المستخدمون، و المنتجات، مما يؤدي إلى تقليل حركة القراءة والكتابة على كل قاعدة بيانات وبالتالي تقليل تأخر النسخ. تؤدي قواعد البيانات الأصغر إلى المزيد من البيانات التي يمكن أن تتناسب مع الذاكرة، مما يؤدي بدوره إلى المزيد من ضربات التخزين المؤقت نتيجة لتحسين موقعية التخزين المؤقت. ومع عدم وجود خادم رئيسي مركزي واحد لتسلسل عمليات الكتابة يمكنك الكتابة بالتوازي، مما يزيد من معدل نقل البيانات.
##### العيوب: التقسيم الفيدرالي
- لا يكون التقسيم الفيدرالي فعالاً إذا كانت البنية لديك تتطلب جداول أو وظائف ضخمة.
- ستحتاج إلى تحديث منطق التطبيق لديك لتحديد أي قاعدة بيانات يجب القراءة منها أو الكتابة عليها.
- الربط بين البيانات من قاعدتي بيانات أكثر تعقيدًا باستخدام رابط الخادم.
- يضيف التقسيم الفيدرالي المزيد من الأجهزة والتعقيد الإضافي.
المصدر: القابلية للتوسع، التوفر، الاستقرار، الأنماط
يعمل التقسيم الأفقي (Sharding) على توزيع البيانات عبر قواعد بيانات مختلفة بحيث يمكن لكل قاعدة بيانات إدارة جزء فرعي فقط من البيانات. على سبيل المثال، قاعدة بيانات المستخدمين، مع زيادة عدد المستخدمين، تتم إضافة المزيد من الشرائح إلى الكتلة.
مماثل لمزايا الاتحاد، يؤدي التقسيم الأفقي إلى تقليل حركة المرور للقراءة والكتابة، وتقليل النسخ المتماثل، وزيادة نجاحات ذاكرة التخزين المؤقت. كما يقل حجم الفهرس، مما يحسن الأداء عمومًا مع استعلامات أسرع. إذا تعطلت إحدى الشرائح، تبقى الشرائح الأخرى تعمل، على الرغم من أنك ستحتاج إلى إضافة نوع من النسخ المتماثل لتجنب فقدان البيانات. مثل الاتحاد، لا يوجد رئيس مركزي واحد لتسلسل الكتابات، مما يتيح لك الكتابة بشكل متوازي مع زيادة الإنتاجية.
من الطرق الشائعة لتقسيم جدول المستخدمين هي إما عبر الحرف الأول من اسم المستخدم الأخير أو الموقع الجغرافي للمستخدم.
##### العيوب: التقسيم الأفقي
- ستحتاج إلى تحديث منطق التطبيق الخاص بك للعمل مع الشرائح، مما قد يؤدي إلى استعلامات SQL معقدة.
- يمكن أن تصبح توزيع البيانات غير متوازن في شريحة معينة. على سبيل المثال، مجموعة من المستخدمين النشطين في شريحة قد تؤدي إلى زيادة الحمل على تلك الشريحة مقارنة بالأخرى.
- إعادة التوازن تضيف تعقيدًا إضافيًا. يمكن أن يقلل دالة التقسيم المبنية على التجزئة المتسقة من كمية البيانات المنقولة.
- الربط بين البيانات من شرائح متعددة أكثر تعقيدًا.
- التقسيم الأفقي يضيف المزيد من الأجهزة وتعقيدًا إضافيًا.
يحاول إلغاء التطبيع تحسين أداء القراءة على حساب بعض أداء الكتابة. يتم كتابة نسخ زائدة من البيانات في جداول متعددة لتجنب عمليات الربط المكلفة. بعض أنظمة قواعد البيانات العلائقية مثل PostgreSQL وOracle تدعم العروض المادية التي تتولى مهمة تخزين المعلومات الزائدة والحفاظ على نسخ متسقة منها.
بمجرد توزيع البيانات باستخدام تقنيات مثل الاتحاد والتقسيم الأفقي، يصبح إدارة عمليات الربط عبر مراكز البيانات أكثر تعقيدًا. قد يتجنب إلغاء التطبيع الحاجة لمثل هذه العمليات المعقدة.
في معظم الأنظمة، يمكن أن تتجاوز عمليات القراءة عمليات الكتابة بنسبة 100:1 أو حتى 1000:1. عملية قراءة تؤدي إلى ربط قاعدة بيانات معقد يمكن أن تكون مكلفة جدًا، وتقضي وقتًا كبيرًا في عمليات الأقراص.
##### العيوب: إلغاء التطبيع
- البيانات مكررة.
- يمكن للقيود أن تساعد في الحفاظ على نسخ المعلومات الزائدة متزامنة، مما يزيد من تعقيد تصميم قاعدة البيانات.
- قاعدة بيانات غير مطبعة تحت حمل كتابة ثقيل قد تؤدي أداءً أسوأ من نظيرتها المطبوعة.
ضبط أداء SQL هو موضوع واسع وقد كُتبت العديد من الكتب كمرجع.
من المهم إجراء اختبارات الأداء وتحليل الأداء لمحاكاة وكشف نقاط الاختناق.
- اختبار الأداء - محاكاة حالات الحمل العالي باستخدام أدوات مثل ab.
- تحليل الأداء - تفعيل أدوات مثل سجل الاستعلامات البطيئة للمساعدة في تتبع مشاكل الأداء.
##### تحسين بنية قاعدة البيانات
- يقوم MySQL بتخزين البيانات على القرص في كتل متجاورة للوصول السريع.
- استخدم
CHARبدلاً منVARCHARللحقول ذات الطول الثابت. - يسمح
CHARفعليًا بالوصول السريع والعشوائي، بينما معVARCHARيجب إيجاد نهاية السلسلة قبل الانتقال إلى التالية. - استخدم
TEXTللكتل الكبيرة من النص مثل منشورات المدونة. يتيحTEXTأيضًا عمليات البحث المنطقية. استخدام حقلTEXTيؤدي إلى تخزين مؤشر على القرص يُستخدم لتحديد موقع كتلة النص. - استخدم
INTللأرقام الكبيرة حتى 2^32 أو 4 مليارات. - استخدم
DECIMALللعملات لتجنب أخطاء تمثيل الأعداد العائمة. - تجنب تخزين كتل بيانات كبيرة من نوع
BLOB، وبدلاً من ذلك قم بتخزين موقع الحصول على العنصر. VARCHAR(255)هو أكبر عدد من الأحرف يمكن تمثيله في رقم 8 بت، وغالبًا ما يزيد من استخدام البايت في بعض أنظمة إدارة قواعد البيانات.- قم بتعيين قيد
NOT NULLحيثما كان ذلك ممكنًا لـ تحسين أداء البحث.
- الأعمدة التي تستعلم عنها (
SELECT,GROUP BY,ORDER BY,JOIN) يمكن أن تكون أسرع مع الفهارس. - الفهارس غالبًا ما يتم تمثيلها على أنها شجرة B ذاتية التوازن والتي تبقي البيانات مرتبة وتسمح بعمليات البحث والوصول التسلسلي والإدراج والحذف في وقت لوغاريتمي.
- إضافة فهرس يمكن أن يبقي البيانات في الذاكرة، ويتطلب مساحة أكبر.
- قد تصبح عمليات الكتابة أبطأ لأن الفهرس يحتاج أيضًا إلى التحديث.
- عند تحميل كميات كبيرة من البيانات، قد يكون من الأسرع تعطيل الفهارس، تحميل البيانات، ثم إعادة بناء الفهارس.
- إلغاء التطبيع عند الحاجة لتحسين الأداء.
- قسم الجدول بوضع النقاط الساخنة في جدول منفصل للمساعدة في الاحتفاظ بها في الذاكرة.
- في بعض الحالات، يمكن لذاكرة التخزين المؤقت للاستعلامات (query cache) أن تؤدي إلى مشاكل في الأداء.
- نصائح لتحسين استعلامات MySQL
- هل هناك سبب وجيه لاستخدام VARCHAR(255) بشكل متكرر؟
- كيف تؤثر القيم الفارغة على الأداء؟
- سجل الاستعلامات البطيئة
NoSQL
NoSQL هو مجموعة من عناصر البيانات التي تمثل في مخزن القيم المفتاحية أو مخزن المستندات أو مخزن الأعمدة العريضة أو قاعدة بيانات الرسم البياني. يتم إلغاء التطبيع للبيانات، وعادةً ما تتم عمليات الربط في كود التطبيق. معظم قواعد بيانات NoSQL تفتقر إلى المعاملات الحقيقية من نوع ACID وتفضل الاتساق النهائي.
يتم استخدام مصطلح BASE غالبًا لوصف خصائص قواعد بيانات NoSQL. بالمقارنة مع نظرية CAP، تختار BASE التوفر على حساب الاتساق.
- متوفر بشكل أساسي - النظام يضمن التوفر.
- حالة ناعمة - حالة النظام قد تتغير مع مرور الوقت، حتى بدون إدخال بيانات.
- الاتساق النهائي - سيصبح النظام متسقًا مع مرور الوقت، بشرط ألا يستقبل النظام مدخلات خلال تلك الفترة.
#### مخزن القيم المفتاحية
التجريد: جدول تجزئة
عادةً ما يسمح مخزن القيم المفتاحية بعمليات قراءة وكتابة من نوع O(1) وغالبًا ما يكون مدعومًا بالذاكرة أو SSD. يمكن لمخازن البيانات الاحتفاظ بالمفاتيح بترتيب معجمي، مما يسمح باسترجاع نطاقات المفاتيح بكفاءة. يمكن لمخازن القيم المفتاحية السماح بتخزين بيانات وصفية مع القيمة.
تقدم مخازن القيم المفتاحية أداء عالي وغالبًا ما تُستخدم لنماذج البيانات البسيطة أو البيانات المتغيرة بسرعة، مثل طبقة التخزين المؤقتة داخل الذاكرة. ونظرًا لأنها توفر مجموعة محدودة من العمليات، يتم تحويل التعقيد إلى طبقة التطبيق إذا كانت هناك حاجة إلى عمليات إضافية.
يعد مخزن القيم المفتاحية أساسًا للأنظمة الأكثر تعقيدًا مثل مخزن المستندات، وفي بعض الحالات، قاعدة بيانات الرسم البياني.
##### المصدر(المصادر) ومزيد من القراءة: مخزن القيم المفتاحية
#### مخزن المستنداتالتجريد: مخزن مفتاح-قيمة حيث تُخزن المستندات كقيم
يرتكز مخزن المستندات حول المستندات (XML، JSON، ثنائي، إلخ)، حيث يخزن المستند جميع المعلومات لكائن معين. توفر مخازن المستندات واجهات برمجة التطبيقات أو لغة استعلام للاستعلام بناءً على البنية الداخلية للمستند نفسه. ملاحظة، العديد من مخازن المفتاح-قيمة تتضمن ميزات للعمل مع بيانات التعريف للقيمة، مما يطمس الحدود بين هذين النوعين من التخزين.
استنادًا إلى التنفيذ الأساسي، يتم تنظيم المستندات حسب المجموعات أو العلامات أو بيانات التعريف أو الأدلة. وعلى الرغم من إمكانية تنظيم المستندات أو تجميعها معًا، قد تحتوي المستندات على حقول مختلفة تمامًا عن بعضها البعض.
بعض مخازن المستندات مثل MongoDB و CouchDB تقدم أيضًا لغة شبيهة بـ SQL لتنفيذ استعلامات معقدة. DynamoDB تدعم كل من المفتاح-قيمة والمستندات.
توفر مخازن المستندات مرونة عالية وغالبًا ما تُستخدم للعمل مع البيانات المتغيرة بين الحين والآخر.
##### المصدر(المصادر) وقراءة إضافية: مخزن المستندات
#### مخزن الأعمدة الواسعة
المصدر: SQL & NoSQL، تاريخ موجز
التجريد: خريطة متداخلة ColumnFamily> الوحدة الأساسية للبيانات في مخزن الأعمدة الواسعة هي العمود (زوج اسم/قيمة). يمكن تجميع الأعمدة في عائلات الأعمدة (مماثلة لجدول SQL). عائلات الأعمدة الفائقة تجمع عائلات الأعمدة معًا. يمكنك الوصول إلى كل عمود بشكل مستقل باستخدام مفتاح الصف، وتشكل الأعمدة ذات مفتاح الصف نفسه صفًا. كل قيمة تحتوي على طابع زمني لإصدار النسخ وحل النزاعات.
قدمت Google Bigtable كأول مخزن أعمدة واسع، والذي أثر على HBase مفتوح المصدر والمستخدم غالبًا في نظام Hadoop، و Cassandra من Facebook. مخازن مثل BigTable وHBase وCassandra تحتفظ بالمفاتيح بترتيب معجمي، مما يسمح باسترجاع فعال لنطاقات مفاتيح انتقائية.
تقدم مخازن الأعمدة الواسعة توافرية عالية وقابلية توسع مرتفعة. وغالبًا ما تُستخدم لمجموعات البيانات الضخمة جدًا.
##### المصدر(المصادر) وقراءة إضافية: مخزن الأعمدة الواسعة
#### قاعدة بيانات الرسم البياني
المصدر: قاعدة بيانات الرسم البياني
التجريد: رسم بياني
في قاعدة بيانات الرسم البياني، كل عقدة هي سجل وكل قوس هو علاقة بين عقدتين. قواعد بيانات الرسم البياني مُحسّنة لتمثيل العلاقات المعقدة مع العديد من المفاتيح الأجنبية أو العلاقات المتعددة إلى المتعددة.
توفر قواعد بيانات الرسم البياني أداءً عاليًا لنماذج البيانات ذات العلاقات المعقدة، مثل الشبكات الاجتماعية. وهي حديثة نسبيًا ولم تُستخدم على نطاق واسع بعد؛ وقد يكون من الصعب العثور على أدوات وموارد التطوير. العديد من الرسوم البيانية يمكن الوصول إليها فقط عبر واجهات REST.
##### المصدر(المصادر) وقراءة إضافية: الرسم البياني
#### المصدر(المصادر) وقراءة إضافية: NoSQL- شرح المصطلحات الأساسية
- قواعد بيانات NoSQL - مسح وتوجيه القرار
- القابلية للتوسع
- مقدمة في NoSQL
- أنماط NoSQL
SQL أو NoSQL
المصدر: الانتقال من RDBMS إلى NoSQL
أسباب استخدام SQL:
- بيانات منظمة
- مخطط صارم
- بيانات علائقية
- الحاجة إلى عمليات الربط المعقدة
- المعاملات
- أنماط واضحة للتوسع
- أكثر رسوخاً: مطورون، مجتمع، أكواد، أدوات، إلخ
- البحث عبر الفهرس سريع جداً
- بيانات شبه منظمة
- مخطط ديناميكي أو مرن
- بيانات غير علائقية
- لا حاجة لعمليات الربط المعقدة
- تخزين العديد من التيرابايت (أو بيتابايت) من البيانات
- عبء عمل كثيف البيانات جداً
- معدل نقل مرتفع جداً لعمليات الإدخال والإخراج
- الإدخال السريع لبيانات النقر وسجلات الدخول
- بيانات لوحات الصدارة أو التقييم
- البيانات المؤقتة، مثل عربة التسوق
- الجداول التي يتم الوصول إليها بشكل متكرر ("ساخنة")
- جداول البيانات الوصفية/جداول البحث
التخزين المؤقت
المصدر: أنماط تصميم الأنظمة القابلة للتوسع
تحسين التخزين المؤقت يؤدي إلى تسريع تحميل الصفحات ويمكن أن يقلل الحمل على الخوادم وقواعد البيانات الخاصة بك. في هذا النموذج، يقوم الموزع أولاً بالبحث عما إذا كان الطلب قد تم من قبل ويحاول العثور على النتيجة السابقة لإرجاعها، وذلك من أجل توفير التنفيذ الفعلي.
غالبًا ما تستفيد قواعد البيانات من توزيع موحد للقراءات والكتابات عبر أقسامها. يمكن أن تتسبب العناصر الشائعة في تحريف التوزيع، مما يؤدي إلى اختناقات. وضع ذاكرة تخزين مؤقت أمام قاعدة البيانات يمكن أن يساعد في امتصاص الأحمال غير المتساوية وارتفاعات حركة المرور.
التخزين المؤقت لدى العميل
يمكن أن توجد ذاكرات التخزين المؤقت على جانب العميل (نظام التشغيل أو المتصفح)، أو جانب الخادم، أو في طبقة تخزين مؤقت منفصلة.
التخزين المؤقت لشبكات CDN
تُعتبر شبكات CDN نوعًا من أنواع التخزين المؤقت.
التخزين المؤقت لخادم الويب
يمكن أن تقدم البروكسيات العكسية وذاكرات التخزين المؤقت مثل Varnish المحتوى الثابت والديناميكي مباشرةً. يمكن لخوادم الويب أيضًا تخزين الطلبات مؤقتًا، وإرجاع الردود دون الحاجة إلى التواصل مع خوادم التطبيقات.
التخزين المؤقت لقاعدة البيانات
عادةً ما تتضمن قاعدة البيانات بعض مستوى من التخزين المؤقت في الإعداد الافتراضي، محسّن لحالة استخدام عامة. يمكن أن يؤدي تعديل هذه الإعدادات لأنماط الاستخدام المحددة إلى تعزيز الأداء بشكل أكبر.
التخزين المؤقت للتطبيق
تُعد ذاكرات التخزين المؤقت داخل الذاكرة مثل Memcached و Redis مخازن مفاتيح وقيم بين تطبيقك وتخزين بياناتك. نظرًا لأن البيانات محفوظة في ذاكرة الوصول العشوائي (RAM)، فهي أسرع بكثير من قواعد البيانات التقليدية التي يتم فيها تخزين البيانات على القرص. الذاكرة العشوائية محدودة أكثر من القرص، لذا يمكن لخوارزميات إبطال التخزين المؤقت مثل الأقل استخدامًا مؤخرًا (LRU)) أن تساعد في إبطال الإدخالات "الباردة" والحفاظ على البيانات "الساخنة" في الذاكرة.
يمتلك Redis الميزات الإضافية التالية:
- خيار الاستمرارية
- هياكل بيانات مضمنة مثل المجموعات المرتبة والقوائم
- على مستوى الصف
- على مستوى الاستعلام
- كائنات كاملة قابلة للتسلسل
- HTML كامل العرض
التخزين المؤقت على مستوى استعلام قاعدة البيانات
في كل مرة تستعلم فيها قاعدة البيانات، قم بتجزئة الاستعلام كمفتاح واحتفظ بالنتيجة في التخزين المؤقت. هذه الطريقة تعاني من مشكلات انتهاء الصلاحية:
- من الصعب حذف نتيجة مخزنة مؤقتًا ذات استعلامات معقدة
- إذا تغير جزء من البيانات مثل خلية في جدول، يجب حذف جميع الاستعلامات المخزنة مؤقتًا التي قد تتضمن الخلية التي تغيرت
التخزين المؤقت على مستوى الكائن
اعتبر بياناتك ككائن، مشابه لما تفعله في شفرة تطبيقك. قم بجعل تطبيقك يجمع مجموعة البيانات من قاعدة البيانات إلى كائن من الفئة أو بنية بيانات:
- احذف الكائن من التخزين المؤقت إذا تغيرت بياناته الأساسية
- يسمح بالمعالجة غير المتزامنة: يقوم العمال بجمع الكائنات من خلال استهلاك أحدث كائن مخزن مؤقتًا
- جلسات المستخدمين
- صفحات الويب المكتملة العرض
- تدفقات النشاط
- بيانات رسم المستخدمين البياني
متى يتم تحديث التخزين المؤقت
نظرًا لأنك تستطيع فقط تخزين كمية محدودة من البيانات في التخزين المؤقت، ستحتاج إلى تحديد استراتيجية تحديث التخزين المؤقت الأنسب لحالة الاستخدام لديك.
#### التخزين المؤقت الجانبي (Cache-aside)
المصدر: من التخزين المؤقت إلى شبكة بيانات داخل الذاكرة
التطبيق مسؤول عن القراءة والكتابة من التخزين. التخزين المؤقت لا يتفاعل مع التخزين مباشرة. يقوم التطبيق بما يلي:
- البحث عن مدخل في التخزين المؤقت، مما يؤدي إلى فقدان التخزين المؤقت
- تحميل المدخل من قاعدة البيانات
- إضافة المدخل إلى التخزين المؤقت
- إعادة المدخل
def get_user(self, user_id):
user = cache.get("user.{0}", user_id)
if user is None:
user = db.query("SELECT * FROM users WHERE user_id = {0}", user_id)
if user is not None:
key = "user.{0}".format(user_id)
cache.set(key, json.dumps(user))
return userيُستخدم Memcached عادةً بهذه الطريقة.
تكون عمليات القراءة اللاحقة للبيانات المضافة إلى الذاكرة المؤقتة سريعة. يُشار إلى نمط "cache-aside" أيضًا بالتحميل الكسول (lazy loading). لا يتم تخزين إلا البيانات المطلوبة، مما يمنع امتلاء الذاكرة المؤقتة ببيانات غير مطلوبة.
##### العيوب: cache-aside
- كل فشل في الحصول على البيانات من الذاكرة المؤقتة يؤدي إلى ثلاث رحلات، مما قد يتسبب في تأخير ملحوظ.
- قد تصبح البيانات قديمة إذا تم تحديثها في قاعدة البيانات. يتم التخفيف من هذه المشكلة عن طريق تعيين مدة حياة (TTL) تجبر على تحديث مدخل الذاكرة المؤقتة، أو باستخدام نمط "write-through".
- عند فشل عقدة، يتم استبدالها بعقدة جديدة وفارغة، مما يزيد من زمن التأخير.
المصدر: الأنماط الخاصة بالقابلية للتوسع، التوفر، الاستقرار
تستخدم التطبيق الذاكرة المؤقتة كمخزن بيانات رئيسي، فتقرأ وتكتب البيانات فيها، بينما تتولى الذاكرة المؤقتة مسؤولية القراءة والكتابة في قاعدة البيانات:
- يضيف التطبيق/يحدث مدخلاً في الذاكرة المؤقتة
- تكتب الذاكرة المؤقتة المدخل بشكل متزامن في مخزن البيانات
- الرجوع
set_user(12345, {"foo":"bar"})رمز التخزين المؤقت:
def set_user(user_id, values):
user = db.query("UPDATE Users WHERE id = {0}", user_id, values)
cache.set(user_id, user)
تعد الكتابة المباشرة عملية بطيئة بشكل عام بسبب عملية الكتابة، لكن عمليات القراءة اللاحقة للبيانات التي تم كتابتها للتو تكون سريعة. عادةً ما يكون المستخدمون أكثر تسامحًا مع التأخير عند تحديث البيانات مقارنة بقراءتها. البيانات في ذاكرة التخزين المؤقت ليست قديمة.##### العيب/العيوب: الكتابة المباشرة
- عند إنشاء عقدة جديدة بسبب الفشل أو التوسع، لن تقوم العقدة الجديدة بتخزين الإدخالات مؤقتًا حتى يتم تحديث الإدخال في قاعدة البيانات. يمكن لتقنية "Cache-aside" مع الكتابة المباشرة التخفيف من هذه المشكلة.
- معظم البيانات المكتوبة قد لا تتم قراءتها أبدًا، ويمكن تقليل ذلك باستخدام مدة صلاحية (TTL).
المصدر: الأنماط المتعلقة بالقابلية للتوسع، التوفر، الاستقرار
في الكتابة المتأخرة، يقوم التطبيق بما يلي:
- إضافة/تحديث إدخال في ذاكرة التخزين المؤقت
- كتابة الإدخال بشكل غير متزامن إلى مخزن البيانات، مما يحسن أداء الكتابة
- قد يحدث فقدان للبيانات إذا تعطلت ذاكرة التخزين المؤقت قبل وصول محتوياتها إلى مخزن البيانات.
- تنفيذ الكتابة المتأخرة أكثر تعقيدًا من تنفيذ الكتابة المباشرة أو "Cache-aside".
المصدر: من ذاكرة التخزين المؤقت إلى شبكة البيانات داخل الذاكرة
يمكنك تكوين ذاكرة التخزين المؤقت لتحديث أي إدخال تم الوصول إليه مؤخرًا تلقائيًا قبل انتهاء صلاحيته.
يمكن أن يؤدي التحديث المسبق إلى تقليل التأخير مقارنة بالقراءة المباشرة إذا تمكنت ذاكرة التخزين المؤقت من التنبؤ بدقة بالعناصر التي من المرجح أن تكون مطلوبة في المستقبل.
##### العيب/العيوب: التحديث المسبق
- عدم التنبؤ بدقة بالعناصر التي من المرجح أن تكون مطلوبة في المستقبل يمكن أن يؤدي إلى أداء أقل مما لو لم يتم استخدام خاصية التحديث المسبق.
العيوب: التخزين المؤقت
- الحاجة إلى الحفاظ على التناسق بين التخزين المؤقت ومصدر الحقيقة مثل قاعدة البيانات عبر إبطال التخزين المؤقت.
- إبطال التخزين المؤقت هو مشكلة صعبة، وهناك تعقيد إضافي مرتبط بوقت تحديث التخزين المؤقت.
- الحاجة إلى إجراء تغييرات على التطبيق مثل إضافة Redis أو memcached.
المصادر وقراءات إضافية
- من التخزين المؤقت إلى شبكة البيانات داخل الذاكرة
- أنماط تصميم الأنظمة القابلة للتوسع
- مقدمة في هندسة الأنظمة القابلة للتوسع
- التوسع، التوفر، الاستقرار، الأنماط
- القابلية للتوسع
- استراتيجيات AWS ElastiCache
- ويكيبيديا)
اللا تزامنية
المصدر: مقدمة في هندسة الأنظمة القابلة للتوسع
تساعد سير العمل غير المتزامن في تقليل أوقات الطلبات للعمليات المكلفة التي قد تُنفذ بخط واحد. كما يمكن أن تساعد أيضاً في تنفيذ الأعمال المستغرقة للوقت مسبقاً، مثل التجميع الدوري للبيانات.
طوابير الرسائل
تستقبل طوابير الرسائل الرسائل وتحتفظ بها وتوصلها. إذا كانت العملية بطيئة جداً ليتم تنفيذها بخط واحد، يمكنك استخدام طابور رسائل مع سير العمل التالي:
- ينشر التطبيق مهمة في الطابور، ثم يُخطر المستخدم بحالة المهمة
- يلتقط عامل المهمة من الطابور ويعالجها ثم يُشير إلى اكتمال المهمة
Redis مفيد كوسيط رسائل بسيط ولكن قد تُفقد الرسائل.
RabbitMQ مشهور ولكنه يتطلب منك التكيف مع بروتوكول 'AMQP' وإدارة العقد بنفسك. Amazon SQS مستضاف ولكنه قد يعاني من زمن استجابة مرتفع وإمكانية تسليم الرسائل مرتين.
قوائم المهام
تستقبل قوائم المهام المهام وبياناتها ذات الصلة، وتنفذها، ثم تسلم نتائجها. يمكنها دعم الجدولة ويمكن استخدامها لتنفيذ الوظائف كثيفة العمليات الحسابية في الخلفية.
Celery يدعم الجدولة ويدعم بشكل أساسي لغة بايثون.
الضغط الخلفي
إذا بدأت قوائم الانتظار بالنمو بشكل كبير، قد يصبح حجم قائمة الانتظار أكبر من الذاكرة، مما يؤدي إلى فقدان التخزين المؤقت، وقراءة القرص، وأداء أبطأ. يمكن أن يساعد الضغط الخلفي من خلال تحديد حجم قائمة الانتظار، مما يحافظ على معدل نقل مرتفع واستجابة جيدة للوظائف الموجودة بالفعل في القائمة. بمجرد امتلاء القائمة، يحصل العملاء على رسالة انشغال الخادم أو رمز الحالة HTTP 503 لمحاولة لاحقًا. يمكن للعملاء إعادة المحاولة في وقت لاحق، ربما مع تراجع أسي.
العيب/العيوب: عدم التزامن
- حالات الاستخدام مثل العمليات الحسابية البسيطة وتدفقات العمل في الوقت الحقيقي قد تكون أكثر ملاءمة للعمليات المتزامنة، حيث أن إدخال قوائم الانتظار يمكن أن يضيف تأخيرًا وتعقيدًا.
المصدر(المصادر) وقراءات إضافية
- كلها لعبة أرقام
- تطبيق الضغط الخلفي عند التحميل الزائد
- قانون ليتل
- ما الفرق بين قائمة الرسائل وقائمة المهام؟
الاتصال
المصدر: نموذج الطبقات السبع OSI
بروتوكول نقل النص التشعبي (HTTP)
HTTP هو طريقة لترميز ونقل البيانات بين العميل والخادم. هو بروتوكول طلب/استجابة: يصدر العملاء طلبات ويصدر الخوادم استجابات بمحتوى ذي صلة ومعلومات عن حالة إكمال الطلب. HTTP مستقل بذاته، مما يسمح بمرور الطلبات والاستجابات عبر العديد من أجهزة التوجيه والخوادم الوسيطة التي تقوم بموازنة التحميل، التخزين المؤقت، التشفير، والضغط.
يتكون طلب HTTP الأساسي من فعل (طريقة) وموارد (نقطة نهاية). فيما يلي أكثر أفعال HTTP شيوعًا:
| الفعل | الوصف | ثابت* | آمن | قابل للتخزين المؤقت | |---|---|---|---|---|
| GET | يقرأ موردًا | نعم | نعم | نعم | | POST | ينشئ موردًا أو يطلق عملية تتعامل مع البيانات | لا | لا | نعم إذا كان الرد يحتوي على معلومات حديثة | | PUT | ينشئ أو يستبدل موردًا | نعم | لا | لا | | PATCH | يُحدّث موردًا جزئيًا | لا | لا | نعم إذا كان الرد يحتوي على معلومات حديثة | | DELETE | يحذف موردًا | نعم | لا | لا |
*يمكن استدعاؤه عدة مرات دون نتائج مختلفة.
HTTP هو بروتوكول طبقة التطبيقات يعتمد على بروتوكولات ذات مستوى أدنى مثل TCP و UDP.
#### المصدر(المصادر) وقراءات إضافية: HTTP
بروتوكول التحكم في النقل (TCP)
المصدر: كيف تصنع لعبة متعددة اللاعبين
TCP هو بروتوكول يعتمد على الاتصال عبر شبكة IP. يتم إنشاء الاتصال وإنهاؤه باستخدام المصافحة. جميع الحزم المرسلة مضمونة للوصول إلى الوجهة بنفس الترتيب الأصلي وبدون تلف من خلال:
- أرقام التسلسل وحقول التحقق لكل حزمة
- حزم الإقرار) وإعادة الإرسال التلقائي
لضمان إنتاجية عالية، يمكن لخوادم الويب الاحتفاظ بعدد كبير من اتصالات TCP مفتوحة، مما يؤدي إلى استخدام مرتفع للذاكرة. قد يكون مكلفًا وجود عدد كبير من الاتصالات المفتوحة بين خيوط خادم الويب و مثلًا خادم memcached. يمكن أن يساعد تجميع الاتصالات بالإضافة إلى التحول إلى UDP حيث يمكن ذلك.
TCP مفيد للتطبيقات التي تتطلب موثوقية عالية ولكن ليست حرجة من حيث الوقت. بعض الأمثلة تشمل خوادم الويب، معلومات قواعد البيانات، SMTP، FTP، و SSH.
استخدم TCP بدلاً من UDP عندما:
- تحتاج لوصول جميع البيانات بشكل سليم
- ترغب في الاستفادة تلقائيًا من أفضل تقدير لإنتاجية الشبكة
بروتوكول بيانات المستخدم (UDP)
المصدر: كيفية إنشاء لعبة متعددة اللاعبين
UDP هو بروتوكول بدون اتصال. يتم ضمان تسليم البيانات (المماثلة للحزم) فقط على مستوى البيانات نفسها. قد تصل البيانات إلى وجهتها بترتيب غير صحيح أو قد لا تصل إطلاقاً. لا يدعم UDP التحكم في الازدحام. وبدون الضمانات التي يوفرها TCP، يكون UDP عادة أكثر كفاءة.
يمكن لـ UDP البث، أي إرسال البيانات إلى جميع الأجهزة على الشبكة الفرعية. هذا مفيد مع DHCP لأن العميل لم يستلم بعد عنوان IP، مما يمنع TCP من البث بدون عنوان IP.
UDP أقل موثوقية لكنه يعمل جيداً في حالات الاستخدام الفوري مثل VoIP، ودردشة الفيديو، والبث، والألعاب متعددة اللاعبين في الزمن الحقيقي.
استخدم UDP بدلاً من TCP عندما:
- تحتاج إلى أقل زمن انتقال ممكن
- البيانات المتأخرة أسوأ من فقدان البيانات
- ترغب في تنفيذ تصحيح الأخطاء الخاص بك
- الشبكات لبرمجة الألعاب
- الاختلافات الرئيسية بين بروتوكولي TCP و UDP
- الفرق بين TCP و UDP
- بروتوكول التحكم في النقل
- بروتوكول بيانات المستخدم
- توسيع memcache في فيسبوك
استدعاء الإجراء البعيد (RPC)
المصدر: Crack the system design interview
في RPC، يتسبب العميل بتنفيذ إجراء في مساحة عنوان مختلفة، عادةً على خادم بعيد. يتم برمجة الإجراء كما لو كان استدعاءً محليًا، مما يُخفي تفاصيل كيفية التواصل مع الخادم عن برنامج العميل. غالبًا ما تكون الاستدعاءات البعيدة أبطأ وأقل موثوقية من الاستدعاءات المحلية، لذا من المفيد التمييز بين استدعاءات RPC والاستدعاءات المحلية. من أطر عمل RPC الشائعة Protobuf، Thrift، و Avro.
RPC هو بروتوكول طلب-استجابة:
- برنامج العميل - يستدعي إجراء العميل الوكيل. يتم دفع المعاملات إلى المكدس مثل استدعاء إجراء محلي.
- إجراء العميل الوكيل - يقوم بتجميع (تعبئة) معرف الإجراء والمعاملات في رسالة طلب.
- وحدة الاتصال الخاصة بالعميل - يقوم نظام التشغيل بإرسال الرسالة من العميل إلى الخادم.
- وحدة الاتصال الخاصة بالخادم - يقوم نظام التشغيل بتمرير الحزم الواردة إلى إجراء الخادم الوكيل.
- إجراء الخادم الوكيل - يفك نتائج التعبئة، ويستدعي إجراء الخادم المطابق لمعرّف الإجراء ويمرر المعاملات المعطاة.
- استجابة الخادم تكرر الخطوات المذكورة أعلاه بترتيب عكسي.
GET /someoperation?data=anIdPOST /anotheroperation
{
"data":"anId";
"anotherdata": "another value"
}
تتركز تقنية RPC على عرض السلوكيات. غالبًا ما تُستخدم مكالمات RPC لأسباب تتعلق بالأداء في الاتصالات الداخلية، إذ يمكنك تصميم مكالمات أصلية خصيصًا لتلائم حالات الاستخدام لديك.
اختر مكتبة أصلية (تُعرف أيضًا بـ SDK) عندما:
- تعرف المنصة المستهدفة.
- ترغب في التحكم بكيفية الوصول إلى "المنطق" الخاص بك.
- ترغب في التحكم بكيفية معالجة الأخطاء خارج مكتبتك.
- الأداء وتجربة المستخدم النهائي هي أولويتك الأساسية.
#### العيوب: RPC
- يصبح عملاء RPC مرتبطين ارتباطًا وثيقًا بتنفيذ الخدمة.
- يجب تعريف واجهة جديدة لكل عملية أو حالة استخدام جديدة.
- يمكن أن يكون من الصعب تصحيح أخطاء RPC.
- قد لا تتمكن من الاستفادة من التقنيات الحالية مباشرة. على سبيل المثال، قد يتطلب الأمر جهدًا إضافيًا لضمان تخزين مكالمات RPC مؤقتًا بشكل صحيح في خوادم التخزين المؤقت مثل Squid.
نقل حالة التمثيل (REST)
REST هو نمط معماري يفرض نموذج العميل/الخادم حيث يتعامل العميل مع مجموعة من الموارد التي يديرها الخادم. يوفر الخادم تمثيلًا للموارد وإجراءات يمكنها إما تعديل أو الحصول على تمثيل جديد للموارد. يجب أن تكون جميع الاتصالات عديمة الحالة وقابلة للتخزين المؤقت.
هناك أربع خصائص لواجهة RESTful:
- تحديد الموارد (URI في HTTP) - استخدم نفس URI بغض النظر عن العملية.
- التغيير مع التمثيلات (الأفعال في HTTP) - استخدم الأفعال، الرؤوس، والجسم.
- رسالة خطأ ذاتية الوصف (استجابة الحالة في HTTP) - استخدم رموز الحالة، لا تعيد اختراع العجلة.
- HATEOAS (واجهة HTML لـ HTTP) - يجب أن تكون خدمة الويب الخاصة بك قابلة للوصول بالكامل عبر المتصفح.
GET /someresources/anIdPUT /someresources/anId
{"anotherdata": "another value"}
REST يركز على عرض البيانات. إنه يقلل من الترابط بين العميل/الخادم وغالبًا ما يُستخدم لواجهات برمجة التطبيقات العامة عبر HTTP. يستخدم REST طريقة أكثر عمومية وموحدة لعرض الموارد من خلال معرفات URI، والتمثيل عبر رؤوس الطلبات، والإجراءات عبر أفعال مثل GET، POST، PUT، DELETE، و PATCH. وبما أنه عديم الحالة، فإن REST ممتاز للتوسع الأفقي والتقسيم.#### العيوب: REST
- نظرًا لأن REST يركز على عرض البيانات، فقد لا يكون مناسبًا إذا لم تكن الموارد منظمة أو يمكن الوصول إليها بشكل طبيعي في تسلسل هرمي بسيط. على سبيل المثال، إرجاع جميع السجلات المحدثة خلال الساعة الماضية والتي تطابق مجموعة معينة من الأحداث لا يمكن التعبير عنه بسهولة كمسار. مع REST، من المرجح أن يتم تنفيذ ذلك بمزيج من مسار URI، ومعلمات الاستعلام، وربما جسم الطلب.
- يعتمد REST عادةً على عدد قليل من الأفعال (GET، POST، PUT، DELETE، و PATCH) والتي أحيانًا لا تتناسب مع حالتك الخاصة. على سبيل المثال، نقل المستندات المنتهية الصلاحية إلى مجلد الأرشيف قد لا يتناسب بشكل واضح مع هذه الأفعال.
- استرجاع الموارد المعقدة ذات التسلسلات الهرمية المتداخلة يتطلب عدة رحلات بين العميل والخادم لعرض رؤية واحدة، مثل استرجاع محتوى تدوينة والتعليقات عليها. بالنسبة لتطبيقات الجوال التي تعمل في ظروف شبكة متغيرة، فإن هذه الرحلات المتعددة غير مرغوبة للغاية.
- مع مرور الوقت، قد تتم إضافة المزيد من الحقول إلى استجابة واجهة برمجة التطبيقات وسيحصل العملاء الأقدم على جميع الحقول الجديدة، حتى تلك التي لا يحتاجون إليها، مما يؤدي إلى زيادة حجم الحمولة وبالتالي زيادة زمن الاستجابة.
مقارنة بين استدعاءات RPC وREST
| العملية | RPC | REST |
|---|---|---|
| التسجيل | POST /signup | POST /persons |
| الاستقالة | POST /resign
{
"personid": "1234"
} | DELETE /persons/1234 |
| قراءة شخص | GET /readPerson?personid=1234 | GET /persons/1234 |
| قراءة قائمة عناصر الشخص | GET /readUsersItemsList?personid=1234 | GET /persons/1234/items |
| إضافة عنصر إلى قائمة عناصر شخص | POST /addItemToUsersItemsList
{
"personid": "1234";
"itemid": "456"
} | POST /persons/1234/items
{
"itemid": "456"
} |
| تحديث عنصر | POST /modifyItem
{
"itemid": "456";
"key": "value"
} | PUT /items/456
{
"key": "value"
} |
| حذف عنصر | POST /removeItem
{
"itemid": "456"
} | DELETE /items/456 |
المصدر: هل تعرف حقًا لماذا تفضل REST على RPC
#### المصادر وقراءات إضافية: REST وRPC
- هل تعرف حقًا لماذا تفضل REST على RPC
- متى تكون الطرق الشبيهة بـ RPC أكثر ملاءمة من REST؟
- REST مقابل JSON-RPC
- تفنيد الأساطير حول RPC وREST
- ما هي عيوب استخدام REST
- اجتياز مقابلة تصميم الأنظمة
- ثريفت
- لماذا REST للاستخدام الداخلي وليس RPC
الأمان
هذه القسم يحتاج إلى بعض التحديثات. يرجى المساهمة!
الأمان موضوع واسع. ما لم تكن لديك خبرة كبيرة، أو خلفية في مجال الأمان، أو تتقدم لوظيفة تتطلب معرفة بالأمان، فغالبًا لن تحتاج لمعرفة أكثر من الأساسيات:
- التشفير أثناء النقل وفي حالة السكون.
- تنقية جميع مدخلات المستخدم أو أي معلمات مدخلة تظهر للمستخدم لمنع XSS وحقن SQL.
- استخدم الاستعلامات المبرمجة مسبقًا لمنع حقن SQL.
- استخدم مبدأ أقل الامتيازات.
المصدر(المصادر) وقراءة إضافية
الملحق
في بعض الأحيان سيتم سؤالك عن تقديرات "سريعة". على سبيل المثال، قد تحتاج لتحديد المدة اللازمة لإنشاء 100 صورة مصغرة من القرص أو مقدار الذاكرة التي سيستهلكها هيكل بيانات معين. جدول قوى الرقم اثنان وأرقام الكمون التي يجب أن يعرفها كل مبرمج هي مراجع مفيدة.
جدول قوى الرقم اثنان
Power Exact Value Approx Value Bytes
---------------------------------------------------------------
7 128
8 256
10 1024 1 thousand 1 KB
16 65,536 64 KB
20 1,048,576 1 million 1 MB
30 1,073,741,824 1 billion 1 GB
32 4,294,967,296 4 GB
40 1,099,511,627,776 1 trillion 1 TB#### المصدر(المصادر) وقراءة إضافية
أرقام الكمون التي يجب أن يعرفها كل مبرمج
Latency Comparison Numbers
--------------------------
L1 cache reference 0.5 ns
Branch mispredict 5 ns
L2 cache reference 7 ns 14x L1 cache
Mutex lock/unlock 25 ns
Main memory reference 100 ns 20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy 10,000 ns 10 us
Send 1 KB bytes over 1 Gbps network 10,000 ns 10 us
Read 4 KB randomly from SSD* 150,000 ns 150 us ~1GB/sec SSD
Read 1 MB sequentially from memory 250,000 ns 250 us
Round trip within same datacenter 500,000 ns 500 us
Read 1 MB sequentially from SSD* 1,000,000 ns 1,000 us 1 ms ~1GB/sec SSD, 4X memory
HDD seek 10,000,000 ns 10,000 us 10 ms 20x datacenter roundtrip
Read 1 MB sequentially from 1 Gbps 10,000,000 ns 10,000 us 10 ms 40x memory, 10X SSD
Read 1 MB sequentially from HDD 30,000,000 ns 30,000 us 30 ms 120x memory, 30X SSD
Send packet CA->Netherlands->CA 150,000,000 ns 150,000 us 150 msNotes
-----
1 ns = 10^-9 seconds
1 us = 10^-6 seconds = 1,000 ns
1 ms = 10^-3 seconds = 1,000 us = 1,000,000 ns
مقاييس مفيدة استنادًا إلى الأرقام أعلاه:- قراءة متسلسلة من HDD بسرعة 30 ميغابايت/ثانية
- قراءة متسلسلة من إيثرنت بسرعة 1 غيغابت/ثانية بسرعة 100 ميغابايت/ثانية
- قراءة متسلسلة من SSD بسرعة 1 غيغابايت/ثانية
- قراءة متسلسلة من الذاكرة الرئيسية بسرعة 4 غيغابايت/ثانية
- 6-7 رحلات ذهاب وإياب حول العالم في الثانية
- 2,000 رحلة ذهاب وإياب في الثانية داخل مركز البيانات
#### المصدر(المصادر) وقراءات إضافية
- أرقام الكمون التي يجب أن يعرفها كل مبرمج - 1
- أرقام الكمون التي يجب أن يعرفها كل مبرمج - 2
- تصاميم ودروس ونصائح من بناء أنظمة موزعة كبيرة
- نصائح هندسة البرمجيات من بناء أنظمة موزعة على نطاق واسع
أسئلة إضافية لمقابلات تصميم الأنظمة
أسئلة شائعة في مقابلات تصميم الأنظمة، مع روابط لمصادر حول كيفية حل كل منها.
| السؤال | المرجع/المراجع |
|---|---|
| صمم خدمة مزامنة ملفات مثل Dropbox | youtube.com |
| صمم محرك بحث مثل Google | queue.acm.org
stackexchange.com
ardendertat.com
stanford.edu |
| صمم زاحف ويب قابل للتوسع مثل Google | quora.com |
| صمم Google docs | code.google.com
neil.fraser.name |
| صمم مخزن مفاتيح/قيم مثل Redis | slideshare.net |
| صمم نظام تخزين مؤقت مثل Memcached | slideshare.net |
| صمم نظام توصية مثل نظام أمازون | hulu.com
ijcai13.org |
| صمم نظام tinyurl مثل Bitly | n00tc0d3r.blogspot.com |
| صمم تطبيق دردشة مثل WhatsApp | highscalability.com
| صمم نظام مشاركة الصور مثل Instagram | highscalability.com
highscalability.com |
| صمم وظيفة موجز الأخبار في Facebook | quora.com
quora.com
slideshare.net |
| صمم وظيفة الخط الزمني في Facebook | facebook.com
highscalability.com |
| صمم وظيفة الدردشة في Facebook | erlang-factory.com
facebook.com |
| صمم وظيفة بحث في الرسم البياني مثل فيسبوك | facebook.com
facebook.com
facebook.com |
| صمم شبكة توزيع محتوى مثل CloudFlare | figshare.com |
| صمم نظام المواضيع الرائجة مثل تويتر | michael-noll.com
snikolov .wordpress.com |
| صمم نظام توليد معرفات عشوائية | blog.twitter.com
github.com |
| إرجاع أعلى k طلبات خلال فترة زمنية معينة | cs.ucsb.edu
wpi.edu |
| صمم نظام يقدم بيانات من مراكز بيانات متعددة | highscalability.com |
| صمم لعبة ورق متعددة اللاعبين عبر الإنترنت | indieflashblog.com
buildnewgames.com |
| صمم نظام جمع القمامة | stuffwithstuff.com
washington.edu |
| صمم محدد معدل API | https://stripe.com/blog/ |
| صمم بورصة أسهم (مثل ناسداك أو بينانس) | Jane Street
Golang Implementation
Go Implementation |
| أضف سؤال تصميم نظام | ساهم |
بنى واقعية للأنظمة
مقالات حول كيفية تصميم الأنظمة في العالم الحقيقي.
المصدر: جداول زمنية تويتر على نطاق واسع
لا تركز على التفاصيل الدقيقة في المقالات التالية، بل:
- حدد المبادئ المشتركة، والتقنيات الشائعة، والأنماط ضمن هذه المقالات
- ادرس المشاكل التي يتم حلها بواسطة كل مكون، وأين ينجح، وأين يفشل
- راجع الدروس المستفادة
بنيات الشركات
| الشركة | المرجع/المراجع |
|---|---|
| أمازون | بنية أمازون |
| Cinchcast | إنتاج 1500 ساعة صوتية يوميًا |
| DataSift | تنقيب بيانات لحظي بسرعة 120,000 تغريدة في الثانية |
| Dropbox | كيف قمنا بتوسيع Dropbox |
| ESPN | تشغيل بسرعة 100,000 duh nuh nuhs في الثانية |
| Google | بنية Google |
| Instagram | 14 مليون مستخدم، تيرابايت من الصور
ما الذي يشغل Instagram |
| Justin.tv | بنية البث المباشر للفيديو في Justin.Tv |
| Facebook | توسيع memcached في Facebook
TAO: مستودع بيانات موزع لـ Facebook للرسم البياني الاجتماعي
تخزين الصور في Facebook
كيف يبث Facebook Live لـ 800,000 مشاهد متزامن |
| Flickr | بنية Flickr |
| Mailbox | من 0 إلى مليون مستخدم في 6 أسابيع |
| Netflix | نظرة شاملة على كامل مكدس Netflix
Netflix: ماذا يحدث عند الضغط على تشغيل؟ |
| Pinterest | من 0 إلى عشرات المليارات من مشاهدات الصفحات شهريًا
18 مليون زائر، نمو 10x، 12 موظفًا |
| Playfish | 50 مليون مستخدم شهريًا ويزداد العدد |
| PlentyOfFish | بنية PlentyOfFish |
| Salesforce | كيف يتعاملون مع 1.3 مليار معاملة يوميًا |
| Stack Overflow | بنية Stack Overflow |
| TripAdvisor | 40 مليون زائر، 200 مليون مشاهدة صفحة ديناميكية، 30 تيرابايت بيانات |
| Tumblr | 15 مليار مشاهدة صفحة شهريًا |
| Twitter | جعل Twitter أسرع بنسبة 10000 بالمئة
تخزين 250 مليون تغريدة يوميًا باستخدام MySQL
150 مليون مستخدم نشط، 300K QPS، تدفق بيانات بحجم 22 ميجابايت/ثانية
الخطوط الزمنية على نطاق واسع
البيانات الكبيرة والصغيرة في Twitter
العمليات في Twitter: التوسع لما بعد 100 مليون مستخدم
كيف يتعامل Twitter مع 3,000 صورة في الثانية |
| Uber | كيف توسع Uber منصة السوق اللحظية الخاصة بهم
دروس مستفادة من توسيع Uber لـ 2000 مهندس، 1000 خدمة، و8000 مستودع Git |
| WhatsApp | البنية التي اشترتها Facebook مقابل 19 مليار دولار |
| YouTube | توسعة YouTube
بنية YouTube |
مدونات هندسية للشركات
الهياكل المعمارية للشركات التي تجري مقابلات معها.>
قد تكون الأسئلة التي تواجهها من نفس المجال.
- هندسة Airbnb
- مطورو Atlassian
- مدونة AWS
- مدونة Bitly الهندسية
- مدونات Box
- مدونة مطوري Cloudera
- مدونة Dropbox التقنية
- الهندسة في Quora
- مدونة Ebay التقنية
- مدونة Evernote التقنية
- Etsy Code as Craft
- هندسة Facebook
- Flickr Code
- مدونة Foursquare الهندسية
- مدونة GitHub الهندسية
- مدونة Google Research
- مدونة Groupon الهندسية
- مدونة Heroku الهندسية
- مدونة Hubspot الهندسية
- High Scalability
- هندسة Instagram
- مدونة Intel البرمجية
- مدونة Jane Street التقنية
- هندسة LinkedIn
- هندسة Microsoft
- هندسة Python في Microsoft
- مدونة Netflix التقنية
- مدونة Paypal للمطورين
- مدونة Pinterest الهندسية
- مدونة Reddit
- مدونة Salesforce الهندسية
- مدونة Slack الهندسية
- مختبرات Spotify
- مدونة Stripe الهندسية
- مدونة هندسة تويليو
- هندسة تويتر
- مدونة هندسة أوبر
- مدونة هندسة ياهو
- مدونة هندسة يلب
- مدونة هندسة زينغا
هل ترغب في إضافة مدونة؟ لتجنب تكرار الجهد، يُنصح بإضافة مدونة شركتك إلى المستودع التالي:
تحت التطوير
مهتم بإضافة قسم أو المساعدة في إكمال قسم قيد التنفيذ؟ ساهم!
- الحوسبة الموزعة باستخدام MapReduce
- التجزئة المتسقة
- عملية التبعثر والتجميع
- ساهم
الشكر والتقدير
تم ذكر الشكر والمصادر في جميع أنحاء هذا المستودع.
شكر خاص لـ:
- Hired in tech
- Cracking the coding interview
- High scalability
- checkcheckzz/system-design-interview
- shashank88/system_design
- mmcgrana/services-engineering
- ورقة الغش لتصميم الأنظمة
- قائمة قراءة حول الأنظمة الموزعة
- Cracking the system design interview
معلومات التواصل
لا تتردد في التواصل معي لمناقشة أي مشاكل أو أسئلة أو تعليقات.
يمكنك العثور على معلومات الاتصال الخاصة بي على صفحة GitHub الخاصة بي.
الترخيص
أنا أقدم لك الشيفرة والموارد في هذا المستودع بموجب ترخيص مفتوح المصدر. نظرًا لأن هذا المستودع شخصي، فإن الترخيص الذي تحصل عليه للشيفرة والموارد هو مني وليس من جهة عملي (فيسبوك).
حقوق النشر 2017 دوني مارتن
رخصة المشاع الإبداعي النسبية 4.0 الدولية (CC BY 4.0)
http://creativecommons.org/licenses/by/4.0/
--- Tranlated By Open Ai Tx | Last indexed: 2025-08-09 ---