شنبه ۱ دی ۱۴۰۳ |  عضویت / ورود

تحمل‌پذیری خطا؛ نکته‌ای که در طراحی نرم افزار نباید از آن غافل بود


چند روز پیش به مناسبت هفته پژوهش در یکی از دانشگاه‌ها کلاس داشتم که اعلام کردند کلاس را تعطیل کنید و دانشجوها را بیاورید در فلان نقطه برای شنیدن سخنان یکی از اساتید. (که از قضا استاد خودم در دوران کارشناسی بود و حالا در شرف گرفتن دکترایش...)

ابتدا با خودم گفتم این هم از همان سمینارهاست که تشکیل می‌دهند که تشکیل داده باشند! و چهار تا عکس بگیرند و بفرستند به سازمان مرکزی و اینجور لوس‌بازی‌ها...

اما وقتی استاد، بحثش را ارائه کرد، خیلی خوشم آمد. دیدم بد نیست از این نوع سمینارها هر بار در دانشگاه‌ها برگزار شود. از آن همه دانشجو، چهار نفر هم یپدا شوند که فقط عنوان بحث را در ذهن نگاه دارند، کافی‌ست. بحث ایشان در مورد «تحمل‌پذیری خطا» یا Fault Tolerant بود. هر چند خودم در شبکه و در بحث RAID و جاهای مختلف در مورد این مفهوم برای دانش‌جوها صحبت می‌کردم اما در این سیمنار نکات جالبی بیان شد که می‌شود گفت حداقل آینده‌ی برنامه‌نویسی من را متحول کرد. هر چند ایشان خیلی سطح بالا و برای سیستم‌های خبره بسیار مهم (مثل طراحی هواپیما و امثالهم) صحبت کردند، اما من در مورد نرم افزارهایی که طراحی می‌کنیم، حسابی به فکر فرو رفتم که:

آیا نرم افزارهای ما هنگام رخداد یک خطا، می‌توانند آن‌را تحمل کنند و نتایج به دست آمده همچنان قابل اعتماد باشد؟

من شخصاً تا به حال این موضوع را جدی نمی‌گرفتم. یعنی به این قضیه فکر نمی‌کردم که اگر کارها درست پیش نرفت چی؟ معمولاً می‌گفتم: شرایط باید درست پیش برود وگرنه به نرم افزار مربوط نیست!

https://img.aftab.cc/news/92/fault_tolerant.jpg

مثلاً یک مشکل که از همان ابتدای طراحی تستا ۳ گهگاه از طرف مشتریانی که با صدها و گاهی هزاران کاربر سر و کار داشتند و این کاربران در یک زمان محدود وارد سایت می‌شدند، گزارش می‌شد این بود که از هر ۱۰۰ نفر، یکی دو نفر وقتی وارد آزمون می‌شدند، هیچ سؤالی را نمی‌دیدند و یا سؤالات را می‌دیدند و در آزمون هم شرکت می‌کردند اما نهایتاً تعداد سؤالات آن‌ها و نمره نهایی آن‌ها 0 ثبت می‌شد! این موضوع مدت‌ها فکر من را مشغول کرده بود. بارها و بارها کدها را تحلیل کردم اما یک دلیل منطقی برایش پیدا نکردم.

نهایتاً وقتی دیدم بیشتر، کاربرانی این مشکل را دارند که به طور همزمان صدها نفر را دعوت به آزمون می‌کنند، به این نتیجه رسیدم که مشکل می‌تواند از طرف وب‌سرور (یا دیتابیس) سایت باشد. یعنی وب‌سرور نمی‌رسد این همه کاربر را به طور همزمان جوابگو باشد. نهایتاً یکی از نکاتی که در آن سمینار بیان شد، این مشکل مرموز را حل کرد.
آن نکته این بود که: گاهی اوقات برای ما مهم نیست که دلیل یک مشکل چه باشد و یا اصلاً‌ نمی‌توانیم بفهمیم دلیل آن چیست، بنابراین ما نمی‌توانیم از بروز خطا «پیشگیری» کنیم، خوب، مشکلی نیست، «درمان» که می‌توانیم کنیم!؟ «پیشگیری» و «درمان» (و چند راه دیگر) راه‌هایی هستند برای «تحمل خطا» در سیستم‌ها.

همان روز این قضیه آمد به ذهنم که: خوب، ما بی‌خیال پیشگیری از این خطا شویم. چقدر دنبال دلیل مشکل بگردیم!؟ بگذاریم رخ بدهد، فقط اگر رخ داد، حالا درمانش کنیم.

بر این اساس، کدها را اینطور تغییر دادم که با هر بار کلیک کاربر بر روی پاسخ‌ها ابتدا بررسی شود که نکند هیچ سؤالی به نام آن کاربر در دیتابیس ثبت نشده (یعنی خطا رخ داده) اگر اینطور شده بود، به کاربر پیغام داده شود: «به نظر می‌رسد از طرف سیستم مشکلی رخ داده است. لطفاً به ما کمک کنید تا با هم مشکل را رفع کنیم. لطفاً به سادگی اینجا کلیک کنید تا از آزمون خارج شده و دوباره وارد شوید» (این جمله‌بندی برای این است که کاربر در لحظه ورود به آزمون به اندازه کافی استرس دارد، حالا یک استرس هم ما با خطای قرمز رنگ و کلماتی مثل «خطا» به او اضافه کنیم!؟*) و سریعاً سابقه حضور او در آزمون حذف شود که بتواند دوباره وارد شود و یا اگر هیچ سؤالی ندید و به صفحه نتایج رفت، ابتدا سابقه‌ی حضورش حذف شود، یک پیغام نمایش داده شود و از او خواسته شود تا دوباره وارد آزمون شود. احتمالاً بار دوم بدون مشکل وارد آزمون می‌شود. اگر نشد، برای بار سوم و خلاصه آنقدر تکرار می‌شود تا بالاخره مشکل رفع شود. (که البته می‌شود گفت مطمئناً در بار دوم بدن مشکل وارد خواهد شد)

و یا در قسمت‌های مختلف یک نرم افزار، ممکن است خطاهایی رخ دهد که امنیت و اعتماد به سیستم را دچار مشکل کند. سیستم باید به هر حال در هر شرایطی پاسخ مناسبی داشته باشد و بتواند «صحیح کار کند».

به هر حال، احساس می‌کنم نکته جالبی بود که باید در طراحی هر قسمت از نرم افزار مد نظر باشد. پس فراموش نکنید: یا باید خطایی رخ ندهد یا اگر رخ داد، باید فکری برای آن شده باشد.

موفق باشید؛
حمید رضا نیرومند

ـــــــــــــــــــــــــــــــــــــــــــــــــــ

* ابتدا آن جمله به این صورت بود: «به نظر می‌رسد به خاطر حضور همزمان کاربران در آزمون، مشخصات آزمون شما ثبت نشده باشد. لطفاً با کلیک روی لینک روبه‌رو از آزمون خارج و دوباره وارد شوید تا این مشکل رفع شود، در غیراینصورت عملکرد شما ثبت نمی‌شود»
اما یاد یکی از جملات استادمان در «سیستم‌های توزیعی» در ارشد افتادم! می‌گفت: گاهی ما باید complex بودن System را از دید User‏، Hidden کنیم!! :) خودش هم خنده‌اش گرفت! گفت ببینید ما چه بلایی سر زبان فارسی‌مان آورده‌ایم!؟ (ترجمه آن جمله می‌شود: گاهی ما باید پیچیدگی سیستم را از دید کاربر مخفی کنیم) [یکی از دلایلش این است که کاربر نیازی ندارد که در جریان پیچیدگی‌ها باشد... یکی دیگر از دلایل، امنیت است و غیره.]
اما آن جمله در ذهن من ماندگار شد!
بر اساس آن جمله دیدم «به نظر می‌رسد به خاطر حضور همزمان کاربران در آزمون،» ربطی به کاربر ندارد و بهتر است از دید او مخفی بماند... پس جمله‌ام به آن جمله بالا تغییر کرد که هم بار روانی‌اش بهتر باشد و هم مخفی بودن پیچیدگی‌های سیستم رعایت شود.
این را گفتم که بگویم گاهی انسان یک ترم سر یک کلاس می‌نشیند و فقط چند جمله از آن درس یادش می‌ماند. همان چند جمله می‌تواند کجاها به کار گرفته شود!؟


[ارسال شده در مورخه : دوشنبه، 9 دی، 1392 توسط Hamid]
[ #برنامه‌‌نویسی]

نظرات طرح شده

نام: [ کاربر جدید ]
ایمیل:

نظر:


اجازه استفاده از تگهای HTML را ندارید


جمع عدد 5 با 15 را در كادر زیر وارد نمایید:
(این كار برای جلوگیری از فعالیت موتورهای اسپمر است)


* توجه: نظر شما بعد از بررسی، نمایش داده خواهد شد.

ایمان                توسط ایمان در مورخه : سه شنبه، 10 دی، 1392(لینک نظر)
بهره بردیم...

ممنون


[ ارسال جوابیه ]


[بدون موضوع]                توسط xsbehx در مورخه : چهارشنبه، 11 دی، 1392(لینک نظر)
بهره بردیم...

ممنون

:)


[ ارسال جوابیه ]


سینا                توسط سینا در مورخه : جمعه، 13 دی، 1392(لینک نظر)
بسیار جاب و عالی.

اما یه نکته:

با این شرط چک کردن

هنگام ورود همزمان تعدادی کاربر

بار درخواست ها از وب سرور و پایگاه داده نسبت به حالت قبل تقریبا 2 برابر (یا حداقل بیشتر) میشه.

این یعنی تعداد کاربرانی که به صورت صحیح نمی تونن امتحان بدن بیشتر میشه!



آیا راه هوشمندانه تری هم وجو داره؟ که هم بار روی وب سرور رو زیاد نکنه و هم شامل تحمل‌پذیری خطای سیستم یشه؟

موفق باشید


[ ارسال جوابیه ]

    Re: سینا (امتیاز : 1)
    توسط Hamid در مورخه : جمعه، 13 دی، 1392
    وقتی یک request برای ثبت پاسخ می‌ره، همون موقع این موضوع بررسی می‌شه. یعنی تبدیل به دو request نشده.

    مشکلی که سرورها باهاش مواجه هستن، پردازش نیست، اون هم این پردازش بسیار بسیار ساده که یک کوئری به دیتابیس برای پرسیدن تعداد سؤالات هست! مشکل اصلی وب‌سرورها، تعداد request هست که با روش ما تعداد تقاضا تغییری نکرده.


    [ ارسال جوابیه ]


[بدون موضوع]                توسط amirhosein در مورخه : دوشنبه، 16 دی، 1392(لینک نظر)
آقا فکر نمی کردم انقدر زود از این مطلب شما استفاده کنم!

یه قطعه کد بود که سوراخشو پیدا نمی کردم :دی یعنی یه نظرسنجی بود که باید بر اساس نام کاربری فقط بشه یکبار رای داد. نمی دونم اشکال کجاست که این عملیات چک کردن با مشکل مواجه می شد. منم رفتم روی جدول توی دیتابیس یه کلید ترکیبی تعریف کردم و خلاص.

ممنون مهندس جان


[ ارسال جوابیه ]