بررسی اپلیکیشن های Monolithic و ارتباط آنها با Container ها

در این قسمت از سری آموزش معماری اپلیکیشن‌های Asp.Net Core قرار است در رابطه با اپلیکیشن های Monolithic و همچنین ارتباط آنها با Container ها صحبت کنیم. اگر در رابطه با اپلیکیشن های Monolithic و تفاوت آنها با معماری مایکروسرویسی اطلاعات بیشتری را نیاز دارید می توانید از بسته ی آموزش ویدئویی مباحث اساسی معماری مایکروسرویس ها دیدن کنید. علاوه بر این توصیه می‌کنیم که از بسته ی آموزش ویدئویی شروع به کار با داکر (Docker) در ویندوز نیز استفاده بفرمایید.

اپلیکیشن های Monolithic و Container ها

با استفاده از Asp.Net Core به سادگی می توان یک اپلیکیشن تک و مبتنی بر معماری Monolithic را ایجاد کرد و سپس در قالب یک Container آن را Deploy نمود. درون این اپلیکیشن و یا سرویس ممکن است که سازماندهی به صورت Monolithic اتفاق نیفتاده باشد و از چندین library مختلف و یا کامپوننت ها و لایه‌های استفاده شده باشند. اما از فضای بیرون از آنجایی که این اپلیکیشن در یک Container قرار می‌گیرد و یا شبیه به یک Process تک به چشم می‌خورد شما یک وب اپلیکیشن و یا یک سرویس تک را مشاهده خواهید کرد.

به منظور مدیریت کردن این مدل از Deployment برنامه شما می توانید یک Container تک را به منظور استفاده کردن از یک اپلیکیشن تک Deploy کنید. برای انجام Scaling نیز می‌توانید کپی های اضافه را از این اپلیکیشن لحاظ کرده و از یک Load Balancer استفاده نمایید. سادگی این نوع از Deployment به دلیل مدیریت کردن یک Deployment تک در یک Container و یا ماشین مجازی تک می باشد. تصویر زیر اپلیکیشن‌های Monolithic موجود در Container ها که اصطلاحا به آنها Containerized Application می‌گویند را نشان می دهد.

البته شما می توانید چندین کامپوننت و یا library و یا حتی لایه های درونی را در یک Container تک لحاظ کنید. این موضوع در تصویر بالا نیز نشان داده شده است اما فراموش نکنید که بر اساس یک اصل بسیار مهم در استفاده کردن از یک Container همواره می بایست مسئولیت یک Container فقط یک چیز باشد و در یک Process تک قرار بگیرد. از این جهت می‌توان نتیجه گرفت که الگوی Monolithic با این اصل در تضاد است.

یکی از معایب استفاده کردن از این روش نیز زمانی رخ می‌دهد که اپلیکیشن به دلیل حجم زیادی از Request ها نیاز به Scale شدن دارد. اگر تمامی اپلیکیشن را بخواهیم Scale کنیم مشکل خاصی به وجود نمی‌آیند. مشکل اساسی زمانی رخ می‌دهد که فقط بخش‌های کوچکی از اپلیکیشن نیاز به Scale شدن دارند و دیگر کامپوننت ها و یا اجزای تشکیل دهنده برنامه کمتر استفاده می شوند.

یک مثال بسیار مناسب از این قضیه داشتن یک وب اپلیکیشن فروشگاه اینترنتی است. در یک فروشگاه اینترنتی بخش مربوط به نمایش اطلاعات محصولات بیشتر از بخش خرید محصولات مورد استفاده قرار می گیرند. به عبارت دیگر تعداد مشتریانی که محصولات را بررسی می‌کنند طبیعتاً بیشتر از مشتریانی است که اقدام به خرید می نمایند. از همین جهت نیاز است که برخی مربوط به نشان دادن کاتالوگ محصولات در یک وب اپلیکیشن به این شکل Scale بشود. با همین مثال ساده می‌توان متوجه شد که در اکثر اوقات ما نیازی به Scale کردن کل یک اپلیکیشن به صورت یکجا نداریم و اغلب نیاز است که قسمت‌های مختلف برنامه که مسئولیت‌های مختلفی نیز دارند مورد Scale شدن قرار بگیرند.

علاوه بر این چالش یکی دیگر از مشکلات مربوط به معماری Monolithic در این است که در زمان ایجاد تغییر در یک بخش تک اغلب نیاز به تست کردن کل برنامه و Deploy کردن دوباره تمامی اجزاء مختلف برنامه هستیم.

معماری Monolithic امروزه توسط بسیاری از سازمان ها استفاده می شود و بسیار نیز محبوب است. بسیاری از این سازمان‌ها نتایج خوبی با این معماری به دست آورده اند. البته برخی از سازمان‌ها نیز مشکلات عدیده ای را با این معماری خواهند داشت .یکی از دلایلی که اکثر افراد به سمت معماری‌های Monolithic می‌روند دشواری استفاده کردن از ابزارها و زیرساخت‌های مربوط به ساختن معماری های سرویس گرا و یا Service Oriented Architecture می باشد. بسیاری از سازمان‌ها پس از کار کردن با معماری Monolithic و رسیدن به نقاطی که محدودیت‌های مربوط به معماری احساس می شود سعی می‌کنند تا اپلیکیشن را به Container‌ های مختلف و مایکروسرویس‌های متعددی شکسته و معماری را به سمت یک معماری مایکروسرویسی پیش ببرند. در این رابطه نیز می توانید از بسته ی آموزش ویدئویی شروع به کار با معماری مایکروسرویس ها دیدن کنید. تصویر زیر نیز معماری مربوط به اپلیکیشن های Monolithic در زیر ساخت داکر را به شما نشان می‌دهد.

در رابطه با داکر توصیه می‌کنیم از بسته ی آموزش ویدئویی شروع به کار با داکر (Docker) در ویندوز دیدن کنید. استقرار و یا Deploy‌ کردن اپلیکیشنهای Monolithic می‌تواند در Microsoft Azure می تواند توسط ماشین های مجازی به سادگی انجام بشود. با استفاده از Azure Virtual Machine Scale Set شما می توانید ماشین های مجازی را Scale کنید. علاوه بر این Azure App Services اجازه می‌دهد که اپلیکیشنهای Monolithic را اجرا کرده و به صورتی کاملاً ساده Instance های مختلف آنها را بدون نیاز به مدیریت ماشین های مجازی Scale کنید. Azure App Services می تواند Instance های تکی از Docker Container را اجرا کند و این موضوع به مراتب باعث ساده تر شدن روال Deployment می گردد. با استفاده از داکر شما می توانید یک ماشین مجازی تک را به عنوان یک Docker Host استفاده کنید و سپس چندین Instance مختلف را اجرا نمایید. استفاده کردن از Azure Balancer شبیه آنچه که در تصویر بالا نیز مشاهده می کنید اجازه می دهد تا بتوانید روال Scale شدن برنامه را مدیریت نمایید.

علاوه بر این موضوع با استفاده از تکنیک‌های Deployment سنتی میتوانیم چندین Host مختلف را مدیریت کرده و Deployment را به آنها انجام بدهیم. Docker Host‌ ها را می‌توانیم با استفاده از دستورات از قبیل Docker Run مدیریت کنیم. علاوه بر این استفاده کردن از Pipelineهای مربوط به CD و یا Containers Delivery نیز به منظور انجام عملیات Automation مورد استفاده قرار می‌گیرند. در رابطه با Azure آموزش‌های بر روی وبسایت پرووید منتشر شدند که برای مثال می توانید از بسته ی آموزش ویدئویی توسعه مایکروسرویس ها در سی شارپ و Azure دیدن کنید.