Designing Data-Intensive Applications: Reliability
بس هل الـ reliability معناها إن الأبليكشن مفهوش أي أخطاء؟ مفيش حاجة من اللي بنستخدمها مفهاش أخطاء ودا ممكن يرجع لأننا بشر في النهاية، بس الأبليكشن ممكن نعتبره reliable لو كان بيفضل يؤدي مهامه حتى لو فيه مشاكل في جزء منه.
المقدمة
في الجزء اللي فات اتكلمنا عن مفاهيم زي data intensive و data-system، في الجزء دا هنتكلم بتفصيل عن الاعتمادية (reliability).
ما هي الاعتمادية (Reliability)؟
كلنا في استخدامنا اليومي بنتعامل مع تطبيقات مختلفة نادراً ما بنلاقي فيها عيوب وديماً بينفذ المطلوب واللي محتاجينه بدون مشاكل، بس فيه تطبيقات ممكن نستخدمها نلاقيها تحت ضغط معين مش بتبقى زي ما هي في الطبيعي؛ زي مثلاً مواقع الجامعات وقت ظهور النتيجة بنلاقيها بتقع كتير وبتلاقي مشاكل في إنك حتى تسجل مش إنك حتى تشوف النتيجة.
على عكس مثلاً التطبيقات الكبيرة والسوشيال ميديا نادراً ما بتعلق معانا طول الوقت مع إنه بيجي وقت بيبقى عليها ضغط جامد.
بس هل الـ reliability معناها إن الأبليكشن مفهوش أي أخطاء؟ مفيش حاجة من اللي بنستخدمها مفهاش أخطاء ودا ممكن يرجع لأننا بشر في النهاية، بس الأبليكشن ممكن نعتبره reliable لو كان بيفضل يؤدي مهامه حتى لو فيه مشاكل في جزء منه.
Fault vs Failure
بالرجوع لمثال نتيجة الجامعة، فالمفروض لو فيه مشكلة في جزء ما عندي (fault) المفروض ميخليش الموقع كله يقع (failure) بسبب خطأ في حتة معينة. لكن المفروض مثلاً أكون بقدر أسجل عادي أو أشوف معلوماتي أو حاجات مش مرتبطة بالنتيجة تبقى شغالة مظبوط حتى في وجود مشاكل غير متوقعة زي الحمل الزائد غير الطبيعي، وفي الحالة ديه بيتسمى fault-tolerant. وتقريباً مستحيل نبني أبليكشن من غير أي errors بس نقدر نحاول بإن لما يبقى فيه مشاكل الأبليكشن يقدر يفضل شغال.
Hardware faults
الأجهزة اللي بنستخدمها كلها ليها وقت افتراضي وهتبوظ أو مش هتؤدي بنفس الأداء، والمفروض أكون متوقع حاجة زي ديه وأعمل حسابي إن لو حصل مشكلة في جزء ما في السيرفر أقدر أستبدلها بغيرها من غير ما أخسر أو بأقل الخسائر الممكنة.
كان قبل كدة الاعتماد على جهاز واحد كفاية ولو حصل مشكلة ننقل الداتا عليه و downtime قليل علشان الموضوع مكانش كارثي في معظم الوقت، غير لو كانت حاجات حساسة زي البنوك والمطارات وغيره ممكن وقتها يبقى فيه أكتر من جهاز multi-machine redundancy. لكن دلوقتي كلو بيعتمد على أكثر من جهاز علشان:
- بقى المتوقع إن الـ service ديماً موجودة.
- الأخطاء مع كبر السيرفرات بقت أكبر وبتحصل أكتر، حتى AWS متوقع جداً إن machine تقع لأنه مدي أولوية أكثر للمرونة وسهولة نقل البيانات واعتماد حاجة جديدة بدل ما يمنع إن machine تقع لأنها كدا كدا هتحصل.
- الاعتماد على جهاز واحد معناه تقبل إن كدا كدا هيكون فيه وقت service مش متاحة ومش شرط بسبب مشكلة ممكن بسبب تحديث أو غيره.
Software Errors
في العادة مشاكل الهاردوير مش مرتبطة ببعض ونادراً ما أكتر من حاجة تبوظ بسبب التانية، بس مش دا اللي بيحصل في حالة الـ software دا لأنها:
- غير متوقعة.
- بتسبب نفس المشكلة حتى مع اختلاف الجهاز.
وديه ممكن تحصل بسبب حاجة بسيطة جداً زي إن اليوزر يدخل حاجة مش مظبوطة ممكن ترجعلي بيانات مش صح وتبوظ في components تانية. في العادة المشكلة بتبقى موجودة من الأول مش بتحصل فجأة لكن هي بتحصل في ظروف معينة بتديني نتيجة غير متوقعة.
ممكن أحمي نفسي منها إزاي؟
عن طريق إني أفكر في حالات وسيناريوهات مختلفة واليوزر ممكن يتصرف إزاي وإزاي أمنعه من إنه يعمل حاجة مش مألوفة، ممكن بردو أحاول أشوف إزاي المفروض أتصرف في حال حصل مشكلة زي إني أعمل restart أو أي خطة بديلة وديماً أتأكد إن البيانات صحيحة ومظبوطة.
Human Errors
اللي بيبني الأبليكشنز البني آدمين وإحنا بنعمل أخطاء كتير ومش هنبطل، طب إزاي نحمي نفسنا من كدة؟
- أحاول أمنعه من أي استخدام مش مظبوط عن طريق أخليه يستخدم الحاجة من غير ما يعرف عن التعقيدات اللي وراها. زي معظم الابليكشنز اللي بنستخدمها منعرفش التفاصيل اللي بتحصل ايه.
- عن طريق مختلف أنواع الـ tests واختلافها وتطرقها لحالات نادراً ما بتحصل edge cases.
- أقدر أرجع لآخر نقطة كان الأبليكشن شغال تمام ومظبوط roll back، وممكن بردو لما أجي أجرب حاجة جديدة مخليش الـ update دا يسمع عند كله لا أشوف في الأول عند ناس معينة.
- ديماً أتابع الأداء ومعدل الأخطاء وأتأكد إن مفيش حاجة غريبة عن الطبيعي كـ performance or error rate.
مدى أهمية الـ reliability؟
مش شرط تبقى في الحاجات المهمة والحساسة بس، ممكن تبقى في حاجات بسيطة بس الغلطة منها تخلي المستخدم ميستخدمش الأبليكشن تاني؛ زي مثلاً إن مذكرات حد أو صوره تتمسح لوحدها، دا مش هيخليه يدي الثقة تاني وعلى الأقل هيستخدم بديل.
إمتى يبقى مش مهم Reliability؟
لو ببني مجرد نموذج prototype في حاجة مش متأكد لسا هتنجح ولا لأ أو هامش الربح قليل، وقتها مجهود وفلوس إني أخلي الأبليكشن reliable مكلفة أكتر.
ما الفرق بين Reliability و Availability؟
- الإتاحية (availability): معناها النظام متاح دلوقتي ولا لأ؟ يعني لو فتحت الأبليكشن ولقيته شغال يبقى كدا available.
- الاعتمادية (reliability): هو شغال مظبوط ولا لأ؟ يعني لو فيه معاملات مالية بتتحسب صح؟
في الختام
في الجزء ده اتكلمنا عن ال الاعتمادية (Reliability) وفي الأجزاء القادمة هنتكلم عن بقية المفاهيم اللي الكتاب ركز عليها:
- قابلية التوسع (Scalability):التطبيق بتاعنا بيكبر من ناحية عدد المستخدمين والبيانات و traffic الاستجابه بتاعته هتكون عامله ازاي كأداء وسرعه وتجربة استخدام للمستخدم
- قابلية التعديل أو الصيانة (Maintainability):قد إيه النظام سهل القراءة، التعديل، وإضافة features جديدة، سواء عليك أو على أي حد هيشتغل عليه بعد كده.
Discussion