بررسی معماری مونولیتیک (Monolithic Architecture)

بررسی معماری مونولیتیک (monolithic architecture)با اولین قسمت از یک آموزش متنی دیگر از وبسایت پرووید در خدمت شما هستیم. در این آموزش، قصد داریم که در رابطه با مفاهیم اصلی معماری مایکروسرویس ها صحبت کنیم. در ابتدا در رابطه با معماری monolithic صحبت خواهیم کرد، تا پس از آن؛ با استفاده از یک مقایسه بتوانیم مباحث مربوط به معماری مایکروسرویس ها را هرچه بهتر درک کنیم.معماری monolithic چیست؟در دنیای امروز نرم‌افزارهای تجاری طوری طراحی می شوند تا بتوانند بسیاری از نیازمندی‌های تجاری سازمان‌های مختلف را پاسخگو باشند. به عبارت دیگر؛ یک سیستم نرم افزاری ممکن است صدها قابلیت تجاری را در خود جای داده باشد و تمامی این قابلیت ها در یک برنامه تک قرار گرفته باشند. بطور معمول به چنین برنامه ها و نرم افزارهایی که تعداد بسیاری از قابلیت ها را در خود جای داده‌اند اصطلاحاً نرم‌افزارهای monolithic می گوییم. اگر بخواهیم این واژه را در زبان فارسی ترجمه کنیم می‌توانیم از واژه یکجا و یا فراگیر استفاده کنیم. مفهوم برنامه ریزی منابع تجاری و یا enterprise resource planing که به صورت کوتاه به آن ERP نیز می‌گویند، یکی از مثال هایی است که در حوزه نرم‌افزارهای monolithic قرار می گیرند. علاوه بر این؛ سیستم های مدیریت رابطه مشتری و یا customer relationship management که به طور کوتاه به آنها CRM نیز می‌گویند مثالی دیگر از این نوع از اپلیکیشن ها و سیستم های نرم افزاری به حساب می‌آیند. به عبارت دیگر اینگونه از نرم‌افزارها، دهها و یا حتی صدها قابلیت مختلف را برای پاسخ به نیازهای یک کسب و کار در خود جای داده اند. طبیعی است که استقرار و یا deploy کردن این گونه از سیستم‌های نرم‌افزاری، حذف و حل کردن خطا ها، بحث مقیاس پذیری و به روزرسانی کردن آنها کاری بسیار دشوار است. چراکه این گونه از سیستم‌های نرم‌افزاری پیچیدگی‌های زیادی دارند.سالها پیش، معماری سرویس گرا و یا service oriented architecture که به طور کوتاه به آن است SOA نیز می گویند، برای حل و فصل کردن بعضی از مشکلات نرم افزار های monolithic وارد عرصه توسعه نرم‌افزار شدند. در این گونه از معماری ها برای اولین بار واژه service مطرح شد. توصیه می کنیم که به جای ترجمه کردن این واژه به واژه خدمات در زبان فارسی، از همان واژه service استفاده کنید. ضمناً توصیه می‌کنیم که از بسته ی آموزش ویدئویی معماری مایکروسرویس ها در نرم افزار استفاده کنید.به طور معمول با استفاده از معماری سرویس گرا و یا SOA، یک سیستم نرم افزاری به عنوان ترکیبی از سرویس‌های مختلف، طراحی و ایجاد می شود. معمولاً معماری سرویس گرا، پیاده‌سازی یک سرویس را به صورت monolithic تعریف و البته محدود نمی کند. با این وجود، محبوبترین پیاده‌سازی این معماری که همان web service ها می باشند، یک سیستم نرم افزاری را به صورت monolith پیاده سازی می کند. با این حساب، یک سیستم نرم افزاری که در قالب web service ها پیاده سازی می شود، در واقع از web service های دانه درشتی تشکیل گردیده اند که در یک محیط اجرایی و run time یکسان اجرا می گردد. ضمناً، منظور ما از واژه دانه درشت همان coarse-grained می باشد که یک واژه فنی در توسعه نرم‌افزار به حساب می آید.شبیه به سیستم‌های نرم‌افزاری monolithic، اینگونه از service ها نیز در طول زمان ذره ذره رشد کرده و قابلیت‌های بیشتری را در خود جای داده و طبیعتاً پیچیده تر خواهند شد. با این رشد؛ چنین سرویس های کوچکی، به مرور حجیم شده و تفاوت اندکی بین آنها با سیستم های monolithic دیده خواهد شد. تصویری که در قسمت زیر مشاهده می کنید مثالی از یک معماری monolithic را نشان می‌دهد که در ادامه به بررسی کردن آن خواهیم پرداخت.تصویر بالا نشان دهنده یک سیستم نرم افزاری فروش است که از چندین service مختلف تشکیل شده است. تمامی این service ها، در یک run time و یا محیط اجرایی یکسان ایجاد و اجرا می شوند که این موضوع می‌تواند یک application server باشد. بنابراین، در این تصویر می توانیم چندین ویژگی منحصر به فرد برای نرم افزارهای monolithic را به راحتی درک کنیم. یکی از این ویژگی ها، پیچیدگی بالای این سیستم های نرم افزاری می باشد. علاوه بر این، چنین نرم افزارهایی به عنوان یک واحد تک، طراحی، توسعه و deploy می‌گردند. و از همین جهت، استفاده کردن از مفاهیم توسعه چابک و یا agile development در آنها دشوار است. در این رابطه توصیه می کنیم از بسته ی آموزش ویدئویی مدیریت پروژه های نرم افزاری چابک استفاده کنید.گذشته از تمامی این مشکلات، بروز رسانی کردن بخشی از یک نرم افزار monolithic، نیازمند دوباره deploy کردن تمامی آن نرم افزار می باشد. که این خود یکی دیگر از نقاط ضعف سیستم های monolithic به حساب می‌آید. مشکلات دیگری نیز در این روش وجود دارند. برای مثال یک سیستم نرم افزاری monolith می‌بایست به عنوان یک نرم‌افزار تک، مقیاس بندی و یا scale گردد. و scale کردن بدون در نظر گرفتن نیازمندی‌های متضاد منابع کمی دشوار است. برای مثال؛ ممکن است یک service نیاز به پردازنده بالاتری داشته باشد، در حالی که یک service دیگر نیاز به حافظه بیشتری داشته باشد. با داشتن service هایی که نیازمندی های سخت افزاری متفاوتی دارند، عملیات scale کردن بسیار دشوار خواهد بود. علاوه بر این؛ در چنین معماری، یک service تک می تواند تمامی سیستم را دچار مشکل کند و از کار بیندازد. به عبارت دیگر؛ نقطه شکست یک سیستم منحصراً به هر کدام از service ها مرتبط می گردد. استفاده کردن از framework ها و تکنولوژی های جدید و به کار بستن آنها در یک سیستم نرم افزاری monolithic نیز کاری دشوار است. تمامی این ویژگی های مضر در معماری monolithic، ما را به سمت معماری مایکروسرویس ها می برد که بسیاری از چنین مشکلاتی را حل و فصل خواهند کرد. البته به دلیل طولانی تر نشدن این درس، مطرح کردن مبحث معماری microservice ها را در درس بعد انجام خواهیم داد.