English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

ضيف
1 / ?

الطريقين لتحمل حمل أكبر

الترحيب

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

تسمى الطريقة الأولى بالتوسع الأفقي (النمو الأفقي). والطريقة الثانية تسمى بالتوسع العمودي (النمو العمودي).

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

في نهاية الدرس سي فهم:

- منحنى التكلفة بين التوسع العمودي والتوسع الأفقي ومن حيث يحدث كل منهما

- ماذا يعني "الحالة" و"بدون حالة" في العمليات العملية، ولماذا يمكن أن تُضاعف بسهولة

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

- القاعدة التي تمنح طبقة من الانهيار (تمنعها من الانهيار بعد الركبة الكينية للانتظار)

- أين يجب أن تعيش الحالة (لا تزال موجودة) وكيفية إجبارها خارج الطبقات التي تحتاج إلى التوسع

لماذا يفوز التوسع الأفقي بعد نقطة معينة

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

المميزات: بسيط. لا تغييرات في الكود. لا تنسيق. العملية نفسها لديها الآن أكثر من وحدة معالجة مركزية.

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

التوسع الأفقي: صناديق أصغر

المميزات: لا سقف (حتى رغبتك في دفع الأموال وتحديد الأجهزة). القدرة تزداد خطيًا مع عدد الأعضاء الزائدي، بشكل متوقع. فشل وحدة معالجة واحدة يزيل 1/N من القدرة، وليس 100%.

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

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

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

التوسع الأفقي والعمودي: مخطط تكاليف وطوق سقف

تشغل فرقة خدمة على وحدة معالجة مركزية واحدة مع 8 وحدات معالجة مع 800 طلب/ثانية عند 60% من وحدة المعالجة. يتوقعون أن يزداد الحمل 4 مرات خلال العام المقبل. هم يتنازعون: استئجار وحدة معالجة مركزية 32 وحدة (عموديًا)، أو تشغيل أربعة وحدات معالجة 8 معالجات (أفقيًا) وراء محول الحمل (توزع الحمل). أي خيار توصي به، واسمى اسمين من الأسباب التي تذهب أبعد من القدرة الناتجة عن وحدة المعالجة

المتحكم بالحالة مقابل العارض

لا يختفي الحالة أبدًا، بل ينتقل فقط

ال компонنت المحتوي للحالة: يحمل معلومات لا خسارة لها ستغير السلوك. قاعدة بيانات تحتوي على حسابات المستخدمين. مخزن يحمل تokens الجلسة. عامل يثبت توصيل تدفق استمراري طويل الأجل إلى مستخدم محدد.

ال компонنت العارض: لا يحمل معلومات لا يهم خسارتها. طبقة ويب تقرأ طلبًا، وتستدعي قاعدة بيانات، وتكتب استجابة. كل طلب يعتمد على نفسه؛ لا تذاكر شيئًا بين الطلبات.

فكرة رئيسية: لا يختفي الحالة من النظام أبدًا. انتقل إلى طبقة مصممة لتحملها (قاعدة بيانات، مجموعة Redis، مستودع объектي). الطبقات التي تواجه المرور يمكن أن تصبح عارضة، وطبقات عارضة يمكن أن تتوسع افقيًا لأن أي وسيطة يمكن أن ترد على أي طلب.

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

أمثلة

- عملية ويب باللغة Python التي تقرأ الطلبات، وتستدعي Postgres، وتعيد JSON: عارض. الحالة تعيش في Postgres.

- عملية ويب باللغة Python التي تحمل عربات التسوق للمستخدمين في ذاكرة الحاسوب المحلي: متحكم بالحالة. فقدان العملية يفقد العربات.

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

- Redis cache fronting Postgres: stateful for the cache contents, but acceptable if cache misses are tolerable. A replica failure means cache miss, not data loss.

Designing for horizontal scaling = pushing state out of the layer that needs to scale.

Audit a Suspect Tier

A team runs a recommendation API on 6 backend VMs behind a reverse proxy. The application: reads a user ID from the request, fetches the user's recent activity from Postgres, runs a scoring algorithm, returns a list of recommended items. Two non-standard behaviors:

- The application keeps a 'recent user activity' cache in process memory, populated on first request for a user, reused on subsequent requests.

- The application uses sticky sessions: once a user hits VM #3, all their subsequent requests go to VM #3 (the proxy is configured for sticky routing on a cookie).

Identify which of these two behaviors makes the tier stateful & explain what would break if the team tried to scale from 6 VMs to 12. Then propose a redesign that lets the tier scale horizontally without losing the user-cache benefit.

The Replica Formula

The Simplest Capacity Formula

Once a tier goes stateless, sizing it becomes arithmetic. You need enough replicas so the steady-state load arrives & departs at the same rate, with headroom for surge.

The formula:

replicas = ⌈ (peak_load × surge_factor) / per_replica_capacity ⌉ + headroom

Where:

- peak_load: maximum sustained requests/second you expect in normal operation

- surge_factor: a multiplier covering brief bursts above peak (commonly 1.5x to 2x for predictable traffic, 3x or more for viral / unpredictable)

- per_replica_capacity: requests/second one replica handles at acceptable latency & utilization (commonly measured at 70% CPU, not at saturation)

- headroom: extra replicas so a few replica failures do not collapse the tier (commonly 1-2 replicas for small fleets, 10-20% for larger ones)

مثال عملي: يتعامل backend مع 100 طلب/ثانية بنسبة 70% من وحدة المعالجة النظرية لكل كopia. الحمل الأقصى هو 600 طلب/ثانية. تتوقع حدوث موجات قصيرة 2x بشكل دوري. ترغب في تحمل 2 حالات فشل لكopia.

الكوبيات = ⌈ (600 × 2) / 100 ⌉ + 2 = 12 + 2 = 14 كopia

القاعدة 80%

قدرة الكopia ليست نقطة التشبع. قياس القدرة عند 70-80% من وحدة المعالجة النظرية وليس 100%.

بعد حوالي 80% من الاستخدام، تزداد منحنيات صفوف الانتظار بسرعة: صف يأخذ 10 ميلي ثانية عند 60% من وحدة المعالجة النظرية يأخذ 80 ميلي ثانية عند 90% من وحدة المعالجة النظرية. يتفاعل الوقت، وليس التوصيل، أولاً. (درس الحرفي 'geometry_of_stateless_horizontal_scaling' يطور هذا المنحني رياضياً.)

التوسيع الأفقي التلقائي مقابل التوفير الإحصائي

الإحصائي: التوفير لاستيعاب الحمل الأقصى × رأس المال للنسبة المئوية المنخفضة من الاستخدام خارج فترات الذروة.

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

ملاحظة على التوسيع الأفقي التلقائي: وقت الانزلاق البارد مهم. إذا استغرق كopia الجديدة 2 دقائق للبدء، فلا يمكن للنمو التلقائي استجابة لزحف دقيقي. التوسيع الأفقي التلقائي البالغ يظل لديه بئر حار من الكوبيات المسبق التوفير تحت الحدود العليا لزيادة الكمية.

معادلة حجم الكوبيا مع مثال عملي

حجم الأسطول لخدمة جديدة

تخطط فريقتك لإطلاق خدمة بيانات تعريف الفيديو. أظهرت الاختبارات أن كopia واحدة تتعامل مع 250 طلب/ثانية بنسبة 70% من وحدة المعالجة النظرية و50 ميلي ثانية لحد p99 من وقت الاستجابة. يتوقع تسويقًا الحمل الأقصى عند 4,000 طلب/ثانية خلال ساعات الذروة. يمكن أن يرتفع الحمل المؤقت إلى 3x الحمل الأقصى لفترة قصيرة. ترغب في تحمل الخدمة 3 حالات فشل لكopia متزامنة دون تجاوز 80% من وحدة المعالجة النظرية على الباقين.

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

وقت الانزلاق البارد، وتبطئ الصرف، والأحزمة الحقيقية الأخرى

الأسطول الفعلي لديه أحزمة حقيقية

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

بدء بارد: يحتاج تكرار جديد إلى تشغيل نظام التشغيل وبدء العملية وتحميل التنسيق وحرق المخ ومراقبة الصحة. قد يستغرق من 5 ثواني (إعادة تشغيل الصندوق) إلى 5 دقائق (تشغيل VM الكامل + استيراد الصورة). لا يمكن الاستجابة لزخم أقصر من هذه المدة.

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

المجموعة الدافئة: تتيح مجتمعات الإنتاج مجموعة من التكرارات المسبق التجهيز ولكنها مكتومة جاهزة لاستقبال الطلبات على الإشارة. تُبادل تكلفة ثابتة صغيرة مع استجابة سريعة للزخم.

التصريف الخالي من الصداع مقابل القتل الفوري: يهم الشUTDOWN الحسن. سيجعل SIGTERM التصريف يتخذ وقتًا أطول من SIGKILL لكنه لا يُقسم طلبات المستخدمين.

نافذة فحص الصحة: قد ينجح تكرار بدأ حديثًا في مراقبة أول فحص صحة قبل أن يكون منبوعات قاعدة البيانات دافئة؛ يرسل خادم الربيع طلبات حقيقية وتصبح الـ 12 طلبًا الأولى بطيئة. قم بتعديل فحص الصحة لاختبار المسار الحقيقي وليس فقط حيوية العملية.

الانزلاق في الالتزام: حتى الطبقات المعروفة بالدولة تكتسب الانزلاق عبر الوقت (مكثفات CDN ، مخازن DNS للبحث) . كن متشككًا في "تكرارات متطايرة" التي تتخذ على الرغم من ذلك سلوكًا مختلفًا.

مجموعة دافئة أو التوسع التفاعلي؟

API بيانات فيديوك (أو نفسها من السؤال السابق ، مقاس 51 تكرارًا للpeak الدائم + الزخم) يتعرض لزخم 30 ثانية إلى 5x المعدل العادي عند إضافة فيديو فيروسي جديد. يتخذ التوسع التفاعلي الحالي 90 ثانية لإضافة تكرار جديد من البارد (استيراد الصورة + إعداد دافئ). خلال الفجوة 90 ثانية ، يرتفع معدل التأخير بشكل حاد وتصادر بعض الطلبات.

اقترح علاجًا. اختر: (أ) احتفظ بالتوسع التفاعلي ولكن تUNE بشكل مختلف ، (ب) توفير مجموعة دافئة من التكرارات المكتومة ، أو (ج) التوفير الدائم للإطار 5x للpeak. تبرير اختيارك وتسمية تكلفة الخيارات الأخرى.

تصميم طبقة بلا دولة تحت القيود

التجميع

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

تطبيقه أربعة.

صمم طبقة الخادم للـ feed.example.com، خدمة API للشريحة الاجتماعية. القيود: قدرة الوحدة الفردية 200 طلب/ثانية عند 70% من استخدام المعالج؛ الحمل المتوقع 1500 طلب/ثانية؛ عامل الزيادة المفاجئة 2.5x ( قصيرة الأخبار المتجولة من وقت إلى آخر)؛ الصمود أمام 2 حالات فشل الوسائط المتعددة في وقت واحد؛ وقت الانطلاق البارد 60 ثانية؛ يمكن أن تستمر الزيادات 45 ثانية؛ الميزانية تسمح ببعض القدرة الفائتة ولكن ليس 2.5x التوفير الدائم.

حجم الأسطول الثابت (أظهر الحساب)، اختر استراتيجية التعامل مع الزيادة المفاجئة (البركة الدافئة / التوسع الآلي التفاعلي / كليهما)، وحدد قطعة واحدة من حالة المستخدم لكل مستخدم تظن أنها تملكها التطبيق وينبغي أن تتحرك لكي تبقى الطبقة بدون حالة.

أين يذهب هذا الدورة التالية

أين يذهب هذا الدورة التالية

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

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

درس المرافق: geometry_of_stateless_horizontal_scaling يطور المنحني للانتظار، قانون ليتل تطبيقه على أسطول الوسائط، والمنطق الجيومتري لجذع الاستخدام 80%.

جيد جدًا. سيرفقه.