اولین پست این وبلاگ بالاخره در حال نوشته‌شدن است. در ابتدا می‌خواستم از مباحثی شروع کنم که بیشتر جنبه‌ی تئوری دارند. این موضوعات همچنین برای زمانی که با یک برنامه‌نویس دیگر ملاقات می‌کنید و می‌خواهید گفت‌وگویی کوتاه اما مفید داشته باشید، گزینه‌های خوبی هستند. می‌توانید از این پرسش‌ها استفاده کنید و یکدیگر را به چالش بکشید.

وقتی می‌گوییم یک سیستم قابل‌اطمینان است (Reliability)، منظور چیست؟ 🤔

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

برای مثال، اگر بخش جست‌وجوی محصول با مشکلی مواجه شود، نباید بخش‌های دیگر، مانند تسویه‌حساب یا انتخاب محصول، تحت تأثیر قرار بگیرند. این بخش‌ها باید بدون اختلال به کار خود ادامه دهند.

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

به همین دلیل، همواره باید تلاش کنیم که سیستم‌هایی مقاوم در برابر خطا (Fault-Tolerant) بسازیم تا در مواجهه با مشکلات، همچنان پایدار و ایمن باقی بمانند.

قبل از هر چیز، باید بدانیم که خطا (Fault) و شکست (Failure) چه معنایی دارند و تفاوت آن‌ها در چیست.

خطا به معنای انحراف از رفتار مورد انتظار و اصلی سیستم است. یعنی اگر انتظار داریم یک سیستم فرایند A را انجام دهد، اما در حین انجام این فرایند دچار مشکل شود و از مسیر اصلی منحرف گردد، یک خطا رخ داده است.

در مقابل، شکست زمانی اتفاق می‌افتد که سیستم نتواند سرویس اصلی مورد انتظار را به کاربر ارائه دهد.

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

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

ممکن است این سؤال در ذهنتان شکل بگیرد که چرا اصلاً اجازه دهیم خطاها رخ دهند؟ چرا از ابتدا پیشگیری نکنیم تا نیازی به این روش‌ها نداشته باشیم؟

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

خطاها به چند دسته تقسیم می‌شوند و بهتر است درباره‌ی هرکدام توضیح دهیم تا دقیق‌تر بفهمیم که چه چیزهایی را شامل می‌شوند.

  • خطاهای سخت افزاری (Hardware Fault)
  • خطاهای نرم افزاری (Software Fault)
  • خطاهای انسانی (Human Errors)

اول از همه، از خطاهای سخت‌افزاری شروع می‌کنیم.

خطای سخت‌افزاری به چه معناست؟ به مشکلات فیزیکی در اجزای سیستم، مانند هارد دیسک، حافظه (RAM)، منبع تغذیه و سایر قطعات سخت‌افزاری، خطای سخت‌افزاری گفته می‌شود.

برای مثال، هارد دیسک‌ها معمولاً بین ۱۰ تا ۴۰ سال عمر مفید دارند. حالا فرض کنید در یک سیستم تنها یک هارد دیسک داشته باشیم؛ ممکن است این دیسک تا ۴۰ سال بدون مشکل کار کند. اما اگر سیستمی با ۱۰ هزار دیسک داشته باشیم، به‌طور میانگین ممکن است هر روز یکی از آن‌ها خراب شود، که این یک خطای سخت‌افزاری محسوب می‌شود.

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

  • استفاده از RAID برای هارد دیسک
  • استفاده از cpu های قابل تعویض
  • استفاده از ژنراتور یا باتری برای منبع تغذیه سیستم

حالا می‌رسیم به خطاهای نرم‌افزاری (Software Errors).

خطاهای نرم‌افزاری معمولاً به مشکلاتی در سیستم و سرویس گفته می‌شود که در نرم‌افزار رخ می‌دهند. این نوع خطاها اغلب نسبت به سایر خطاها پیش‌بینی‌ناپذیرتر هستند و به دلیل وابستگی به اجزای مختلف سیستم، می‌توانند باعث ایجاد خرابی‌های گسترده شوند.

از انواع خطاهای نرم‌افزاری می‌توان به موارد زیر اشاره کرد:

• انواع باگ‌ها: برای مثال، در سال ۲۰۱۲، ثانیه‌ی کبیسه باعث کرش بسیاری از سیستم‌ها شد.

• مصرف بیش از حد منابع: مانند نشت حافظه (Memory Leak) که باعث کندی و در نهایت از کار افتادن سیستم می‌شود.

• مشکلات در سیستم‌های وابسته: وقتی یک سرویس به درستی پاسخ نمی‌دهد و باعث اختلال در سرویس‌های دیگر می‌شود.

این‌ها تنها بخشی از خطاهای نرم‌افزاری هستند که می‌توانند بر پایداری سیستم تأثیر بگذارند.

برای مقابله با خطاهای نرم افزاری چه راهکار هایی سراغ داریم؟🤔

  • تست نویسی
  • ایزوله کردن فراینپ های مختلف سیستم
  • مانیتورینگ و تحلیل رفتار سیستم
  • اجازه دادن برای کرش سیستم و راه اندازی مجدد
  • چک و بررسی داخلی

توضیح هر یک از این موارد به‌تنهایی بحث مفصلی است و می‌توان برای هرکدام یک پست جداگانه نوشت.

برای اینکه این مطلب بیش از حد طولانی نشود و بتوانید آن را راحت‌تر بخوانید و از آن لذت ببرید (امیدوارم!)، بهتر است ادامه‌ی این بحث را به پست‌های آینده موکول کنم. 🙂

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *