Web Analytics

system-design-primer

⭐ 318813 stars Arabic by donnemartin

English日本語简体中文繁體中文 | العَرَبِيَّة‎বাংলাPortuguês do BrasilDeutschελληνικάעבריתItaliano한국어فارسیPolskiрусский языкEspañolภาษาไทยTürkçetiếng ViệtFrançais | Add Translation

ساعد في ترجمة هذا الدليل!

مقدمة تصميم الأنظمة


الدافع

تعلم كيفية تصميم الأنظمة واسعة النطاق.
>
الاستعداد لمقابلة تصميم الأنظمة.

تعلم كيفية تصميم الأنظمة واسعة النطاق

تعلم كيفية تصميم الأنظمة القابلة للتوسع سيساعدك على أن تصبح مهندسًا أفضل.

تصميم الأنظمة موضوع واسع. هناك كمية هائلة من الموارد المنتشرة عبر الإنترنت حول مبادئ تصميم الأنظمة.

هذا المستودع هو مجموعة منظمة من الموارد لمساعدتك في تعلم كيفية بناء الأنظمة على نطاق واسع.

تعلم من مجتمع المصادر المفتوحة

هذا مشروع مفتوح المصدر يتم تحديثه باستمرار.

المساهمات مرحب بها!

الاستعداد لمقابلة تصميم الأنظمة

بالإضافة إلى مقابلات البرمجة، يعد تصميم الأنظمة عنصرًا مطلوبًا في عملية المقابلة التقنية في العديد من شركات التقنية.

تمرن على أسئلة تصميم الأنظمة الشائعة في المقابلات وقارن نتائجك مع الحلول النموذجية: مناقشات، أكواد، ومخططات.

مواضيع إضافية للاستعداد للمقابلات:

بطاقات أنكي التعليمية


تستخدم حزم بطاقات أنكي المقدمة التكرار المتباعد لمساعدتك في تذكر مفاهيم تصميم الأنظمة الرئيسية.

مناسبة جداً للاستخدام أثناء التنقل.

مورد البرمجة: تحديات البرمجة التفاعلية

هل تبحث عن موارد لمساعدتك في التحضير لـ مقابلة البرمجة؟


اطلع على المستودع الشقيق تحديات البرمجة التفاعلية، والذي يحتوي أيضًا على حزمة أنكي إضافية:

المساهمة

تعلم من المجتمع.

لا تتردد في إرسال طلبات السحب للمساعدة في:

المحتوى الذي يحتاج إلى بعض التحسين تم وضعه قيد التطوير.

راجع إرشادات المساهمة.

فهرس مواضيع تصميم الأنظمة

ملخصات لمواضيع مختلفة في تصميم الأنظمة، تشمل الإيجابيات والسلبيات. كل شيء عبارة عن مفاضلات.
>
يحتوي كل قسم على روابط لمصادر أكثر تعمقاً.


دليل الدراسة

مواضيع مقترحة للمراجعة بناءً على الجدول الزمني لمقابلتك (قصير، متوسط، طويل).

Imgur

س: هل يجب أن أعرف كل شيء هنا من أجل المقابلات؟

ج: لا، ليس عليك معرفة كل شيء هنا للتحضير للمقابلة.

ما يتم سؤالك عنه في المقابلة يعتمد على متغيرات مثل:

عادة ما يُتوقع من المرشحين الأكثر خبرة أن يعرفوا المزيد عن تصميم الأنظمة. قد يُتوقع من المعماريين أو قادة الفرق معرفة أكثر من المساهمين الفرديين. من المرجح أن يكون لدى شركات التقنية الكبرى جولة واحدة أو أكثر من مقابلات التصميم.

ابدأ بشكل عام ثم تعمق في بعض المجالات. من المفيد معرفة القليل عن مختلف مواضيع تصميم الأنظمة الرئيسية. عدّل الدليل التالي بناءً على جدولك الزمني وخبرتك، والوظائف التي تجري مقابلات من أجلها، والشركات التي تتقدم للعمل لديها.

| | قصير | متوسط | طويل | |---|---|---|---| | اقرأ مواضيع تصميم الأنظمة لفهم عام لكيفية عمل الأنظمة | :+1: | :+1: | :+1: | | اقرأ بعض المقالات في مدونات هندسة الشركات للشركات التي تجري مقابلات معها | :+1: | :+1: | :+1: | | اقرأ بعض الهياكل المعمارية الواقعية | :+1: | :+1: | :+1: | | راجع كيفية التعامل مع سؤال مقابلة تصميم الأنظمة | :+1: | :+1: | :+1: | | تدرب على أسئلة مقابلة تصميم الأنظمة مع حلول | بعض | العديد | معظم | | تدرب على أسئلة مقابلة التصميم الكائني مع حلول | بعض | العديد | معظم | | راجع أسئلة إضافية لمقابلة تصميم الأنظمة | بعض | العديد | معظم |

كيفية التعامل مع سؤال مقابلة تصميم الأنظمة

كيف تتعامل مع سؤال مقابلة تصميم الأنظمة.

مقابلة تصميم الأنظمة هي محادثة مفتوحة. من المتوقع أن تقودها بنفسك.

يمكنك استخدام الخطوات التالية لتوجيه النقاش. للمساعدة في ترسيخ هذه العملية، اعمل من خلال قسم أسئلة مقابلة تصميم الأنظمة مع حلول باستخدام الخطوات التالية.

الخطوة 1: تحديد حالات الاستخدام والقيود والافتراضات

اجمع المتطلبات وحدد نطاق المشكلة. اطرح أسئلة لتوضيح حالات الاستخدام والقيود. ناقش الافتراضات.

الخطوة 2: إنشاء تصميم عالي المستوى

ارسم تصميمًا عالي المستوى يضم جميع المكونات الهامة.

الخطوة 3: تصميم المكونات الأساسية

تعمق في التفاصيل لكل مكون أساسي. على سبيل المثال، إذا طُلب منك تصميم خدمة تقصير الروابط، ناقش:

الخطوة 4: توسيع نطاق التصميم

حدد عنق الزجاجة وعالجها بناءً على القيود. على سبيل المثال، هل تحتاج إلى ما يلي لمعالجة مشاكل قابلية التوسع؟

ناقش الحلول المحتملة والمفاضلات. كل شيء عبارة عن مفاضلة. عالج نقاط الاختناق باستخدام مبادئ تصميم الأنظمة القابلة للتوسع.

الحسابات التقريبية السريعة

قد يُطلب منك إجراء بعض التقديرات يدويًا. راجع الملحق للموارد التالية:

المصدر(المصادر) ومزيد من القراءة

اطلع على الروابط التالية للحصول على فكرة أفضل عما يمكن توقعه:

أسئلة مقابلة تصميم النظام مع حلول

أسئلة مقابلة تصميم النظام الشائعة مع مناقشات نموذجية، وكود، ومخططات.
>
الحلول مرتبطة بالمحتوى في مجلد solutions/.

| السؤال | | |---|---| | صمم Pastebin.com (أو Bit.ly) | الحل | | صمم الجدول الزمني والبحث في تويتر (أو خلاصة وبحث فيسبوك) | الحل | | صمم زاحف ويب | الحل | | صمم Mint.com | الحل | | صمم هياكل البيانات لشبكة اجتماعية | الحل | | صمم متجر القيم الرئيسية لمحرك بحث | الحل | | صمم ميزة تصنيف المبيعات حسب الفئة في أمازون | الحل | | صمم نظامًا يتوسع ليخدم ملايين المستخدمين على AWS | الحل | | أضف سؤالًا حول تصميم النظام | ساهم |

صمم Pastebin.com (أو Bit.ly)

عرض التمرين والحل

Imgur

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

عرض التمرين والحل

Imgur

صمم زاحف ويب

عرض التمرين والحل

Imgur

Design Mint.com

View exercise and solution

Imgur

Design the data structures for a social network

View exercise and solution

Imgur

Design a key-value store for a search engine

View exercise and solution

Imgur

Design Amazon's sales ranking by category feature

View exercise and solution

Imgur

Design a system that scales to millions of users on AWS

View exercise and solution

Imgur

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


المصدر: مراجعة نظرية 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).

تقدم خدمات مثل CloudFlare و Route 53 خدمات DNS مُدارة. يمكن لبعض خدمات DNS توجيه حركة المرور عبر طرق متنوعة:

العيوب: DNS

المصادر وقراءات إضافية

شبكة توزيع المحتوى


المصدر: لماذا تستخدم CDN

شبكة توزيع المحتوى (CDN) هي شبكة موزعة عالميًا من خوادم البروكسي، تقدم المحتوى من مواقع أقرب إلى المستخدم. عادةً، يتم تقديم الملفات الثابتة مثل HTML/CSS/JS والصور والفيديوهات من CDN، رغم أن بعض شبكات CDN مثل CloudFront من أمازون تدعم المحتوى الديناميكي. ستحدد عملية حل DNS للموقع أي خادم يجب أن يتواصل معه العميل.

تقديم المحتوى من خلال شبكات CDN يمكن أن يحسن الأداء بشكل كبير بطريقتين:

شبكات CDN الدفعية (Push CDNs)

تستقبل شبكات CDN الدفعية محتوى جديدًا كلما حدثت تغييرات على خادمك. تتحمل المسؤولية الكاملة لتوفير المحتوى، وترفعه مباشرة إلى CDN وتعيد كتابة عناوين URL لتشير إلى CDN. يمكنك ضبط توقيت انتهاء صلاحية المحتوى وتحديثه. يتم رفع المحتوى فقط عندما يكون جديدًا أو تم تغييره، مما يقلل الحركة، لكنه يزيد التخزين.

المواقع ذات الحركة القليلة أو المواقع ذات المحتوى الذي لا يتغير كثيرًا تعمل بشكل جيد مع شبكات CDN الدفعية. يتم وضع المحتوى على CDN مرة واحدة، بدلاً من إعادة تحميله بشكل دوري.

شبكات CDN السحب (Pull CDNs)

تسحب شبكات CDN السحب المحتوى الجديد من خادمك عندما يطلبه أول مستخدم. تترك المحتوى على خادمك وتعيد كتابة عناوين URL لتشير إلى CDN. ينتج عن ذلك طلب أبطأ حتى يتم تخزين المحتوى مؤقتًا على CDN.

يحدد زمن البقاء (TTL) مدة تخزين المحتوى مؤقتًا. تقلل شبكات CDN السحب مساحة التخزين على CDN، لكنها قد تخلق حركة زائدة إذا انتهت صلاحية الملفات وتم سحبها قبل أن تتغير فعليًا.

المواقع ذات الحركة العالية تعمل جيدًا مع شبكات CDN السحب، حيث يتم توزيع الحركة بشكل أكثر توازنًا مع بقاء المحتوى الذي تم طلبه مؤخرًا فقط على CDN.

العيوب: CDN

المصادر وقراءات إضافية

موازن التحميل


المصدر: أنماط تصميم الأنظمة القابلة للتوسع

يقوم موازن التحميل بتوزيع طلبات العملاء الواردة على موارد الحوسبة مثل خوادم التطبيقات وقواعد البيانات. في كل حالة، يعيد موازن التحميل الاستجابة من مورد الحوسبة إلى العميل المناسب. موازنات التحميل فعّالة في:

يمكن تنفيذ موازنات التحميل بواسطة أجهزة (مكلفة) أو بواسطة برامج مثل HAProxy.

تشمل الفوائد الإضافية:

لحماية النظام من الأعطال، من الشائع إعداد عدة موازنات تحميل، إما في وضع نشط-احتياطي أو نشط-نشط.

يمكن لموازنات التحميل توجيه الحركة بناءً على مقاييس متنوعة، بما في ذلك:

موازنة التحميل في الطبقة الرابعة

تقوم موازنات التحميل في الطبقة الرابعة بالنظر إلى المعلومات في طبقة النقل لتحديد كيفية توزيع الطلبات. عادةً، يشمل ذلك عناوين IP المصدر والوجهة، والمنافذ في الترويسة، وليس محتوى الحزمة. تقوم موازنات التحميل في الطبقة الرابعة بتمرير حزم الشبكة من وإلى الخادم العلوي، مع إجراء ترجمة عنوان الشبكة (NAT).

موازنة التحميل في الطبقة السابعة

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

على حساب المرونة، يتطلب موازنة التحميل من الطبقة الرابعة وقتًا وموارد حسابية أقل من الطبقة السابعة، على الرغم من أن تأثير الأداء يمكن أن يكون ضئيلًا على الأجهزة الحديثة الشائعة.

التوسيع الأفقي

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

#### العيب/العيوب: التوسيع الأفقي

العيب/العيوب: موازن التحميل

المصدر(المصادر) وقراءات إضافية

البروكسي العكسي (خادم الويب)


المصدر: ويكيبيديا

الخادم العكسي هو خادم ويب يقوم بمركزة الخدمات الداخلية ويقدم واجهات موحدة للجمهور. يتم تمرير الطلبات من العملاء إلى خادم يمكنه تلبيتها قبل أن يعيد الخادم العكسي استجابة الخادم إلى العميل.

تشمل الفوائد الإضافية:

موزع الأحمال مقابل الخادم العكسي

العيب/العيوب: الخادم العكسي

المصدر/المصادر وقراءة إضافية

طبقة التطبيق


المصدر: مقدمة حول هندسة الأنظمة للتوسع

فصل طبقة الويب عن طبقة التطبيق (المعروفة أيضاً بطبقة المنصة) يسمح لك بتوسيع وتكوين كل طبقة بشكل مستقل. إضافة واجهة برمجة تطبيقات جديدة يؤدي إلى إضافة خوادم تطبيقات دون الحاجة بالضرورة إلى إضافة خوادم ويب إضافية. يدعو مبدأ المسؤولية الواحدة إلى خدمات صغيرة ومستقلة تعمل معاً. الفرق الصغيرة ذات الخدمات الصغيرة يمكنها التخطيط بشكل أكثر جرأة للنمو السريع.

العاملون في طبقة التطبيق يساعدون أيضاً في تمكين اللا تزامن.

الخدمات المصغرة

ذات صلة بهذا النقاش هي الخدمات المصغرة، التي يمكن وصفها بأنها مجموعة من الخدمات الصغيرة والمستقلة التي يمكن نشرها بشكل منفصل. كل خدمة تعمل في عملية فريدة وتتواصل عبر آلية محددة وخفيفة الوزن لتحقيق هدف تجاري. 1

على سبيل المثال، قد يكون لدى Pinterest الخدمات المصغرة التالية: ملف المستخدم، المتابعون، الخلاصة، البحث، رفع الصور، إلخ.

اكتشاف الخدمة

أنظمة مثل Consul، Etcd، وZookeeper يمكن أن تساعد الخدمات في العثور على بعضها البعض عن طريق تتبع الأسماء والعناوين والمنافذ المسجلة. تساعد فحوصات الصحة في التحقق من سلامة الخدمة وغالباً ما يتم ذلك باستخدام نقطة نهاية HTTP. كل من Consul وEtcd يحتويان على مخزن القيم المفتاحية مدمج يمكن أن يكون مفيداً لتخزين قيم التكوين والبيانات المشتركة الأخرى.

العيوب: طبقة التطبيق

المصادر ومزيد من القراءة

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


المصدر: التوسع حتى أول 10 ملايين مستخدم

نظام إدارة قواعد البيانات العلائقية (RDBMS)

قاعدة البيانات العلائقية مثل SQL هي مجموعة من عناصر البيانات منظمة في جداول.

ACID هو مجموعة من خصائص المعاملات في قواعد البيانات العلائقية.

هناك العديد من التقنيات لتوسيع قاعدة البيانات العلائقية: تكرار السيد-التابع، تكرار السيد-سيد، الاتحاد، التجزئة، إلغاء التطبيع، و ضبط SQL.

#### تكرار السيد-التابع

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


المصدر: قابلية التوسع، التوفر، الاستقرار، الأنماط

##### العيب/العيوب: تكرار السيد-التابع

#### تكرار السيد-سيد

كلا السيدين يخدمان عمليات القراءة والكتابة ويتنسيقان مع بعضهما البعض في عمليات الكتابة. إذا توقف أي من السيدين، يمكن للنظام الاستمرار في العمل مع عمليات القراءة والكتابة.


المصدر: قابلية التوسع، التوفر، الاستقرار، الأنماط

##### العيب/العيوب: تكرار السيد-سيد

##### العيوب: النسخ المتماثل

##### المصادر وقراءات إضافية: النسخ المتماثل

#### التقسيم الفيدرالي


المصدر: التوسع حتى أول 10 ملايين مستخدم

يقوم التقسيم الفيدرالي (أو التقسيم الوظيفي) بتقسيم قواعد البيانات حسب الوظيفة. على سبيل المثال، بدلاً من قاعدة بيانات واحدة ضخمة، يمكنك أن تملك ثلاث قواعد بيانات: المنتديات، المستخدمون، و المنتجات، مما يؤدي إلى تقليل حركة القراءة والكتابة على كل قاعدة بيانات وبالتالي تقليل تأخر النسخ. تؤدي قواعد البيانات الأصغر إلى المزيد من البيانات التي يمكن أن تتناسب مع الذاكرة، مما يؤدي بدوره إلى المزيد من ضربات التخزين المؤقت نتيجة لتحسين موقعية التخزين المؤقت. ومع عدم وجود خادم رئيسي مركزي واحد لتسلسل عمليات الكتابة يمكنك الكتابة بالتوازي، مما يزيد من معدل نقل البيانات.

##### العيوب: التقسيم الفيدرالي

##### المصادر وقراءات إضافية: التقسيم الفيدرالي

#### التقسيم (Sharding)


المصدر: القابلية للتوسع، التوفر، الاستقرار، الأنماط

يعمل التقسيم الأفقي (Sharding) على توزيع البيانات عبر قواعد بيانات مختلفة بحيث يمكن لكل قاعدة بيانات إدارة جزء فرعي فقط من البيانات. على سبيل المثال، قاعدة بيانات المستخدمين، مع زيادة عدد المستخدمين، تتم إضافة المزيد من الشرائح إلى الكتلة.

مماثل لمزايا الاتحاد، يؤدي التقسيم الأفقي إلى تقليل حركة المرور للقراءة والكتابة، وتقليل النسخ المتماثل، وزيادة نجاحات ذاكرة التخزين المؤقت. كما يقل حجم الفهرس، مما يحسن الأداء عمومًا مع استعلامات أسرع. إذا تعطلت إحدى الشرائح، تبقى الشرائح الأخرى تعمل، على الرغم من أنك ستحتاج إلى إضافة نوع من النسخ المتماثل لتجنب فقدان البيانات. مثل الاتحاد، لا يوجد رئيس مركزي واحد لتسلسل الكتابات، مما يتيح لك الكتابة بشكل متوازي مع زيادة الإنتاجية.

من الطرق الشائعة لتقسيم جدول المستخدمين هي إما عبر الحرف الأول من اسم المستخدم الأخير أو الموقع الجغرافي للمستخدم.

##### العيوب: التقسيم الأفقي

##### المصادر والمزيد من القراءة: التقسيم الأفقي

#### إلغاء التطبيع

يحاول إلغاء التطبيع تحسين أداء القراءة على حساب بعض أداء الكتابة. يتم كتابة نسخ زائدة من البيانات في جداول متعددة لتجنب عمليات الربط المكلفة. بعض أنظمة قواعد البيانات العلائقية مثل PostgreSQL وOracle تدعم العروض المادية التي تتولى مهمة تخزين المعلومات الزائدة والحفاظ على نسخ متسقة منها.

بمجرد توزيع البيانات باستخدام تقنيات مثل الاتحاد والتقسيم الأفقي، يصبح إدارة عمليات الربط عبر مراكز البيانات أكثر تعقيدًا. قد يتجنب إلغاء التطبيع الحاجة لمثل هذه العمليات المعقدة.

في معظم الأنظمة، يمكن أن تتجاوز عمليات القراءة عمليات الكتابة بنسبة 100:1 أو حتى 1000:1. عملية قراءة تؤدي إلى ربط قاعدة بيانات معقد يمكن أن تكون مكلفة جدًا، وتقضي وقتًا كبيرًا في عمليات الأقراص.

##### العيوب: إلغاء التطبيع

###### المصادر والمزيد من القراءة: إلغاء التطبيع

#### ضبط أداء SQL

ضبط أداء SQL هو موضوع واسع وقد كُتبت العديد من الكتب كمرجع.

من المهم إجراء اختبارات الأداء وتحليل الأداء لمحاكاة وكشف نقاط الاختناق.

قد تؤدي اختبارات الأداء وتحليل الأداء إلى الاقتراح بالتحسينات التالية.

##### تحسين بنية قاعدة البيانات

##### استخدم الفهارس الجيدة

##### تجنب عمليات الربط المكلفة

##### تقسيم الجداول

##### ضبط ذاكرة التخزين المؤقت للاستعلامات

##### المصدر(المصادر) ومزيد من القراءة: ضبط الاستعلامات في SQL

NoSQL

NoSQL هو مجموعة من عناصر البيانات التي تمثل في مخزن القيم المفتاحية أو مخزن المستندات أو مخزن الأعمدة العريضة أو قاعدة بيانات الرسم البياني. يتم إلغاء التطبيع للبيانات، وعادةً ما تتم عمليات الربط في كود التطبيق. معظم قواعد بيانات NoSQL تفتقر إلى المعاملات الحقيقية من نوع ACID وتفضل الاتساق النهائي.

يتم استخدام مصطلح BASE غالبًا لوصف خصائص قواعد بيانات NoSQL. بالمقارنة مع نظرية CAP، تختار BASE التوفر على حساب الاتساق.

بالإضافة إلى اختيار SQL أو NoSQL، من المفيد فهم نوع قاعدة بيانات NoSQL الأنسب لحالة الاستخدام الخاصة بك. سنستعرض مخازن القيم المفتاحية و مخازن المستندات و مخازن الأعمدة العريضة و قواعد بيانات الرسم البياني في القسم التالي.

#### مخزن القيم المفتاحية

التجريد: جدول تجزئة

عادةً ما يسمح مخزن القيم المفتاحية بعمليات قراءة وكتابة من نوع O(1) وغالبًا ما يكون مدعومًا بالذاكرة أو SSD. يمكن لمخازن البيانات الاحتفاظ بالمفاتيح بترتيب معجمي، مما يسمح باسترجاع نطاقات المفاتيح بكفاءة. يمكن لمخازن القيم المفتاحية السماح بتخزين بيانات وصفية مع القيمة.

تقدم مخازن القيم المفتاحية أداء عالي وغالبًا ما تُستخدم لنماذج البيانات البسيطة أو البيانات المتغيرة بسرعة، مثل طبقة التخزين المؤقتة داخل الذاكرة. ونظرًا لأنها توفر مجموعة محدودة من العمليات، يتم تحويل التعقيد إلى طبقة التطبيق إذا كانت هناك حاجة إلى عمليات إضافية.

يعد مخزن القيم المفتاحية أساسًا للأنظمة الأكثر تعقيدًا مثل مخزن المستندات، وفي بعض الحالات، قاعدة بيانات الرسم البياني.

##### المصدر(المصادر) ومزيد من القراءة: مخزن القيم المفتاحية

#### مخزن المستندات

التجريد: مخزن مفتاح-قيمة حيث تُخزن المستندات كقيم

يرتكز مخزن المستندات حول المستندات (XML، JSON، ثنائي، إلخ)، حيث يخزن المستند جميع المعلومات لكائن معين. توفر مخازن المستندات واجهات برمجة التطبيقات أو لغة استعلام للاستعلام بناءً على البنية الداخلية للمستند نفسه. ملاحظة، العديد من مخازن المفتاح-قيمة تتضمن ميزات للعمل مع بيانات التعريف للقيمة، مما يطمس الحدود بين هذين النوعين من التخزين.

استنادًا إلى التنفيذ الأساسي، يتم تنظيم المستندات حسب المجموعات أو العلامات أو بيانات التعريف أو الأدلة. وعلى الرغم من إمكانية تنظيم المستندات أو تجميعها معًا، قد تحتوي المستندات على حقول مختلفة تمامًا عن بعضها البعض.

بعض مخازن المستندات مثل MongoDB و CouchDB تقدم أيضًا لغة شبيهة بـ SQL لتنفيذ استعلامات معقدة. DynamoDB تدعم كل من المفتاح-قيمة والمستندات.

توفر مخازن المستندات مرونة عالية وغالبًا ما تُستخدم للعمل مع البيانات المتغيرة بين الحين والآخر.

##### المصدر(المصادر) وقراءة إضافية: مخزن المستندات

#### مخزن الأعمدة الواسعة


المصدر: SQL & NoSQL، تاريخ موجز

التجريد: خريطة متداخلة ColumnFamily>

الوحدة الأساسية للبيانات في مخزن الأعمدة الواسعة هي العمود (زوج اسم/قيمة). يمكن تجميع الأعمدة في عائلات الأعمدة (مماثلة لجدول SQL). عائلات الأعمدة الفائقة تجمع عائلات الأعمدة معًا. يمكنك الوصول إلى كل عمود بشكل مستقل باستخدام مفتاح الصف، وتشكل الأعمدة ذات مفتاح الصف نفسه صفًا. كل قيمة تحتوي على طابع زمني لإصدار النسخ وحل النزاعات.

قدمت Google Bigtable كأول مخزن أعمدة واسع، والذي أثر على HBase مفتوح المصدر والمستخدم غالبًا في نظام Hadoop، و Cassandra من Facebook. مخازن مثل BigTable وHBase وCassandra تحتفظ بالمفاتيح بترتيب معجمي، مما يسمح باسترجاع فعال لنطاقات مفاتيح انتقائية.

تقدم مخازن الأعمدة الواسعة توافرية عالية وقابلية توسع مرتفعة. وغالبًا ما تُستخدم لمجموعات البيانات الضخمة جدًا.

##### المصدر(المصادر) وقراءة إضافية: مخزن الأعمدة الواسعة

#### قاعدة بيانات الرسم البياني


المصدر: قاعدة بيانات الرسم البياني

التجريد: رسم بياني

في قاعدة بيانات الرسم البياني، كل عقدة هي سجل وكل قوس هو علاقة بين عقدتين. قواعد بيانات الرسم البياني مُحسّنة لتمثيل العلاقات المعقدة مع العديد من المفاتيح الأجنبية أو العلاقات المتعددة إلى المتعددة.

توفر قواعد بيانات الرسم البياني أداءً عاليًا لنماذج البيانات ذات العلاقات المعقدة، مثل الشبكات الاجتماعية. وهي حديثة نسبيًا ولم تُستخدم على نطاق واسع بعد؛ وقد يكون من الصعب العثور على أدوات وموارد التطوير. العديد من الرسوم البيانية يمكن الوصول إليها فقط عبر واجهات REST.

##### المصدر(المصادر) وقراءة إضافية: الرسم البياني

#### المصدر(المصادر) وقراءة إضافية: NoSQL

SQL أو NoSQL


المصدر: الانتقال من RDBMS إلى NoSQL

أسباب استخدام SQL:

أسباب استخدام NoSQL:

بيانات نموذجية مناسبة لـNoSQL:

##### المصدر(المصادر) وقراءة إضافية: SQL أو NoSQL

التخزين المؤقت


المصدر: أنماط تصميم الأنظمة القابلة للتوسع

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

غالبًا ما تستفيد قواعد البيانات من توزيع موحد للقراءات والكتابات عبر أقسامها. يمكن أن تتسبب العناصر الشائعة في تحريف التوزيع، مما يؤدي إلى اختناقات. وضع ذاكرة تخزين مؤقت أمام قاعدة البيانات يمكن أن يساعد في امتصاص الأحمال غير المتساوية وارتفاعات حركة المرور.

التخزين المؤقت لدى العميل

يمكن أن توجد ذاكرات التخزين المؤقت على جانب العميل (نظام التشغيل أو المتصفح)، أو جانب الخادم، أو في طبقة تخزين مؤقت منفصلة.

التخزين المؤقت لشبكات CDN

تُعتبر شبكات CDN نوعًا من أنواع التخزين المؤقت.

التخزين المؤقت لخادم الويب

يمكن أن تقدم البروكسيات العكسية وذاكرات التخزين المؤقت مثل Varnish المحتوى الثابت والديناميكي مباشرةً. يمكن لخوادم الويب أيضًا تخزين الطلبات مؤقتًا، وإرجاع الردود دون الحاجة إلى التواصل مع خوادم التطبيقات.

التخزين المؤقت لقاعدة البيانات

عادةً ما تتضمن قاعدة البيانات بعض مستوى من التخزين المؤقت في الإعداد الافتراضي، محسّن لحالة استخدام عامة. يمكن أن يؤدي تعديل هذه الإعدادات لأنماط الاستخدام المحددة إلى تعزيز الأداء بشكل أكبر.

التخزين المؤقت للتطبيق

تُعد ذاكرات التخزين المؤقت داخل الذاكرة مثل Memcached و Redis مخازن مفاتيح وقيم بين تطبيقك وتخزين بياناتك. نظرًا لأن البيانات محفوظة في ذاكرة الوصول العشوائي (RAM)، فهي أسرع بكثير من قواعد البيانات التقليدية التي يتم فيها تخزين البيانات على القرص. الذاكرة العشوائية محدودة أكثر من القرص، لذا يمكن لخوارزميات إبطال التخزين المؤقت مثل الأقل استخدامًا مؤخرًا (LRU)) أن تساعد في إبطال الإدخالات "الباردة" والحفاظ على البيانات "الساخنة" في الذاكرة.

يمتلك Redis الميزات الإضافية التالية:

هناك مستويات متعددة يمكن التخزين المؤقت فيها وتقع ضمن فئتين رئيسيتين: استعلامات قاعدة البيانات والكائنات:

بشكل عام، يجب أن تحاول تجنب التخزين المؤقت المعتمد على الملفات، لأنه يجعل الاستنساخ والتوسعة التلقائية أكثر صعوبة.

التخزين المؤقت على مستوى استعلام قاعدة البيانات

في كل مرة تستعلم فيها قاعدة البيانات، قم بتجزئة الاستعلام كمفتاح واحتفظ بالنتيجة في التخزين المؤقت. هذه الطريقة تعاني من مشكلات انتهاء الصلاحية:

التخزين المؤقت على مستوى الكائن

اعتبر بياناتك ككائن، مشابه لما تفعله في شفرة تطبيقك. قم بجعل تطبيقك يجمع مجموعة البيانات من قاعدة البيانات إلى كائن من الفئة أو بنية بيانات:

اقتراحات لما يمكن تخزينه مؤقتًا:

متى يتم تحديث التخزين المؤقت

نظرًا لأنك تستطيع فقط تخزين كمية محدودة من البيانات في التخزين المؤقت، ستحتاج إلى تحديد استراتيجية تحديث التخزين المؤقت الأنسب لحالة الاستخدام لديك.

#### التخزين المؤقت الجانبي (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

#### الكتابة عبر الذاكرة المؤقتة (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)
تعد الكتابة المباشرة عملية بطيئة بشكل عام بسبب عملية الكتابة، لكن عمليات القراءة اللاحقة للبيانات التي تم كتابتها للتو تكون سريعة. عادةً ما يكون المستخدمون أكثر تسامحًا مع التأخير عند تحديث البيانات مقارنة بقراءتها. البيانات في ذاكرة التخزين المؤقت ليست قديمة.

##### العيب/العيوب: الكتابة المباشرة

#### الكتابة المتأخرة (الكتابة الخلفية)


المصدر: الأنماط المتعلقة بالقابلية للتوسع، التوفر، الاستقرار

في الكتابة المتأخرة، يقوم التطبيق بما يلي:

##### العيب/العيوب: الكتابة المتأخرة

#### التحديث المسبق


المصدر: من ذاكرة التخزين المؤقت إلى شبكة البيانات داخل الذاكرة

يمكنك تكوين ذاكرة التخزين المؤقت لتحديث أي إدخال تم الوصول إليه مؤخرًا تلقائيًا قبل انتهاء صلاحيته.

يمكن أن يؤدي التحديث المسبق إلى تقليل التأخير مقارنة بالقراءة المباشرة إذا تمكنت ذاكرة التخزين المؤقت من التنبؤ بدقة بالعناصر التي من المرجح أن تكون مطلوبة في المستقبل.

##### العيب/العيوب: التحديث المسبق

العيوب: التخزين المؤقت

المصادر وقراءات إضافية

اللا تزامنية


المصدر: مقدمة في هندسة الأنظمة القابلة للتوسع

تساعد سير العمل غير المتزامن في تقليل أوقات الطلبات للعمليات المكلفة التي قد تُنفذ بخط واحد. كما يمكن أن تساعد أيضاً في تنفيذ الأعمال المستغرقة للوقت مسبقاً، مثل التجميع الدوري للبيانات.

طوابير الرسائل

تستقبل طوابير الرسائل الرسائل وتحتفظ بها وتوصلها. إذا كانت العملية بطيئة جداً ليتم تنفيذها بخط واحد، يمكنك استخدام طابور رسائل مع سير العمل التالي:

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

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 التحكم في التدفق) والتحكم في الازدحام. هذه الضمانات تتسبب في تأخيرات وتؤدي عادة إلى نقل أقل كفاءة من UDP.

لضمان إنتاجية عالية، يمكن لخوادم الويب الاحتفاظ بعدد كبير من اتصالات 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

استدعاء الإجراء البعيد (RPC)


المصدر: Crack the system design interview

في RPC، يتسبب العميل بتنفيذ إجراء في مساحة عنوان مختلفة، عادةً على خادم بعيد. يتم برمجة الإجراء كما لو كان استدعاءً محليًا، مما يُخفي تفاصيل كيفية التواصل مع الخادم عن برنامج العميل. غالبًا ما تكون الاستدعاءات البعيدة أبطأ وأقل موثوقية من الاستدعاءات المحلية، لذا من المفيد التمييز بين استدعاءات RPC والاستدعاءات المحلية. من أطر عمل RPC الشائعة Protobuf، Thrift، و Avro.

RPC هو بروتوكول طلب-استجابة:

نماذج استدعاءات RPC:

GET /someoperation?data=anId

POST /anotheroperation { "data":"anId"; "anotherdata": "another value" }

تتركز تقنية RPC على عرض السلوكيات. غالبًا ما تُستخدم مكالمات RPC لأسباب تتعلق بالأداء في الاتصالات الداخلية، إذ يمكنك تصميم مكالمات أصلية خصيصًا لتلائم حالات الاستخدام لديك.

اختر مكتبة أصلية (تُعرف أيضًا بـ SDK) عندما:

غالبًا ما تُستخدم واجهات برمجة التطبيقات HTTP التي تتبع REST للواجهات العامة.

#### العيوب: RPC

نقل حالة التمثيل (REST)

REST هو نمط معماري يفرض نموذج العميل/الخادم حيث يتعامل العميل مع مجموعة من الموارد التي يديرها الخادم. يوفر الخادم تمثيلًا للموارد وإجراءات يمكنها إما تعديل أو الحصول على تمثيل جديد للموارد. يجب أن تكون جميع الاتصالات عديمة الحالة وقابلة للتخزين المؤقت.

هناك أربع خصائص لواجهة RESTful:

نماذج من مكالمات REST:

GET /someresources/anId

PUT /someresources/anId {"anotherdata": "another value"}

REST يركز على عرض البيانات. إنه يقلل من الترابط بين العميل/الخادم وغالبًا ما يُستخدم لواجهات برمجة التطبيقات العامة عبر HTTP. يستخدم REST طريقة أكثر عمومية وموحدة لعرض الموارد من خلال معرفات URI، والتمثيل عبر رؤوس الطلبات، والإجراءات عبر أفعال مثل GET، POST، PUT، DELETE، و PATCH. وبما أنه عديم الحالة، فإن REST ممتاز للتوسع الأفقي والتقسيم.

#### العيوب: REST

مقارنة بين استدعاءات 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

الأمان

هذه القسم يحتاج إلى بعض التحديثات. يرجى المساهمة!

الأمان موضوع واسع. ما لم تكن لديك خبرة كبيرة، أو خلفية في مجال الأمان، أو تتقدم لوظيفة تتطلب معرفة بالأمان، فغالبًا لن تحتاج لمعرفة أكثر من الأساسيات:

المصدر(المصادر) وقراءة إضافية

الملحق

في بعض الأحيان سيتم سؤالك عن تقديرات "سريعة". على سبيل المثال، قد تحتاج لتحديد المدة اللازمة لإنشاء 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 ms

Notes ----- 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

مقاييس مفيدة استنادًا إلى الأرقام أعلاه:

#### أرقام الكمون مصورة

#### المصدر(المصادر) وقراءات إضافية

أسئلة إضافية لمقابلات تصميم الأنظمة

أسئلة شائعة في مقابلات تصميم الأنظمة، مع روابط لمصادر حول كيفية حل كل منها.

| السؤال | المرجع/المراجع | |---|---| | صمم خدمة مزامنة ملفات مثل 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 | | أضف سؤال تصميم نظام | ساهم |

بنى واقعية للأنظمة

مقالات حول كيفية تصميم الأنظمة في العالم الحقيقي.


المصدر: جداول زمنية تويتر على نطاق واسع

لا تركز على التفاصيل الدقيقة في المقالات التالية، بل:

|النوع | النظام | المرجع/المراجع | |---|---|---| | معالجة البيانات | MapReduce - معالجة بيانات موزعة من جوجل | research.google.com | | معالجة البيانات | Spark - معالجة بيانات موزعة من Databricks | slideshare.net | | معالجة البيانات | Storm - معالجة بيانات موزعة من تويتر | slideshare.net | | | | | | تخزين البيانات | Bigtable - قاعدة بيانات عمودية موزعة من جوجل | harvard.edu | | تخزين البيانات | HBase - تنفيذ مفتوح المصدر لـ Bigtable | slideshare.net | | تخزين البيانات | Cassandra - قاعدة بيانات عمودية موزعة من فيسبوك | slideshare.net | تخزين البيانات | DynamoDB - قاعدة بيانات مستندات من أمازون | harvard.edu | | تخزين البيانات | MongoDB - قاعدة بيانات مستندات | slideshare.net | | تخزين البيانات | Spanner - قاعدة بيانات موزعة عالمياً من جوجل | research.google.com | | مخزن البيانات | Memcached - نظام تخزين مؤقت للذاكرة موزع | slideshare.net | | مخزن البيانات | Redis - نظام تخزين مؤقت للذاكرة موزع مع الاستمرارية وأنواع القيم | slideshare.net | | | | | | نظام الملفات | Google File System (GFS) - نظام ملفات موزع | research.google.com | | نظام الملفات | Hadoop File System (HDFS) - تطبيق مفتوح المصدر لـ GFS | apache.org | | | | | | متنوع | Chubby - خدمة قفل للأنظمة الموزعة ضعيفة الترابط من Google | research.google.com | | متنوع | Dapper - بنية تتبع لأنظمة موزعة | research.google.com | متنوع | Kafka - قائمة انتظار رسائل pub/sub من LinkedIn | slideshare.net | | متنوع | Zookeeper - بنية مركزية وخدمات تتيح التزامن | slideshare.net | | | أضف بنية معمارية | ساهم |

بنيات الشركات

| الشركة | المرجع/المراجع | |---|---| | أمازون | بنية أمازون | | 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 |

مدونات هندسية للشركات

الهياكل المعمارية للشركات التي تجري مقابلات معها.
>
قد تكون الأسئلة التي تواجهها من نفس المجال.

#### المصدر(المصادر) ومزيد من القراءة

هل ترغب في إضافة مدونة؟ لتجنب تكرار الجهد، يُنصح بإضافة مدونة شركتك إلى المستودع التالي:

تحت التطوير

مهتم بإضافة قسم أو المساعدة في إكمال قسم قيد التنفيذ؟ ساهم!

الشكر والتقدير

تم ذكر الشكر والمصادر في جميع أنحاء هذا المستودع.

شكر خاص لـ:

معلومات التواصل

لا تتردد في التواصل معي لمناقشة أي مشاكل أو أسئلة أو تعليقات.

يمكنك العثور على معلومات الاتصال الخاصة بي على صفحة 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 ---