تفاوتهای کلیدی دو معماری زیرساختی
معماری یکپارچه (Monolithic Architecture)، مدل سنتی توسعه نرمافزارهای کاربردی است. در اینجا، واژه یکپارچه بهمعنای ترکیب همه مولفهها در قالب یک مفهوم واحد است. لازم به توضیح است که فرهنگ لغت کمبریج، صفت یکپارچه (Monolithic) را «بسیار بزرگ» و «غیرقابل تغییر» تعریف کرده است که همخوانی کاملی با ماهیت عملی آن در دنیای نرمافزار دارد.
معماری یکپارچه در خدمت توسعه نرمافزار
نرمافزارهای یکپارچه بهگونهای طراحی میشوند که خودکفا هستند؛ به این معنا که مولفهها یا عملکردهای برنامه بهجای آنکه از الگوی اتصال آزاد مانند برنامههای نرمافزاری ماژولار پیروی کنند، بهشکل یکپارچه به یکدیگر متصل شدهاند. در معماری یکپارچه، تمامی مولفهها باید برای اجرای کد یا کامپایل و اجرای نرمافزار از قبل نوشته شده و آماده باشند. برنامههای یکپارچه تکلایه هستند؛ به این معنی که چند مولفه در یک برنامه با یکدیگر ترکیب میشوند و پایگاههای کد بزرگی دارند. پایگاههایی که مدیریت آنها در طول زمان پیچیده و سخت است. شکل ۱ مراحلی را که کامپایلر باید پشت سر بگذارد تا یک برنامه یکپارچه کامپایل شده و قابل استفاده باشد نشان میدهد. معماری یکپارچه رویکرد سنتی توسعه و استقرار برنامهها در محیطهای تولیدی یا فضای وب است. بهطور کلی، برنامههای وب از سه مولفه اصلی زیر تشکیل شدهاند:
- بخش فرانتاند: نمای ظاهری وبسایت را شکل میدهد و با استفاده از فناوریهای جاوااسکریپت، اچتیامال و سیاساس نوشته میشود.
- بخش بکاند: اسکلت یک برنامه وب را شکل میدهد که روی سرورها قرار میگیرد و با زبانهایی مثل پیاچپی، پایتون، جاوا یا Node.JS نوشته میشود.
- پایگاه داده: فضایی که دادههای مربوط به برنامه کاربردی را نگهداری میکند.
این سه مولفه در تعامل کامل با یکدیگر هستند، از اینرو، مبتنی بر طراحی یکپارچه هستند؛ به این معنا که یک برنامه وبمحور بهشکل یک ماهیت کل یا همان یکپارچه و مستقل کار میکند و سه بخش مذکور از یکدیگر جدا نیستند.
شکل 1
مثال یک برنامه مبتنی بر معماری یکپارچه
برای درک معماری یکپارچه، اجازه دهید به ذکر مثال برنامه بانکی بپردازیم. یک برنامه وبمحور بانکی را تصور کنید که امکان باز کردن حساب و انتقال آنلاین پول از یک حساب به حسابهای دیگر را به مشتریان میدهد. این برنامه برای ارائه چنین خدماتی متکی به مولفههای مختلف مرتبط با یکدیگر است. از مولفههای مهم در این زمینه باید به رابط کاربری مشتری، سرویسهای احراز هویت کاربر، دانلود صورتحساب، انتقال پول، رمزگذاری و غیره اشاره کرد. در معماری یکپارچه، بدون توجه به اینکه مشتری چگونه از یک برنامه کاربردی استفاده میکند، بهعنوان یک برنامه واحد ساخته و اجرا میشود. بنابراین، چه کاربران از دسکتاپ یا از یک دستگاه تلفن همراه به برنامه دسترسی داشته باشند، برنامه در قالب یک مفهوم یکپارچه در دسترس کاربر قرار میگیرد. به بیان دقیقتر، همه مولفهها و ماژولها بهشکل مستقیم با یکدیگر در ارتباط هستند. همچنین، از یک سیستم مدیریت پایگاه داده رابطهای بهعنوان یک منبع داده واحد برای ذخیرهسازی اطلاعات استفاده میکند. اگر هر یک از مولفههای این برنامه نیازمند تغییری باشند، کل ساختار برنامه و مولفهها باید بازبینی شوند تا اطمینان حاصل شود برنامه بدون مشکل کار میکند.
مولفههای کلیدی برنامههای یکپارچه
همانگونه که اشاره کردیم، معماری یکپارچه، رویکرد سنتی توسعه و استقرار برنامهها در محیطهای تولیدی یا فضای وب است. برنامههای مبتنی بر معماری یکپارچه نیز مولفههای مختلفی دارند که متصل به یکدیگر هستند، اما مستقل از یکدیگر نیستند و همگی در قالب یک ساختار کلی قادر به اجرا هستند. بهطور معمول، برنامههای کاربردی، مولفهها و ساختار مشابهی دارند که شاهد حضور آنها در برنامههای مختلف هستند. از مولفههای مهم در این زمینه به موارد زیر باید اشاره کرد:
- مجوز: به کاربران اجازه دسترسی و استفاده از برنامه کاربردی را میدهد.
- ارائه (نمایش): مسئولیت رسیدگی به درخواستهای پروتکل انتقال ابرمتن و نمایش پاسخ در قالب زبان نشانهگذاری فرامتن، زبان نشانهگذاری توسعهیافته و نشانهگذاری اشیاء جاوااسکریپت را بر عهده دارد.
- منطق کسبوکار: منطق تجاری و زیربنایی برنامه و ویژگیهای کاربردی را که برنامه بر مبنای آن توسعه پیدا میکند، بهگونهای تعریف میکند که برنامه بهترین عملکرد را ارائه دهد.
- لایه پایگاه داده: میزبان اشیایی است که دسترسی به دادههای درون پایگاه داده را فراهم میکنند. به بیان دقیقتر، به برنامه اجازه میدهد با پایگاه داده در ارتباط باشد.
- مولفه یکپارچهکننده: یکپارچهسازی برنامه و ادغام آن با دیگر سرویسها یا منابع داده را کنترل و مدیریت میکند.
- بخش فرانتاند: نمای ظاهری وبسایت یا برنامه کاربردی را شکل میدهد و با استفاده از فناوریهای جاوااسکریپت، اچتیامال و سیاساس نوشته میشوند.
- بخش بکاند: اسکلت یک برنامه را شکل میدهد که روی سرورها قرار میگیرد و با زبانهایی مثل پیاچپی، پایتون، جاوا، سیشارپ، Node.JS و غیره نوشته میشود.
علاوه بر این، برخی از برنامههای کاربردی ممکن است ماژولهایی برای نظارت بر عملکرد برنامه و راهکارهایی برای برقراری ارتباط کاربران با تیم توسعهدهنده ارائه دهند. این مولفهها ارتباط کاملی با یکدیگر دارند و بر مبنای معماری یکپارچه توسعه پیدا میکنند.
مزایای معماری یکپارچه
معماری یکپارچه مزایای قابل توجهی ارائه میکند که باعث شده هنوز برخی برنامههای کاربردی بر مبنای این پارادایم توسعه پیدا کنند. بهعنوان مثال، در برخی موارد، برنامههای یکپارچه توان عملیاتی بهتری نسبت به برنامههای ماژولار ارائه میدهند. همچنین، روند آزمایش و اشکالزدایی آنها سادهتر است، زیرا توسعهدهندگان با عناصر، متغیرها و سناریوهای آزمایشی کمتری روبهرو هستند.
در ابتدای چرخه عمر توسعه نرمافزار، معماری یکپارچه سهولت در کدنویسی را ارائه میدهد، زیرا روند توسعه در ابتدای راه، پیچیدگی خاصی ندارد. بهطور مثال، توسعهدهندگان میتوانند یک پایگاه کد واحد برای ورود به سیستم، مدیریت تنظیمات، نظارت بر عملکرد برنامه و موارد مشابه تعریف کنند. همچنین، استقرار میتواند با بستهبندی و کپی برنامه در یک سرور انجام شود. معماری یکپارچه برای برنامههای کاربردی ساده که قرار نیست وظایف پیچیدهای را مدیریت کنند، مناسب است. اما برای برنامههای پیچیدهتر که اعمال تغییرات در کدها اجتنابناپذیر است یا الزامات تجاری باعث میشوند تا توسعهدهندگان بهفکر مقیاسپذیری برنامه باشند، مناسب نیست. از دیگر مزایای معماری یکپارچه به موارد زیر باید اشاره کرد:
- در طراحی یکپارچه همه مولفهها در برنامه کاربردی قرار دارند که باعث بزرگ شدن سورسکد و حجم برنامه میشود.
- برنامههای یکپارچه، قالب مشخصی دارند و نیازی نیست عملکردهای مختلف برنامه به ماژولهای مختلفی شکسته شود. با توجه به اینکه بخشهای مختلف ارتباط مستقیمی با یکدیگر دارند، بهلحاظ سازگاری، همکاری، تعامل و غیره مشکلی وجود ندارد.
- فرآیند اشکالزدایی و آزمایش برنامههای یکپارچه ساده است. از آنجایی که این مدل برنامهها ماهیت واحدی دارند، فرآیند انجام آزمایشهای کیفیت نرمافزار را ساده میکنند. به بیان دقیقتر، اجرای تستهای جامع روی آنها سادهتر از نرمافزارهای مبتنی بر میکروسرویس است. علاوه بر این، فرآیند زیر نظر گرفتن عملکرد برنامه و مدیریت بر نحوه استفاده از منابع در برنامههای یکپارچه، سادهتر از برنامههای مبتنی بر میکروسرویس است.
- فرآیند استقرار برنامههای یکپارچه ساده است، زیرا برنامه شما از سرویسهای مختلف ساخته نشده و نیازی به استقرار بخشهای مختلف بهشکل جداگانه وجود ندارد. به بیان دقیقتر، فرآیند استقرار برنامه روی سرور با هدف دسترسی کاربران به آن ساده است.
- مکانیزم توسعه سادهای ارائه میدهند. با توجه به اینکه، معماری یکپارچه سالهای زیادی است که مورد استفاده قرار میگیرد، بهعنوان یک استاندارد صنعتی در حوزه نرمافزار و وب شناخته میشود و تقریبا همه توسعهدهندگان و برنامهنویسان با آن آشنا هستند.
معایب معماری یکپارچه
بهطور کلی، معماریهای یکپارچه یکسری مشکلات ذاتی دارند که باعث میشوند فرآیند توسعه نرمافزارهای بزرگ و استقرار آنها با تاخیر همراه شود. این مشکلات زمانی که پیچیدگی محصول افزایش مییابد یا تیم توسعه بزرگ میشود، بغرنجتر میشوند.
درک درست کدهای برنامه یکپارچه ممکن است دشوار باشد، زیرا برنامهنویسان ممکن است با حجم زیادی از کدها روبهرو شوند که درک ماهیت آنها زمانبر خواهد بود. همین مسئله روند اعمال تغییر در کدها با هدف پاسخگویی به الزامات تجاری یا فنی برای توسعهدهندگان جدید را دشوار میکند. همانگونه که نیازمندیها تکامل پیدا میکنند یا پیچیدهتر میشوند، اعمال صحیح تغییرات بدون مختل کردن عملکرد برنامه یا کاهش کیفیت آن کاری سختی است.
پس از هر بهروزرسانی، توسعهدهندگان باید کدها را کامپایل کنند. به بیان دقیقتر، بهجای آنکه بخشی که بهروزشده را کامپایل کنند، مجبور هستند برنامه را بهطور کامل کامپایل کرده و مستقر کنند. در نتیجه، فرآیند استقرار مداوم یا منظم کار سختی خواهد بود که بر چابکی برنامه و تیم تاثیر منفی میگذارد.
اندازه یک برنامه کاربردی مبتنی بر معماری یکپارچه در گذر زمان زیاد میشود که زمان خواندن آن از روی دیسک و بارگذاری در حافظه را زیاد میکند. در برخی موارد، بخشهای مختلف برنامه ممکن است بهشکل همزمان به منابع سیستمی نیاز داشته باشند که دستیابی به منابع مورد نیاز را دشوار میکند.
علاوه بر مقیاسپذیری محدود، قابلیت اطمینان یکی دیگر از نگرانیهای پیرامون نرمافزارهای یکپارچه است. یک خطا در هر یک از مولفهها ممکن است عملکرد برنامه را مختل کند. با در نظر گرفتن مثال برنامه بانکی، فرض کنید یک نشت حافظه در ماژول مجوز کاربر پیدا شود. این باگ میتواند کل برنامه را با مشکل روبهرو کرده و آنرا برای همه کاربران از دسترس خارج کند.
بهدلیل اندازه و پیچیدگی، برنامههای کاربردی یکپارچه ممکن است بهسرعت با فناوریهای جدید سازگار نشوند. یک تغییر در چارچوب یا زبان برنامهنویسی میتواند بر عملکرد کل برنامه تاثیر بگذارد؛ همین مسئله باعث میشود تا فرآیند پذیرش فناوریهای جدید، زمانبر و پرهزینه باشد. شرکتهای کوچک ممکن است بودجه یا کارکنانی برای بهروزرسانی برنامه نداشته باشند، بنابراین ممکن است در نهایت وضعیت موجود را حفظ کنند و بهطور بالقوه نتوانند از یک زبان یا چارچوب جدید استفاده کنند.
این معایب باعث شدهاند تا بسیاری از سازمانها از معماریهای یکپارچه دور شوند و به سراغ معماری میکروسرویس (MSA) بروند، زیرا مزایای درخشانی ارائه میدهد. شکل ۲ تفاوت این دو پارادایم را نشان میدهد.
شکل 2
معماری میکروسرویس چیست؟
معماری میکروسرویس، در نقطه مقابل معماری یکپارچه قرار دارد که برنامه را به عنوان یک ماهیت کل در نظر میگیرد. در معماری میکروسرویس، برنامه به بخشهای مختلف و کوچکی تقسیم میشود. در معماری مذکور، هر یک از عملکردهای مهم برنامه بهعنوان یک سرویس تعریف میشوند. از اینرو، هر کدام منطق و پایگاه داده خودشان را دارند و کار خاصی را انجام میدهند. در معماری فوق، هر زمان صحبت از بخشهای کوچکتر به میان میآید، اشاره ما به ماژولهای مستقلی است که فرآیند استقرار جداگانهای دارند و مستقل از یکدیگر اجرا میشوند، اما از طریق واسطهای برنامهنویسی کاربردی با یکدیگر در ارتباط هستند.
مزایای معماری میکروسرویسها
معماری میکروسرویس از برنامههای ماژولار پشتیبانی میکند که در آن هر ماژول منفرد در یک سیستم، مانند یک سرویس میتواند بهطور مستقل و بدون تاثیرگذاری بر دیگر بخشهای برنامه یا اعمال تغییرات پیشبینینشده در دیگر عناصر عمل کند.
برنامههای ماژولار در مقایسه با برنامههای یکپارچه با فرآیندهای توسعه تکرارپذیر رابطه خوبی دارند و با متدولوژیهای رایج برنامهنویسی مثل «چابک» سازگارتر هستند. همچنین، مقیاسپذیرتر هستند و بهدلیل مکانیزم ارتباطی خاصی که میان مولفههای مختلف در جریان است، امکان آزمایش جداگانه ماژولها را بهوجود میآورند. این ماژولها، کانالهای ارتباطی خاص خود را برای برقراری ارتباط با یکدیگر دارند، پایگاه داده خود را دارند و سرعت راهاندازی برنامه را افزایش میدهند.
یکی از ویژگیهای شاخص معماری میکروسرویس، مقیاسپذیری بالای آن است. بهطوری که میتوانیم هر یک از سرویسها را بهشکل جداگانه بهروزرسانی کرده و ارتقاء دهیم که صرفهجویی قابل ملاحظهای در منابع مالی بههمراه دارد. در معماری یکپارچه، مجبور هستیم هر زمان که تغییری اعمال میکنیم، تمامی برنامه و حتا بخشهایی را که دستنخورده هستند بازبینی کرده و کامپایل کنیم، اما در معماری میکروسرویس تنها بخشی را که تغییر کرده کامپایل میکنیم. شکل ۳ معماری فوق را نشان میدهد.
شکل 3
همانگونه که اشاره کردیم، معماری یکپارچه در قبول فناوریها و نوآوریهای جدید تا حد زیادی بسته عمل میکند، اما در معماری میکروسرویس اینگونه نیست، زیرا از فناوریها و ابزارهای مختلفی برای توسعه هر یک از ماژولها استفاده میکنیم که مشکل وابستگی به یک فناوری خاص را برطرف میکنند. همچنین، بهدلیل اینکه سرویسها از طریق واسطهای برنامهنویسی کاربردی با یکدیگر در ارتباط هستند، امکان استفاده از کتابخانهها و چارچوبهای مختلف در زمینه کدنویسی برنامههای وبمحور و دسکتاپی وجود دارد.
در نهایت برنامههای مبتنی بر معماری میکروسرویس آستانه تحمل خطای بالایی دارند، زیرا هر مولفه برنامه بهشکل مستقل عمل میکند و اگر با مشکلی روبهرو شود، عملکرد برنامه بهطور کامل مختل نمیشود.
از کدام معماری استفاده کنیم؟
توسعهدهندگان میتوانند از هر دو معماری در پروژههای نرمافزاری استفاده کنند، اما قبل از انتخاب هر یک از معماریهای فوق، بهتر است برخی ملاحظات را مورد توجه قرار دهید. معماری میکروسرویسها مبتنی بر ارائه سرویسهای کوچک و مستقلی است که توسعهدهندگان میتوانند آنها را بهطور مستقل بسازند، گسترش دهند و مقیاسبندی کنند. همین مسئله باعث شده تا برخی از طرفداران میکروسرویسها اعلام کنند دوران معماری یکپارچه به پایان رسیده است. با این حال، با وجود جذابیتهای زیادی که میکروسرویسها ارائه میدهند، سبک معماری یکپارچه هنوز هم مورد استفاده قرار میگیرد.
اگر برنامه شما آنقدر پیچیده نیست، یک استراتژی یکپارچه ممکن است گزینه مناسبی باشد. اگر برنامه بیشازاندازه بزرگ نیست و در نظر دارید در زمان کوتاهی آنرا ایجاد کنید، معماری یکپارچه گزینه مناسبی است. بهطور مثال، پیشنهاد میشود تیمهای استارتآپی از معماری یکپارچه برای توسعه برنامههای کاربردی استفاده کنند، زیرا امکان استفاده از آن بدون نیاز به دانش عمیق وجود دارد. همچنین، برخی اوقات یک برنامه کاربردی به اندازهای ساده است که نیازی به عملیات سنگین و پیچیده ندارد، از اینرو، نیازی نیست خود را درگیر دردسرهای معماری میکروسرویس کنید. همچنین، در نظر داشته باشید که ساخت برنامههای میکروسرویس به دانش فنی نیاز دارند و توسعه پروژه بر مبنای این معماری بدون داشتن تجربه کاری مخاطرهآمیز است. بنابراین، مادامی که برنامه شما پیچیده نیست و تا زمانی که دانش کافی برای مدیریت آنرا ندارید بهتر است از معماری میکروسرویس استفاده نکنید. ابزارهای زیادی مانند پروفایلرها، تحلیلگرهای کد ایستا و چارچوبهای آزمایشی وجود دارند که آزمایش و اشکالزدایی برنامههای میکروسرویس را آسانتر میکنند.
اگر تیم مهارتهای مناسبی نداشته باشد، کار با معماری میکروسرویسها به کابوس بزرگی تبدیل شود. اگر توسعهدهندگان یک تیم به پارادایم برنامهنویسی یکپارچه عادت دارند، مهاجرت به الگوی جدید زمانبر خواهد بود. اگر این تغییر از منظر تجاری مشکلی ایجاد نمیکند، بهتر است به توسعهدهندگان اجازه دهید روند یادگیری معماری جدید را آغاز کنند.
یک برنامه یکپارچه موانعی را برای مدیریت کدهای پایه در زمینه استقرار مداوم یا افزودن ویژگیهای جدید ایجاد میکند. یک برنامه یکپارچه میتواند تنها در یک بعد مقیاسبندی شود و با افزایش حجم تغییرات، مجبور به ساخت چند نسخه از برنامه هستید.
تصور کنید روی یک برنامه پیچیده با تیمی کار میکنید که در شهرهای مختلف زندگی میکنند. بهکارگیری معماری میکروسرویسها در این شرایط منطقیتر است، زیرا مقرونبهصرفهتر است و میتوانید برنامه را بهطور یکپارچه مدیریت و مقیاسبندی کنید. برخلاف برنامههای یکپارچه، برنامههای میکروسرویس، با پشته فناوری مرتبط نیستند یا حول محور آن نمیچرخند.
کلام آخر
قبل از تصمیمگیری نهایی در مورد معماری مدنظر، مزایای معماری یکپارچه را با مزایای میکروسرویسها مقایسه کنید. بهترین کار این است که از این قانون اصلی پیروی کنید: فقط زمانی به سراغ معماری میکروسرویس بروید که مطمئن هستید باید سیستمی بسازید که فرآیند ساخت، استقرار، مقیاسبندی و مدیریت آن به عنوان یک برنامه یکپارچه، کاملا پیچیده است و همه چیز باید ساده طراحی شوند.