آشنایی با Reliability Pattern ها در System Design

همونطور که احتمالا میدونید، همیشه ممکنه که شما به عنوان یک Site Reliability Engineer و باتوجه به دانش و تجربه‌هاتون درگیر طراحی سیستم هم بشوید و در کنار دیگر مهندسین نرم افزار برای پیاده سازی یک سیستم با تمرکز بر Reliability اعلام نظر کنید(که این سیستم ممکنه از قبل وجود داشته باشه و سعی در بهبودش داشته باشیم ویا ممکنه که یک سیستم جدید برای پیاده سازی درنظر گرفته شده باشه.)فرآیند System Design، فرایند تعریف مولفه‌های یک سیستم نرم افزاری و همچنین مشخص کردنِ interactionها و relationship آن‌ها را به منظور رفع یک مجموعه خاص از نیازها میباشد و به شکل کلی، در مهندسی نرم‌افزار، System Design یک مرحله در فرآیند توسعه نرم‌افزاره که بر روی high-level design یک سیستم نرم‌افزاری شامل معماری و اجزا تمرکز داره.آشنایی با Reliability Patterns هااین پترن‌ها، یک ساختار برای طراحی و پیاده‌سازی یک سیستم رو بهتون ارائه میکنن تا زیرساخت نرم افزاریتون در برابر Failureهای مختلف مقاوم باشه و در لود بالا، سیستمتون کارایی و پرفورمنس خودش رو بتونه به بهترین شکل نگه داره و حتی درصورت پیش اومدن هر اختلالی، ریکاور شدن از شرایط بحرانی رو واستون راحت‌تر و سریع‌تر کنه.این پترن‌ها به سه دسته‌ی اصلی تقسیم میشه:پترن‌های متمرکز بر Availabilityپترن‌های متمرکز بر High Availabilityپترن‌های متمرکز بر Resiliencyکه در ادامه کمی بیشتر درموردشون صحبت میکنیم و به پترن‌های زیرمجموعشون اشاره میکنیم.پترن‌های متمرکز بر Availabilityمولفه‌ی Availability، به عنوان percentage of uptime اندازه‌گیری میشود و میزان زمانی که یک سیستم فانکشنال است و به شکل صحیح کار میکند را برای شما مشخص میکند؛ Availability میتواند با پیش‌آمد مواردی از قبیل System Errorها، مشکلات زیرساختی، حملات امنیتی و System Load تحت تاثیر قرار بگیرد، در زمانی که سیستم های حیاتی و مهمی را طراحی میکنیم، عموما به استفاده کنندگان و کاربران یک SLA ارائه میدیم که خب این قرارداد مارو ملزم به این میکنه که تا جایی که میتونیم، سیستم رو پایدار نگه داریم و Availability رو به حداکثر خودش برسونیم. برای پیاده‌سازی و طراحی سیستمی که تمرکز ویژه ای به Availability دارد، میتونیم از پترن‌های زیر استفاده کنیم:Deployment StampsGeodesHealth Endpoint MonitoringQueue-Based Load LevelingThrottlingپترن‌های متمرکز بر High Availabilityسیستم‌های High Available، معمولا بروی زیرساخت‌های Cloud-based پیاده سازی میشن از ساختار توزیع‌شده و muti-zone استفاده میکنند امکانات مختلفی رو برای Replication در هر لایه‌ای رو واسمون فراهم میکنند و این باعث کاهش احتمال failure در لایه زیرساخت میشه و در نتیجه، سیستم‌ها هم میبایستی به نوعی طراحی و پیاده‌سازی شن که بتونین هرچه بهتر این بستر را adopt کرده و پایداری خودشون رو در بهترین حالت ممکن حفظ کنند.برای پیاده‌سازی و طراحی سیستمی که تمرکز ویژه ای بر High Availability دارد، میتونیم از پترن‌های زیر استفاده کنیم:Deployment StampsGeodesHealth Endpoint MonitoringBulkheadCircuit Breakerپترن‌های متمرکز بر Resiliencyسیستم‌های مبتنی بر Resiliency(یا سیستم‌های تاب‌آور!)، سیستم‌هایی هستند که به شکلی پیاده‌سازی شدن که درصورت بروز هرگونه Failureـی(چه سهوی و چه مخرب و عمدی)، بتونن به راحتی Recover شن و این اتفاقات را handle کنند.برای پیاده‌سازی و طراحی سیستمی که تمرکز ویژه ای بر Resiliency و تاب‌آوری دارد، میتونیم از پترن‌های زیر استفاده کنیم:BulkheadCircuit BreakerCompensating TransactionHealth Endpoint MonitoringLeader ElectionQueue-Based Load LevelingRetryScheduler Agent Supervisorدر علم مهندسی نرم افزار پترن‌ها، معماری‌ها و ساختارهای بسیار زیادی وجود دارن که احتمالا کمتر کسی بتونه به همشون اشراف کامل داشته باشه و باهاشون کار کرده باشه، پس مهمه که ما به عنوان افرادی که در این صنعت حضور داریم، در حد یک دیدکلی و توضیح یک خطی با این راهکارها آشنایی داشته باشیم که در صورت ایجاد نیاز، بتونیم راهکار را ارائه بدیم و در اون زمان هم میتونیم باتوجه به تصمیم جهت پیاده سازی، روی هرموردی که لازم بود عمیق شیم و ازش استفاده کنیم؛ خیلی وقت‌ها در سیستم‌های فعلی، به سمت معماری‌های پیچیده نمیرویم، مخصوصا وقتی که به trade-off های طراحی میرسیم و ممکنه این موارد برای ما هزینه‌ی پیچیدگی رو پیش بیاره، ممکنه که خیلی از ریسک‌های غیرپایدار بودن سیستم رو در یک شرایط خاص بپذیریم و در نتیجه از پیچیدگی و هزینه‌ی نگهداری زیاد جلوگیری کنیم.امیدوارم که این مقاله واستون مفید بوده باشه و بتونید ازش استفاده‌ی لازم رو ببرید!برای نوشتن این مطلب، با ویرایش هایی از این منابع کمک گرفتم که برای مطالعات تکمیلی، میتونید بهشون مراجعه داشته باشید:https://roadmap.sh/system-designhttps://learn.microsoft.com/en-us/azure/architecture/framework/resiliency/reliability-patternsموفق باشید!سجاد غفاریان