معماری نرم افزار چیست؟ – به زبان ساده + اهمیت
در این نوشتار سعی شده است تا به این سوال که معماری نرم افزار چیست به شکلی ساده و قابل درک پاسخ داده شود. ما مفاهیم اصلی و برخی از پرکاربردترین الگوهای معماری امروزی را مورد بحث قرار خواهیم داد. برای هر موضوع، یک مقدمه کوتاه انتزاعی و سپس چند قطعه کد نمونه آمده است تا به شما ایده واضحتری از نحوه کارکرد معماری نرم افزار ارائه شود.
معماری نرم افزار چیست؟
معماری نرم افزار در یک سیستم، نشاندهنده تصمیمات طراحی ساختار و رفتار کلی در آن سیستم است. یک سیستم مجموعهای از مولفهها است که هر یک کارکرد یا کارکردهای خاصی را انجام میدهند. به عبارت دیگر، معماری نرمافزار پایه محکمی را فراهم میکند که بر اساس آن میتوان نرمافزار را توسعه داد. معماری نرم افزار تعیینکننده کیفیت، عملکرد، قابلیت نگهداری و موفقیت کلی سیستم است. چندین الگو و اصول معماری سطح بالا وجود دارند که معمولاً در سیستمهای مدرن استفاده میشوند. این الگوها اغلب به عنوان سبکهای معماری شناخته میشوند. معماری یک سیستم نرم افزاری معمولا محدود به یک سبک معماری واحد نیست، بلکه ترکیبی از سبکهایی است که اغلب در سیستم مورد استفاده قرار میگیرد.
به بیانی دیگر، معماری نرم افزار به ساختارهای اساسی یک سیستم نرم افزاری و نظم و انضباط ایجاد چنین ساختارهایی اشاره دارد. هر ساختار شامل عناصر نرم افزار، روابط بین آنها و ویژگیهای آن عناصر و آن روابط است. معماری سیستم نرم افزاری، استعارهای مشابه با معماری یک ساختمان است. معماری نرم افزار به عنوان طرح اولیهای برای سیستم و پروژه در حال توسعه عمل میکند و مدیر پروژه میتواند بعداً از آن برای برونیابی وظایف لازم تیمها و افراد حاضر در پروژه استفاده کند. مستندسازی معماری نرم افزار ارتباط بین ذینفعان را تسهیل میکند، به تصمیمگیری اولیه در خصوص طراحی سطح بالا کمک میکند و امکان استفاده مجدد از اجزای طراحی بین پروژهها را فراهم میکند.
مهم ترین بخش های معماری نرم افزار کدامند؟
مهمترین بخشهای معماری نرم افزار در فرآیند توسعه یک برنامه، شامل موارد زیر میشود.
- جزئیات پیادهسازی (ساختار پوشه مخزن)
- تصمیمات طراحی پیادهسازی (این که باید از Render سمت سرور استفاده شود یا از رندر سمت کاربر، این که باید از پایگاه داده رابطهای استفاده شود یا از پایگاه داده غیر رابطهای).
- فناوریهای مورد استفاده (این که برای API از REST استفاده شده است یا از GraphQl، برای بکاند از «پایتون» (Python) و «جنگو» (Django) استفاده شده یا از Node و Express).
- تصمیمات طراحی سیستم (این که سیستم نرم افزار یکپارچه یا Monolith است یا از «میکروسرویسها» (Microservices) استفاده شده است).
- تصمیمات زیرساختی (این که نرم افزار در محل میزبانی شده یا توسط یک ارائهدهنده خدمات ابری تامین شده است).
این ۵ بخش در ترکیب با یکدیگر، حالتهای متنوعتری ایجاد میکنند. برای توضیح بهتر این حالتهای ترکیبی، ابتدا برخی از مفاهیم عمومی و اولیه در معماری نرم افزار را توضیح میدهیم و سپس برخی از این تقسیمبندیها را به طور اجمالی بررسی میکنیم و رایجترین الگوهای معماری یا انتخابهایی که امروزه برای ساخت برنامههای کاربردی استفاده میشوند را توضیح میدهیم.
مفاهیم مهم معماری نرم افزار چیست ؟
در اینجا برای درک بهتر این که معماری نرم افزار چیست به مفاهیم زیر پرداختهایم.
- مدل کلاینت-سرور
- کاربرد API در معماری نرم افزار
- پیمانهبندی (ماژولاریتی) در توسعه کد
مدل کلاینت-سرور در معماری نرم افزار چیست ؟
برای این که بدانیم معماری نرم افزار چیست، ابتدا به شرح مفهوم کلاینت - سرور میپردازیم. کلاینت-سرور یک ساختار کاربردی توزیع شده است که وظایف یا حجم کاری را بین ارائهدهندگان یک منبع یا سرویس، به نام سرور، و درخواستکنندگان خدمات، به نام کلاینت، تقسیم میکند. به زبان ساده، کلاینت یک برنامه کاربردی است که نوعی اطلاعات را درخواست میکند یا اقداماتی را انجام میدهد و سرور برنامهای است که اطلاعات را ارسال میکند یا مطابق با فعالیت کاربر، اقداماتی را انجام میدهد. کلاینتها معمولاً توسط برنامههای فرانتاند که روی وب یا برنامههای تلفن همراه اجرا میشوند، ارائه میشوند. البته پلتفرمهای دیگری نیز وجود دارند و برنامههای بکاند نیز میتوانند به عنوان کلاینت عمل کنند. سرورها معمولاً برنامههای کاربردی بکاند هستند.
برای مثال فرض کنید در حال ورود به شبکه اجتماعی مورد علاقه خود هستید. وقتی URL را در مرورگر خود وارد میکنید و کلید اینتر را میزنید، مرورگر شما به عنوان برنامه کلاینت عمل میکند و درخواستی را به سرور آن شبکه اجتماعی ارسال میکند. سرور در پاسخ به درخواست شما محتوای وبسایت را ارسال میکند. اکثر برنامههای کاربردی امروزه از مدل کلاینت-سرور استفاده میکنند. مهمترین مفهومی که باید در این خصوص به یاد داشته باشید این است که کلاینت منابع یا خدماتی را درخواست میکند و سرور به این درخواستها پاسخ میدهد. مفهوم مهم دیگری که باید بدانید این است که کلاینتها و سرورها بخشی از یک سیستم هستند، اما هر کدام به تنهایی یک برنامه یا اپلیکیشن به حساب میآیند. به این معنی که آنها را میتوان به طور جداگانه توسعه داد، میزبانی کرد و اجرای آنها را انجام داد.
API در معماری نرم افزار چیست ؟
همانطورکه پیشتر اشاره شد کلاینتها و سرورها موجودیتهایی هستند که برای ارسال درخواست و ارسال پاسخ با یکدیگر ارتباط برقرار میکنند. API (رابط یا واسط برنامه نویسی اپلیکیشن یا برنامه کاربردی) روشی است که این دو بخش برای برقراری ارتباط استفاده میکنند. API مجموعهای از قوانین تعریف شده به حساب میآید که نحوه برقراری ارتباط برنامهای را با برنامه دیگر مشخص میکند. در واقع API قراردادی بین کلاینت و سرور است که مثلا بیان میکند: «اگر A را بفرستید، پاسخ من همیشه B خواهد بود. اگر C را بفرستید، پاسخ من همیشه D خواهد بود» و تا انتها به همین شکل ادامه پیدا میکند..
با داشتن این مجموعه قوانین، کلاینت دقیقاً میداند برای انجام یک وظیفه خاص به چه چیزی نیاز دارد و سرور دقیقاً میداند که هنگام انجام یک عمل خاص، کلاینت به چه چیزی نیاز خواهد داشت. راههای مختلفی برای پیادهسازی API وجود دارد. رایجترین آنها REST، SOAP و GraphQl هستند. APIها برای برقراری ارتباط اغلب از پروتکل HTTP استفاده میکنند و محتوا در قالب JSON یا XML مبادله میشود. اما استفاده از سایر پروتکلها و فرمتهای محتوا نیز امکان پذیر است.
ماژولار بودن در معماری نرم افزار چیست ؟
ماژولار بودن نرم افزار، تجزیه نرم افزار به بخشهای کوچکتر با رابطهای استاندارد است. ما میخواهیم محصولاتی با قطعه کدهای قابل استفاده مجدد ایجاد کنیم، بنابراین فقط یکبار یک قابلیت عملکردی (فیچر | فانکشن) را پیادهسازی کرده و سپس از آن مکرراً استفاده میکنیم. ماژولار بودن برای سادهسازی برنامههای کاربردی و کدهای پایهای بزرگ انجام میشود و دارای مزایایی است که در ادامه به برخی از آنها اشاره شده است.
- پیمانهبندی کمک میکند تا قابلیتهای عملکردی تقسیمبندی شوند و در نتیجه بصریسازی، درک و سازماندهی پروژه تسهیل خواهد شد.
- هنگامی که پروژه بهصورت شفاف سازماندهی و تقسیمبندیشده باشد، نگهداریآن آسانتر است و خطاها و باگهای کمتری تجربه خواهد شد.
- اگر پروژه شما به بخشهای مختلفی تقسیم شده باشد، میتوان هر بخش را به طور مستقل توسعه داد و اصلاحات لازم را پیادهسازی کرد که اغلب بسیار مفید است.
در ادامه مثالها و مواردی ارائه خواهد شد که جزئیات بیشتری از مفهوم پیمانهبندی را تشریح میکنند.
زیرساخت در معماری نرم افزار چیست ؟
زیرساخت فناوری اطلاعات، سیستمی از سختافزار، نرمافزار، امکانات و مؤلفههای خدمات است که از تحویل سیستمهای تجاری و فرآیندهای مبتنی بر فناوری اطلاعات پشتیبانی میکند. برای این که بدانیم زیرساخت در معماری نرم افزار چیست و برای درک راحتتر مفاهیم معماری نرم افزار ، یک برنامه فرضی بهنام Notflix در ادامه توسعه داده شده است.
معماری مونولیتیک در معماری نرم افزار چیست ؟
فرض کنید Notflix یک برنامه پخش ویدئو است که در آن کاربر میتواند فیلم، سریال، مستند و غیره تماشا کند. کاربر میتواند از این برنامه در مرورگرهای وب، به صورت اپلیکیشن موبایل یا اپلیکیشن قابل اجرا روی تلویزیون استفاده کند. خدمات اصلی موجود در این برنامه شامل موارد زیر است:
- احراز هویت (برای این که کاربران بتوانند حساب کاربری ایجاد کنند و وارد سیستم شوند).
- پرداخت (برای این که کاربران بتوانند حق اشتراک خریداری کنند و به محتوا دسترسی داشته باشند).
- پخش فیلم یا استریم کردن (برای این که کاربران بتوانند آنچه را که خریداری کردهاند تماشا کنند).
مطابق با تصویر بالا، در سمت چپ سه برنامه مختلف فرانتاند داریم که در این سیستم به عنوان کلاینت عمل میکنند. برای مثال فرض کنید فرانت برنامه با React و React-native توسعه داده شده باشند. ما یک سرور واحد داریم که درخواستها را از هر سه برنامه کلاینت دریافت میکند، در صورت لزوم با پایگاه داده یا همان بانک اطلاعاتی ارتباط برقرار میکند و بر اساس آن به هر یک از کلاینتها پاسخی را ارسال میکند. فرض کنید بکاند برنامه با Node و Express توسعه داده شده است.
این نوع معماری، مونولیتیک یا یکپارچه نامیده میشود زیرا یک برنامه واحد در سمت سرور وجود دارد که مسئولیت تمام ویژگیهای سیستم را بر عهده دارد. در این مثال، اگر کاربری بخواهد احراز هویت کند، وجهی را پرداخت کند یا یکی از فیلمها را تماشا کند، همه درخواستها به همان سرور واحد ارسال میشوند. مزیت اصلی طراحی مونولیتیک، سادگی آن است. عملکرد آن و تنظیمات مورد نیاز آن آسان است و به همین دلیل، شروع توسعه اکثر برنامهها با این روش انجام میشود.
معماری میکروسرویس در مهندسی نرم افزار چیست ؟
برای این که بدانیم معماری میکروسرویس در معماری نرم افزار چیست، مثال مربوط به برنامه پخش فیلم را بسط میدهیم. فرض کنید میزان فروش فیلم و سریال در برنامه فرضی Notflix بیش از حد انتظار است و هر ماه دهها هزار کاربر جدید از سراسر جهان مشترک برنامه میشوند که برای کسبوکار ما عالی است، اما برای برنامه «یکپارچه» ما چندان مناسب نیست. این حجم از کاربران باعث شده است تا در زمان پاسخگویی سرور تأخیر ایجاد شود، و حتی با وجود اینکه سرور را به صورت عمودی مقیاسبندی کردهایم (یعنی رم بیشتر و پردازنده گرافیکی قویتری در آن قرار دادهایم)، به نظر میرسد که این دستگاه نمیتواند بار دریافتی را تحمل کند.
علاوه بر این، ویژگیهای جدیدی در سیستم در حال توسعه است و منبع کدهای اصلی ما شروع به بزرگتر شدن و پیچیدهتر شدن بیش از پیش میکند. مثل سیستم توصیهگری که ترجیحات کاربر را میخواند و فیلمهایی را که متناسب با پروفایل کاربر است توصیه میکند. با تجزیه و تحلیل دقیقتر این مسئله، متوجه میشویم، قابلیتی که بیشترین منابع را به خود اختصاص میدهد، سرویس پخش فیلم است در حالی که سایر خدمات شامل احراز هویت و پرداخت، بار زیادی را تحمیل نمیکنند. برای حل این مسئله، یک معماری میکروسرویس را پیاده سازی میکنیم که آن را در تصویر زیر ملاحظه میکنید:
بنابراین معماری میکروسرویس، تقسیم ویژگیهای سمت سرور به چندین سرور کوچک است که تنها مسئول یک یا چند ویژگی خاص هستند. در معماری مونولیتیک فقط یک سرور واحد داشتیم که مسئولیت تمام ویژگیها را برعهده داشت. پس از پیادهسازی میکروسرویسها، چندین سرور کوچک خواهیم داشت که هر یک زیرمسئولیتهایی را بر عهده دارند؛ یکی مسئول احراز هویت، یکی مسئول پرداختها، یک سرور برای پخش فیلم و یک سرور نیز متصدی سیستم توصیه خواهد بود. برنامههای سمت کاربر، هنگامی که کاربر قصد دارد لاگین کند، با سرور احراز هویت، زمانی که میخواهد پرداخت کند با سرور پرداخت و زمانی که میخواهد فیلمی را تماشا کند با سرور پخش فیلم ارتباط برقرار میکند.
تمام این ارتباطات از طریق APIها، درست مانند یک سرور مونولیتیک معمولی (یا از طریق سیستمهای ارتباطی دیگر مانند کافکا یا RabbitMQ)، انجام میشود. در واقع اکنون ما سرورهای متعددی داریم که مسئول عملیات مختلفی هستند. در حالت قبلی صرفا یک سرور وجود داشت که همه عملیات را انجام میداد.
مزایای معماری میکروسرویس چه هستند؟
میکروسرویس مزایایی به همراه دارد که برخی از آنها به شرح زیر است:
- در معماری میکروسرویس لازم نیست کل قسمت بکاند به یکباره مقیاسبندی شود و به جای آن میتوان فقط برخی از سرویسهای خاص و مورد نیاز را مقیاسبندی کرد. در مثال فوق، هنگامی که با مسئله عملکردی مواجه شدیم، برای حل مشکل، کل سرور را به ناچار به صورت عمودی مقیاسبندی کردیم اما قابلیتی که منابع بیشتری را نیاز داشت، فقط پخش فیلم بود. با اجرای معماری میکروسرویس که ویژگی پخش فیلم را به سرور اختصاصی خود متصل میکند، میتوانیم تنها این سرور مایکرو را مقیاسبندی کنیم.
- ویژگیها وابستگی کمتری به یکدیگر دارند، به این معنی که ما میتوانیم آنها را بهطور مستقل توسعه دهیم و اجرا کنیم.
- منبع کدهای اصلی برای هر سرور بسیار کوچکتر و سادهتر خواهد بود که این موضوع هم برای توسعهدهندگانی سودمند است که از ابتدا در تیم توسعه حضور داشتهاند و هم درک آن برای توسعهدهندگان جدید آسانتر و سریعتر خواهد بود.
- راهاندازی و مدیریت معماری میکروسرویس در مقایسه با معماری یکپارچه پیچیدهتر است؛ به همین دلیل به کارگیری آن صرفاً در پروژههای بسیار بزرگ منطقی و موجه است. بیشتر پروژهها در ابتدا بهصورت مونولیتیک توسعه مییابند و تنها در صورت نیاز و به دلایل عملکردی به میکروسرویسها منتقل میشوند.
الگوی بک اند برای فرانت اند در معماری نرم افزار چیست؟
یکی از مسائلی که هنگام پیادهسازی میکروسرویسها پیش میآید این است که ارتباط با برنامههای فرانتاند پیچیدهتر میشود. اکنون ما سرورهای متعددی داریم که مسئولیت کارهای مختلف را بر عهده دارند، به این معنی که برنامههای فرانت باید پیگیر اطلاعات سرویسها باشند تا بدانند برای چه کسی درخواست ارسال کنند.
مقاله خوبی بود
کامل و در عین حال ساده
سلام یه سوال نیازمندی ها در معماری چی هست ؟
بسیار تحقیق جامع و کاربردی تری نسبت به دیگر افراد داشتید. کارتان بسیار عالی بود