معماری مونولیتیک یک مدل سنتی یکپارچه است که برای طراحی برنامههای نرمافزاری استفاده میشود. واژهی مونولیتیک به معنای “ترکیب تمام قطعات در یک قطعه” است. همچنین، در فرهنگ لغت کمبریج از این واژه به معنای “بسیار بزرگ” و “تغییرناپذیر” یاد میشود.
در این مطلب به بررسی مفهوم معماری مونولیتیک، تاریخچه، مزایا و معایب این معماری و تفاوتهای آن با معماری میکروسرویس میپردازیم.
معماری مونولیتیک چیست؟
برای اینکه بفهمید معماری مونولیتیک چیست و چطور کار میکند، باید تا حدودی با اجزای نرم افزاری و نحوهی کامپایل کد آشنا باشید. در معماری مونولیتیک، اجزاء یا فانکشنهای برنامه به جای اینکه دارای اتصالات آزاد باشند، مانند برنامههای نرم افزاری مدولار به طور محکم به یکدیگر جفت شدهاند. به عبارتی دیگر، در این معماری، برای اجرای کد یا کامپایل و اجرای نرم افزار، باید هر جزء و اجزایی که مرتبط با آن جزء هستند، موجود باشند.
اپلیکیشنهای مونولیتیک تک لایه هستند. این به این معنی است که در یک اپلیکیشن بزرگ، چندین جزء با یکدیگر ترکیب میشوند. در نتیجه، این اپلیکیشنها معمولا دیتابیس بزرگی دارند و مدیریت آنها در طول زمان کار سختی است.
علاوه بر این، در صورتی که یک جزء از برنامه نیاز به آپدیت داشته باشد، ممکن است لازم شود که سایر اجزاء بازنویسی شوند و کل برنامه مجددا کامپایل و تست شود. این فرآیندها معمولا زمانبر هستند و میتوانند سرعت عمل تیم برنامه نویسی و توسعه را کمتر کنند.
با وجود تمام این مشکلات، مزایای بسیار زیاد معماری مونولیتیک باعث شده که هنوز هم این رویکرد در تیمهای توسعه و برنامه نویسی استفاده شود. همچنین، بسیاری از اپلیکیشنهای کاربردی اولیه به عنوان یک نرم افزار مونولیتیک توسعه داده شدهاند و درنتیجه، تا زمانی که این برنامهها در حال استفاده و بروزرسانی خود هستند، نمیتوانیم این معماری را نادیده بگیریم.
اگر عضو یک تیم توسعه دهنده نرم افزاری هستید و میخواهید یک محیط مناسب برای تست نرم افزار و توسعه کدها به صورت تیمی در اختیار داشته باشید میتوانید نسبت به خرید vps با IP ثابت اقدام کنید و با نصب گیت روی سرور خود، کدهای خود را به صورت تیمی توسعه دهید. در صورتی که پروژهای که روی توسعه آن کار میکنید مقیاس بزرگی دارد و یک سرور مجازی پاسخگوی نیاز پروژه شما نیست توصیه میشود از یک سرور اختصاصی برای میزبانی برنامههای خود استفاده کنید.
درک بهتر معماری مونولیتیک با یک مثال
برای اینکه بهتر با معماری مونولیتیک آشنا شویم، بیایید با یک مثال از یک اپلیکیشن بانکی شروع کنیم. وبسایت اپلیکیشن بانکی به مشتریان خود اجازهی ورود به حساب و انتقال وجه به حسابهای دیگر را میدهد. در فرایند انتقال وجه به حساب دیگر، چندین مولفه نظیر رابط کاربری مشتری، احراز هویت، دانلود صورت حساب، انتقال پول و غیره دخیل هستند.
در صورتی که اپلیکیشن بانکی از معماری مونولیتیک استفاده کند، به عنوان یک برنامهی واحد ساخته و اجرا میشود و کاری با اینکه مشتری چطور از آن استفاده میکند، ندارد. در نتیجه، زمانی که کاربر از طریق گوشی موبایل یا دسکتاپ خود به اپلیکیشن دسترسی داشته باشد، کل اجزای برنامه و ماژولها به یکدیگر متصل میشوند. همچنین، ممکن است از یک سیستم مدیریت پایگاه داده رابطهای به عنوان یک منبع دادهی واحد استفاده شود. در صورتی هم که باید یکی از مولفهها تغییر داده شود، سایر مولفههای آسیب دیده نیز نیاز به تغییرات کد خواهند داشت.
تاریخچه معماری مونولیتیک
تاریخچه معماری مونولیتیک به دهههای 1950 و 1960 و همزمان با ظهور رایانههای بزرگ برمیگردد. این رایانهها بسیار گران بودند و منابع کم و محدودی داشتند. در نتیجه، نیاز بود که برای این رایانهها، نرم افزارهای کاربردی و کارآمدی که از منابع موجود حداکثر استفاده را میکنند، طراحی شود. در اینجا، معماری مونولیتیک پا پیش گذاشت و به تیمهای دواپس اجازهی کنترل شدید تمام اجزای برنامه را داد.
پس از آن، رایانههای شخصی و معماریهای سرویس کلاینت-سرور در دهههای 1970 و 1980 قدم به دنیای تکنولوژی گذاشتند. معماری سرویس کلاینت-سرور، اجزای مختلف برنامه را در چندین رایانه توزیع میکند و با انجام این کار، عملکرد و مقیاسپذیری را بهبود میبخشد. با وجود معرفی این معماری و محبوبیت آن در این دههها، معماری مونولیتیک همچنان در مقیاس بزرگ به عنوان یک رویکرد غالب برای کاربردهای سازمانی باقی ماند.
در دههی 1990 و اوایل دههی 2000 با ظاهرشدن نسل جدیدی از اپلیکیشنهای کاربردی تحت وب یکپارچه مانند آمازون و ایبی، مدیریت کاربران و تراکنشها بسیار راحتتر از گذشته انجام شد. با این حال، این اپلیکیشنها بسیار پیچیده بودند و نگهداریشان نیز مشکل بود.
در اواخر دههی 2000 و اوایل سال 2010، معماری میکروسرویس به عنوان جایگزینی برای معماری مونولیتیک معرفی شد. این معماری، اپلیکیشن را به مجموعهای از سرویسهای جفت شدهی آزاد تجزیه میکند و هر کدام از این اجزاء میتوانند به طور مستقل توسعه، گسترش و مقیاسبندی شوند. این ویژگی باعث میشود که برنامههای تحت معماری میکروسرویس کاملا مقیاس پذیر، قابل نگهداری و انعطاف پذیرتر از برنامههای تحت معماری مونولیتیک باشند.
در حال حاضر، با وجود معرفی معماری میکروسرویس، هنوز هم معماری مونولیتیک در بسیاری از پروژههای نرم افزاری مورد استفاده قرار میگیرد. دلیل استفاده از این معماری نیز رویکرد نسبتا ساده آن است و به همین دلیل، میتواند برای ساخت اپلیکیشنهای کوچک تا متوسط مناسب باشد. برای ساخت برنامههای بزرگ و پیچیده نیز میتوان از معماری میکروسرویس استفاده کرد.
اجزای اصلی اپلیکیشنهای معماری مونولیتیک
اپلیکیشنهای تحت معماری مونولیتیک معمولا از اجزای متعددی تشکیل میشوند. این اجزا به یکدیگر متصل شده و یک اپلیکیشن کاربردی بزرگ را تشکیل میدهند. مهمترین اجزای کلیدی اپلیکیشنهای مونولیتیک عبارتند از:
- مجوز (Authorization): این مجوزها برای اجازهی دسترسی به کاربران و اجازهی استفاده از برنامه داده میشوند.
- معرفی (Presentation): برای رسیدگی به درخواستهای پروتکل انتقال ابرمتن (هایپرتکست) و پاسخ به زبان نشانه گذاری ابرمتن، زبان نشانه گذاری توسعهیافته و یا زبان نشانهگذاری شی گرا جاوا اسکریپت استفاده میشود.
- منطق تجارت (Business logic): به منطق تجاری زیربنایی که عملکرد و ویژگیهای اپلیکیشن را هدایت میکند، گفته میشود.
- لایهی پایگاه داده (Database layer): شامل اشیا دسترسی به داده که به پایگاه دادهی اپلیکیشن دسترسی دارند، میشود.
- یکپارچهسازی برنامه (Application integration): این جزء، ادغام اپلیکیشن با سایر خدمات یا منابع داده را کنترل و مدیریت میکند.
برخی از اپلیکیشنهای تحت معماری مونولیتیک ممکن است دارای یک ماژول اعلان (notification) برای کنترل و ارسال ارتباطات ایمیل خودکار برای کاربران باشند.
مزایای معماری مونولیتیک
سازمانها و تیمهای توسعه دهنده نرم افزار، بسته به عوامل مختلف میتوانند از معماری میکروسرویس یا مونولیتیک استفاده کنند. از مهمترین مزایای معماری مونولیتیک میتوان به سادگی و راحت بودن آن اشاره کرد. به همین دلیل، بسیاری از افراد ترجیح میدهند برای ساخت اپلیکیشنهای ساده، از این معماری استفاده کنند.
در این قسمت، میخواهیم مهمترین مزایای معماری مونولیتیک را برایتان شرح دهیم. این مزایا عبارتند از:
- استقرار آسان: با استفاده از یک فایل یا دایرکتوری، میتوانید به راحتی اپلیکیشن خود را مستقر کنید.
- توسعهی آسان: زمانی که یک اپلیکیشن با یک کد پایه ساخته میشود، توسعهی آن آسانتر است.
- عملکرد بهتر: در یک مخزن و پایگاه دادهی متمرکز، یک API میتواند همان عملکردی را انجام دهد که APIهای متعدد با میکروسرویسها انجام میدهند.
- تست راحتتر: از آنجایی که اپلیکیشنهای تحت معماری مونولیتیک به صورت واحد و یکپارچه هستند، تست end-to-end در آنها سریعتر از یک برنامهی کاربردی توزیع شده انجام میشود.
- دیباگ کردن آسانتر: از آنجایی که همهی کدها در یک مکان قرار دارند، پیگیری درخواستها و پیداکردن مشکل راحتتر میشود.
معایب معماری مونولیتیک
اپلیکیشنهایی که با معماری مونولیتیک ساخته شدهاند، میتوانند کاملا موثر و کارا باشند. اما زمانی که از برنامههای بزرگ مانند نتفلیکس صحبت میکنیم، مقیاسپذیری میتواند چالش بزرگی برای این معماری باشد.
اگر بخواهید فقط یک تغییر کوچک در این اپلیکیشنها ایجاد کنید، باید کل پلتفرم را کامپایل و تست کنید و این کار بسیار چالش برانگیز، سخت و زمانبر است.
برخی از مهمترین معایب معماری مونولیتیک عبارتنداز:
- سرعت توسعهی کند: وقتی صحبت از برنامههای پیچیده و بزرگ میشود، توسعهی برنامه با این معماری کاری زمان بر و طاقت فرسا خواهد بود.
- مقیاسپذیری سخت: نمیتوانید اجزا را به صورت جداگانه مقیاسبندی کنید.
- قابلیت اطمینان کم: در صورتی که در یک ماژول خطایی ایجاد شود، احتمال اینکه این خطا بر روی کل اپلیکیشن تاثیر بگذارد وجود دارد.
- نداشتن انعطافپذیری: محدودیتهای زیادی در این معماری وجود دارد.
- مشکل در استقرار: پس از هر تغییر کوچک، باید مجددا کل مونولیت را مستقر کرد.
مقایسه معماری مونولیتیک و معماری میکروسرویس
در این قسمت، میخواهیم به مقایسه معماری مونولیتیک و معماری میکروسرویس بپردازیم.
معماری مونولیتیک یک رویکرد سنتی است که در آن، کل اپلیکیشن به عنوان یک برنامه واحد ساخته میشود. در این معماری، همهی اجزای اپلیکیشن مانند کد، دادهها و پیکربندیها به خوبی با یکدیگر pair و بستهبندی میشوند. در نتیجه، توسعه و استقرار اولیهی برنامه آسانتر شده؛ اما نگهداری، مقیاسپذیری و بهروزرسانی آن سختتر میشود.
از طرف دیگر، معماری میکروسرویس را داریم که یک رویکرد جدیدتر است و برنامه را به مجموعهای از سرویسهای به هم پیوسته تجزیه میکند. در این معماری، هر سرویس به صورت مستقل عمل کرده و وظیفهی خاصی را برعهده دارد و سرویسها از از طریق APIها با یکدیگر در ارتباط هستند. معماری میکروسرویس به اپلیکیشنها کمک میکند تا قابلیت نگهداری بهتر، انعطافپذیری بالاتر و مقیاسپذیری سادهتری داشته باشند.
اگر بخواهیم این دو معماری را با یکدیگر مقایسه کنیم، میتوانیم بگوییم که معماری مونولیتیک برای اپلیکیشنهای کوچک تا متوسط که انتظار رشد سریع یا تغییر دائم از آنها نمیرود، مناسبتر است. همچنین، اپلیکیشنهایی که نیاز به کنترل دقیق بر روی اجزایشان وجود دارد، میتوانند از مزایای این معماری استفاده کنند.
در مقابل، معماری میکروسرویس برای اپلیکیشنهای پیچیده و بزرگ که انتظار رشد سریع و یا تغییر مکرر از آنها میرود، مناسبتر است. همچنین، در کارهایی که انعطافپذیری و مقیاسپذیری حرف اول را میزند، بهتراست از معماری میکروسرویس استفاده شود.
نمونهای از برنامهها و پلتفرمهای پیاده سازی با معماری مونولیتیک عبارتند از:
- WordPress
- Drupal
- Joomla
- Magento
- Shopify
نمونههایی از برنامههای پیاده سازی شده با معماری میکروسرویس عبارتند از:
- Amazon
- Netflix
- eBay
- Spotify
- Uber
جمعبندی
از معماری مونولیتیک به دلیل توسعهی سریعتر، سادگی تست، هزینهی کمتر و سایر مزایای آن، در تیمهای توسعهی اپلیکیشنهای کوچک تا متوسط، استفاده میشود. با این حال، اگر نیاز به رشد سریع، انعطافپذیری بالا و مقیاسپذیری زیاد باشد، بهتراست به جای این معماری از معماری میکروسرویس که گزینهی جدیدتر و بهتری است، استفاده شود.
در این مقاله، سعی کردیم دربارهی تمامی موارد و ویژگیهای معماری مونولیتیک به طور ساده و کامل صحبت کنیم. امیدواریم توانسته باشید به خوبی با این مبحث جالب آشنا شوید.