در ادامهی قسمت قبلی که در مورد طراحی برای خودترمیمی (Self-Healing) و ایجاد افزونگی در همه اجزا (Redundancy) صحبت کردیم، توی این مقاله میخوایم به سراغ دو اصل دیگه بریم که میتونن تأثیر زیادی روی مقیاسپذیری و کارایی سیستم داشته باشن: Minimize Coordination و Design to Scale Out.
این اصول بهت کمک میکنن تا سیستمی بسازی که نه تنها مقاوم و پایدار باشه، بلکه بتونه به راحتی با رشد نیازمندیها و افزایش ترافیک، خودش رو وفق بده.
لینک بخش اول از این سری مقاله - اصول طراحی نرمافزارها و سیستمهای مقیاسپذیر
وقتی داری یه سیستم بزرگ و پیچیده میسازی، یکی از مشکلات رایجی که باهاش مواجه میشی، افزایش وابستگیها و هماهنگی بین بخشهای مختلفه. هر چه میزان هماهنگی بین کامپوننتها بیشتر بشه، احتمال بروز خطا و کاهش کارایی هم بالاتر میره. در واقع، هماهنگی زیاد، مثل یه ترافیک سنگین توی یه چهارراه شلوغه؛ هر چقدر هم که ماشینها منظم حرکت کنن، کوچکترین مشکل یا تأخیر میتونه کل سیستم رو دچار اختلال کنه.
اینجاست که مفهوم Minimize Coordination یا کاهش وابستگیها و هماهنگی بین کامپوننتها مطرح میشه. این اصل بهت میگه که باید تا جایی که ممکنه، هر بخش از سیستم رو مستقل و بدون نیاز به ارتباطات پیچیده طراحی کنی. با این کار، هر کامپوننت میتونه به صورت جداگانه مقیاسپذیر بشه و حتی اگه یکی از اونها از کار بیفته، بقیه بخشها بدون مشکل به کار خودشون ادامه بدن.
اما کاهش هماهنگی به تنهایی کافی نیست. باید مطمئن بشی که سیستم به راحتی قابل گسترش (Scale) باشه. اینجاست که اصل Design to Scale Out یا طراحی برای مقیاسپذیری افقی وارد میشه. این اصل به این معنیه که سیستم رو طوری بسازی که بتونی با افزایش یا کاهش تعداد Instanceها (سرورها، سرویسها یا منابع)، عملکرد و ظرفیتش رو تنظیم کنی، بدون اینکه معماری یا زیرساخت رو تغییر بدی.
توی این مقاله، میبینیم که چطور میتونیم با کاهش وابستگیها و هماهنگیهای پیچیده بین بخشها، و پیادهسازی یه معماری مناسب برای مقیاسپذیری افقی، میتونیم یه سیستم بسازیم که نه تنها تحت بار زیاد دچار مشکل نمیشه، بلکه میتونه به سرعت خودش رو با شرایط جدید وفق بده و همچنان عملکرد خوبی داشته باشه.
یکی از چالشهای بزرگ در طراحی سیستمهای پیچیده اینه که با افزایش مقیاس، هماهنگی بین کامپوننتها هم بیشتر میشه. این هماهنگی گاهی میتونه خودش به عنوان یه مانع جدی بر سر راه مقیاسپذیری و کارایی سیستم عمل کنه. اصل Minimize Coordination (به حداقل رسوندن هماهنگی)، به این نکته اشاره داره که هرچه وابستگیها و تعاملات بین بخشهای مختلف سیستم رو کمتر کنی، سیستم راحتتر و سریعتر میتونه رشد کنه و به مقیاسهای بالاتر برسه.
وقتی یک سیستم توزیعشده (Distributed System) داری، معمولاً اجزای مختلف مثل پایگاه دادهها، سرویسهای پردازشی، و سرویسهای ارتباطی، همگی نیاز به همگامسازی (Synchronization) دارن تا نتیجه نهایی به درستی تولید بشه. اما این هماهنگی باعث ایجاد تنگناها و محدودیتهایی میشه که در نهایت، به کاهش کارایی و سرعت منجر میشه.
برای مثال، تصور کن دو سرویس مختلف سعی کنن همزمان روی یک دیتابیس مشترک تغییراتی ایجاد کنن. در این حالت، برای حفظ یکپارچگی دادهها، سیستم مجبور میشه از قفلها (Locks) و هماهنگیهای پیچیدهای استفاده کنه. این کار باعث میشه که هر سرویس منتظر بمونه تا سرویس دیگه کارش رو تموم کنه و این انتظارها میتونه سرعت سیستم رو به شدت پایین بیاره.
هماهنگی معمولاً در سطوح مختلف مثل دادهها (Data) و محاسبات (Compute) اتفاق میافته. برای مثال، در سطح دادهها، سرویسها ممکنه نیاز داشته باشن که برای حفظ ACID (اتمی بودن، سازگاری، ایزوله بودن و پایداری) از قفلهای دیتابیس استفاده کنن. در سطح محاسبات هم، هماهنگی ممکنه برای مدیریت توزیع کارها بین سرویسها یا جلوگیری از دوبارهکاریها (Duplicate Processing) نیاز باشه.
در نتیجه، به حداقل رسوندن این هماهنگیها بهت کمک میکنه که سرعت سیستم رو بالا ببری و بدون ایجاد تنگنا، به راحتی مقیاسپذیری افقی رو پیادهسازی کنی.
به حداقل رسوندن هماهنگی بین بخشهای مختلف سیستم، بهت کمک میکنه که تنگناها و مشکلات عملکردی رو کاهش بدی و به راحتی سیستمت رو در مقیاسهای بالاتر گسترش بدی. با استفاده از روشهایی مثل تقسیمبندی دادهها، استفاده از ارتباطات غیرهمزمان، پذیرش همگرایی نهایی و پیادهسازی پترنهای مناسب، میتونی سیستمی بسازی که علاوه بر سرعت و کارایی بالا، در برابر خطاها هم مقاوم باشه و به راحتی مقیاسپذیری افقی رو پیادهسازی کنه.
مقیاسپذیری افقی یکی از اصول کلیدی در طراحی سیستمهای مدرن است که بهت اجازه میده با افزایش تعداد منابع (مثل سرورها، سرویسها یا نودها)، ظرفیت و عملکرد سیستم رو متناسب با نیاز بالا ببری. این قابلیت، به ویژه توی محیطهای ابری (Cloud)، اهمیت بیشتری پیدا میکنه چون میتونی بر اساس نیاز لحظهای، منابع رو به صورت داینامیک اضافه یا کم کنی.
به عبارت ساده، مقیاسپذیری افقی یعنی به جای ارتقا دادن قدرت سختافزاری یک سرور (Scale Up)، تعداد بیشتری سرور رو به مجموعه اضافه کنی تا بار رو بین این سرورها توزیع کنی.
در محیطهای ابری، یکی از بزرگترین مزیتها اینه که میتونی از مقیاسپذیری الستیک (Elastic Scaling) استفاده کنی. به این معنی که هر وقت ترافیک بالایی وارد شد، سرورها و سرویسهای بیشتری اضافه میکنی و وقتی بار کاهش پیدا کرد، این منابع اضافی رو حذف میکنی تا هزینهها رو بهینهسازی کنی. این انعطافپذیری در محیطهای ابری، بهت اجازه میده بدون نیاز به نگرانی از بابت کمبود منابع، پاسخگوی هر نوع حجم کاری (Workload) باشی.
طراحی برای مقیاسپذیری افقی خیلی ساده به نظر میرسه: «چندتا سرور اضافه کن و تموم!» اما در واقع، موانعی مثل گلوگاهها (Bottlenecks) و نقاط همگامسازی (Synchronization Points) میتونن به شدت روی عملکرد و مقیاسپذیری تأثیر بذارن، در یک سیستم ایدهآل، وقتی تعداد منابع دو برابر میشه، باید بتونی عملکرد سیستم رو هم دو برابر کنی. ولی در دنیای واقعی، این نسبت به ندرت به شکل کامل اتفاق میافته، چون معمولاً بعضی بخشهای سیستم دچار تنگناهایی میشن که با افزایش منابع، نتیجه بهینهای به دست نمیاد.
طراحی برای مقیاسپذیری افقی، یک اصل حیاتی در ساخت سیستمهای بزرگ و پیچیده است که میخوای همزمان پایدار و انعطافپذیر باشن. با پیادهسازی اصولی مثل اجتناب از Session Affinity، تقسیمبندی Workloadها، استفاده از ارتباطات غیرهمزمان و پیادهسازی Autoscaling، میتونی سیستمی بسازی که همزمان با رشد نیازها، رشد کنه و در زمان کاهش بار، هزینهها رو کاهش بده.
در نهایت، هدف از این نوع طراحی اینه که بتونی سیستمی بسازی که همواره با شرایط سازگار بشه و بدون هیچ نقطه گلوگاهی، همچنان سریع و پاسخگو باقی بمونه.
پایان
امیدوارم که واستون مفید بوده باشه!
منابع:
https://learn.microsoft.com/en-us/azure/architecture/guide/design-principles/minimize-coordination
https://learn.microsoft.com/en-us/azure/architecture/guide/design-principles/scale-out