عکس زیر معماری monolithic و microservice را به صورت ایدهآل به ما نمایش میدهد.
فرض کنید یک وبسایت eCommerce داریم که باید موارد ماژولهای زیر را داشته باشد:
مدیریت کاربران (User Managment)
مدیریت سفارشات (Order Managment)
مدیریت توزیع (Inventory Managment)
مدیریت تدارکات (Procurement Managment)
سیستم پرداخت (Payment)
پشتیبانی (Logistics)
معماری یکپارچه (monolithic):
در معماری یکپارچه (monolithic) همه اجزاء (components) در برنامه به صورت «یک کل» و «یک واحد مستقل» خواهد بود و این سه بخش به یکدیگر وابسته و به صورت دائم در تعامل هستند. در این معماری برای همه اجزاء دارای یک پایگاه داده (Data Base) هستند.
برنامههای مونولیتیک در یک قالب هستند، بنابراین نیازی به نگرانی از جهت کارکرد قسمت های مختلف برنامه نیست و به طبع آن deploy کردن برنامههای monolithic بسیار آسان است چرا که برنامه شما از ماژولهای جداگانه ساخته نشده و نیازی به deploy کردن بخشهای مختلف به صورت جداگانه ندارید.
اما تغییر دربرنامه و یا استفاده از تکنولوژیهای روز در این نوع معماری بخاطر اینکه برننامه به صورت یک کل نوشته شده بسیار سخت و در بعضی مواقع امکان پذیر نخواهد بود.
مزایای معماری monolithic عبارتند از:
استقرار آسان: یک فایل یا دایرکتوری خروجی برنامه deploy را آسانتر میکند.
توسعه: وقتی یک برنامه با یک سورس کد ساخته میشود، توسعه آن آسانتر است.
عملکرد: در یک سورس کد و پایگاه داده متمرکز، یک API اغلب میتواند همان عملکردی را انجام دهد که API های متعدد با میکروسرویسها انجام میدهند.
تست ساده: از آنجایی که یک برنامه یکپارچه یک واحد متمرکز است، تست end-to-end میتواند سریعتر از یک برنامه توزیع شده انجام شود.
اشکال زدایی آسان: با قرار گرفتن همه کدها در یک مکان، پیگیری یافتن مشکل آسانتر است.
معایب معماری monolithic:
سرعت توسعه آهسته تر: یک برنامه بزرگ و یکپارچه (monolithic) توسعه را پیچیدهتر و کندتر میکند.
مقیاسپذیری: شما نمیتوانید بخشهای مختلف برنامههای مونولیتیک را به صورت جداگانه مقیاسدهی کنید، بلکه فقط میتوانید کل مقیاس داده و ارتقا دهید.
قابلیت اطمینان: اگر در هر ماژول خطایی وجود داشته باشد، میتواند بر در دسترس بودن کل برنامه تأثیر بگذارد.
انطباق با تکنولوژیهای جدید: هر گونه تغییر در چارچوب یا زبان، بر کل برنامه تأثیر میگذارد و تغییرات را اغلب پرهزینه و وقتگیر میکند.
عدم انعطاف پذیری یک برنامه یکپارچه توسط فناوریهایی که در برنامه استفاده شده محدود میشود.
استقرار: یک تغییر کوچک در یک برنامه یکپارچه مستلزم deploy مجدد کل یکپارچه است.
معماری میکروسرویس (microservice):
اما در معماری میکروسرویس (microservice) هر جزء (component) به یک سرویس مستقل تبدیل میشود که هر کدام از این سرویسها منطق و پایگاه داده خودشان را دارند و کار خاص خودشان را انجام می دهند.
هر جزء که همان ماژولهای مستقل هستند، به صورت جداگانه deploy میشوند و به یکدیگر هیچ وابستگی نخواهند داشت؛ برای تشکیل یک برنامه بزرگ اجزاء از طریق API با یکدیگر تعاملات خودشان را خواهند داشت و جریان داده بین آنها برقرا خواهد شد.
یکی از بهترین مزیتهای برنامههایی با معماری microservices این است که مقیاسپذیری آنها بینهایت است چرا که میتوانیم هر کدام از سرویسها را به صورت جداگانه ارتقاء بدهیم. همچنین چون componentها به صورت مستقل هستند در صورتیکه یک component دچار مشکل یا خطا شود، فعالیت سایر اجزاء برنامه دچار اختلال نشده و برنامه crash نمیکند.
در طرف مقابل زمانی که یک برنامه را بر اساس microservices پیادهسازی میکنیم، یکپارچهسازی آن کمی مشکل میشود چرا که تمام کامپوننتهای آن از هم جدا هستند.
مزایای microservice:
کامپوننتهای مستقل: تمام سرویسهای این معماری میتوانند به صورت جداگانه به روز رسانی شده و deploy شوند.
درک سادهتر: طبیعتا در این معماری برنامهها دارای یک سورس کد واحد نیستند بلکه برای هر کدام از سرویسهای مورد نظر یک سورس کد جداگانه داریم و این سورس کدها به صورت مستقیم بوده و به هم وابسته نیستند.
مقیاسپذیری بهتر: یکی از بهترین مزیتهای برنامههایی با معماری microservices این است که مقیاسپذیری آن ها بینهایت است چرا که می توانیم هر کدام از سرویس ها را به صورت جداگانه ارتقاء بدهیم.
انعطاف در انتخاب تکنولوژی: از آنجایی که تعداد microservices بسیار زیاد است و انواع و اقسام خدمات برای شما موجود است، هیچ محدودیتی در انتخاب تکنولوژی وجود ندارد.
مقاومت بیشتر در برابر خطا: هر کامپوننت برنامه مستقل است، ایجاد اشکال و خطا در یکی از آنها دیگر بخشهای برنامه را فلج نمیکند.
معایب معماری microservice:
پیچیدگی زیاد: از آنجایی که در این معماری، برنامهها با کامپوننتهای توزیع شده هستند میبایست ارتباط بین تک تک کامپوننتها را برقرار کرده و پایگاه داده مربوط به هر کامپوننت را نیز در نظر بگیریم. همچنین deploy کردن کامپوننتها به صورت مجزا باید انجام شود.
توزیع منابع: توزیع منابع در microservices ها به صورت دستی انجام میشود و نیاز به توجه بسیار زیادی دارد.
یکپارچهسازی سیستم: زمانی که یک برنامه را بر اساس microservices پیادهسازی میکنیم، یکپارچهسازی آن کمی مشکل میشود چرا که تمام کامپوننتها از هم جدا هستند.
تستنویسی: نوشتن تست برای برنامههایی که دائما از APIهای مختلف استفاده میکنند کار بسیار سخت و وقت گیری خواهد بود.
از کدام معماری استفاده کنم؟
بنابراین در صورتی که برنامه شما بزرگ نیست و می خواهید آن را سریع راه بیندازید استفاده از معماری monolithic را پیشنهاد میشود. همچنین در نظر داشته باشید که ساخت برنامههای microservices نیاز به دانش فنی دارد و دست زدن به چنین کاری بدون داشتن تجربه کاری بسیار ریسکی محسوب میشود.
بنابراین تا زمانی که برنامه شما پیچیده نیست و تا زمانی که دانش کافی برای مدیریت آن را ندارید بهتر است از معماری microservices دوری کنید.