الأساسيات · فصل ١

السيستم الكويس: يستحمل، يكبر، ويتصان

Reliability · scalability · percentiles · maintainability
🎯 الهدف: تفرّق بين العطل والانهيار، وتوصف الحمل بأرقام مش بجملة "scalable".

يعني إيه Data-Intensive؟

معظم الأبلكيشنز النهارده مش مشكلتها إن الـ CPU مش ملحق. المشكلة في الداتا نفسها: حجمها، تعقيدها، وسرعة تغيّرها. ده اللي بنسميه data-intensive.

والأبلكيشن العادي بيتبني من طوب بتتكرر:

DatabaseCacheSearch indexStream processingBatch processing

الكتاب بيركز على ٣ هموم: Reliability يشتغل صح رغم الأعطال، Scalability يستحمل الحمل لما يزيد، Maintainability الناس تقدر تشتغل عليه بسهولة.

الاعتمادية: Fault مش Failure

السيستم يفضل شغال صح حتى لما الحاجات تبوظ. يعمل اللي المستخدم متوقعه، يستحمل غلطاته، وأداؤه مقبول.

Fault — عطل

جزء واحد خرج عن المواصفات: هارد مات، سيرفر وقع. الهدف إنك تبني سيستم fault-tolerant: مش هتمنع الأعطال، بس تمنعها تتحول لانهيار.

Failure — انهيار

السيستم كله بطّل يقدّم الخدمة للمستخدم. ده اللي المستخدم بيحس بيه.

النوعشكلهبنتعامل معاه إزاي
Hardwareهاردات بتموت، رام، كهربا. عشوائي ومش مرتبط ببعضRedundancy: RAID، باور مزدوج. وفي الكلاود السوفتوير يستحمل إن ماكينة تختفي
Softwareباج واحد يوقع كل السيرفرات مرة واحدة، أو process ياكل الرام، أو cascading failureافترض الأسوأ، اعزل الـ processes، خلّي العملية تقع وتقوم، وراقب الـ invariants
Humanأخطاء الـ configuration من أكبر أسباب الأعطالAPIs تصعّب الغلط، sandbox، تيست، rollback سريع، ونشر تدريجي

فيه شركات بتعطّل حاجات عمدًا عشان تتأكد إن الحماية شغالة، زي Chaos Monkey.

القابلية للتوسع

“السيستم ده scalable” جملة فاضية. السؤال الصح: لو الحمل زاد بالطريقة الفلانية، إيه خياراتنا؟

أولًا وصف الحمل (load parameters): requests في الثانية، نسبة القراءة للكتابة، عدد الأونلاين، cache hit rate. أحيانًا المتوسط هو المهم، وأحيانًا الحالات المتطرفة.

ثانيًا وصف الأداء. الخدمات الأونلاين يهمها الـ response time. الـ batch يهمه الـ throughput.

الـ response time هو اللي العميل شايفه (خدمة + شبكة + طوابير). الـ latency هو الوقت اللي الريكوست قاعد مستني فيه يتخدم. والـ response time مش رقم واحد، ده توزيع، وفيه outliers بسبب GC أو باكت ضاع.

⬆ Scale up

ماكينة أقوى. بسيط، بس غالي ومحدود.

➡ Scale out

ماكينات صغيرة كتير، shared-nothing. أرخص، بس بيدخل تعقيد الأنظمة الموزعة.

الـ stateless services سهل تتوزع. الداتابيز stateful توزيعها صعب، فلفترة طويلة النصيحة كانت: سيبها على ماكينة واحدة لحد ما تتزنق. ومفيش magic scaling sauce: ١٠٠ ألف ريكوست كل واحد ١KB سيستم غير ٣ ريكوستات في الدقيقة كل واحد ٢GB، حتى لو الـ throughput متقارب.

سهولة الصيانة

أغلب تكلفة السوفتوير في صيانته مش في كتابته.

المبدأيعني إيهعمليًا
Operabilityفريق التشغيل يشغّله بسهولةمونيتورينج، أوتوميشن، سلوك متوقع
Simplicityمهندس جديد يفهم السيستمشيل الـ accidental complexity. أقوى سلاح abstraction كويس
Evolvabilityسهل يتغير لما المتطلبات تتغيرrefactor على مستوى الـ data systems كلها

Checklist الفصل الأول

🧠 اختبر نفسك
١) ليه الـ software bugs أخطر من أعطال الهاردوير؟
لأنها correlated: نفس الباج يضرب كل النودز في نفس الوقت، مش عطل عشوائي مستقل.
٢) p99 = 2s معناها إيه؟
٩٩٪ من الريكوستات أسرع من ثانيتين، و١٪ أبطأ.
٣) امتى الـ fan-out on write يبقى وحش؟
لما حد عنده ملايين متابعين: بوست واحد يبقى ملايين كتابات.
٤) ليه متوسط الـ latency مش كفاية؟
لأنه بيخبي الـ tail. صفحة بتنادي كذا سيرفر بتتبطأ بأبطأ واحد فيهم.