برسی چند موضوع کلی در معماری نرم افزار

هدف از این مطلب معرفی چند مفهوم مرتبط با معماری نرم افزار میباشد.Modular Monolithic:این سبک از معماری به ما کمک میکند که هر منطق از نرم افزار را در module جداگانه پیاده سازی کنیم. در نتیجه میتوانیم تا حد زیادی نگرانی ها در توسعه نرم افزار را از هم جدا کرده و برای هم module به صورت جداگانه منطقی که مورد نظر میباشد را پباده سازی کنیم. در این معماری بهتر است هر module تا حد امکان مستقل بوده و module ها کمترین ارتباط را با هم داشته باشند. در این معماری دیپلوی شدن کل نرم افزار به صورت یکجا انجام میشود پس با هم تغییر باید کل نرم افزار مجدد دیپلوی شود.AWS:مخفف amazon web service میباشد. یک ابزار متعلق به شرکت amazon برای مدیریت خودکار دیپلوی نرم افزار همچنین محاسبات ابری و فرآیند های ci/cd میباشد. این ابزار به کسب و کار های مختلف این امکان را میدهد که بخشی از کار های مرتبط با استقرار نرم افزار را خودکار کرده و تمرکز خود را روی توسعه کسب و کار خود بگذارند. همچنین در بحث قیمت گذاری به کاربران اجازه میدهد که به اندازه نیازشان منابع سخت افزاری تهییه کنند و هزینه بالایی برای این منابع پرداخت نکنند. همچنین به دلیل استفاده از سرور های قدرتمند شرکت آمازون down time نزدیک به صفر را تجربه کنند.API-first Approach:این روش بیان میکند که توسعه api ها که نیاز کسب و کار را فراهم میکنند باید در اولویت اول قرار گیرد. در روش معمول نرم افزار توسعه داده شده و بر اساس نیاز نرم افزار (معمولا نیاز بخش front-end) یک دسته از api ها توسعه داده میشوند که تنها رابطی بین دیتابیس و بخش ظاهری نرم افزار میباشند. ولی این روش بیان میکند که api ها مهم ترین بخش نرم افزار هستند و توسعه آن ها باید مستقلا صورت بگیرد.NoSQL Databases:مخفف Not Only Sql میباشد این نوع از پایگاه های داده داده های را به شکلی به جز جداولی که با هم رابطه دارند (پایگاه های داده sql) نگه داری میکنند. این دیتابیس ها انواع مختلفی دارند و طیف بزرگی را شامل میشوند مانند دیتابیس های Document-oriented ، دیتابیس های مبتنی بر گراف ، دیتابیس هایی با ساختار key-value و … . در این دیتابیس ها نمیتوان از مزایای دیتابیس های sql تا حد زیادی استفاده کرد ولی هر کدام از انواع آن مزایایی دارند و برای مصارف خاص خود مناسب هستند.Serverless Architecture:این نوع معماری روشی را معرفی میکند که فرآیند تولید نرم افزار بدون نیاز به انجام کار های زیرساختی سمت سرور انجام شود. معمولا از ابزار هایی مانند AWS , google cloude و … برای اتماتیک کردن فرآیند های دیپلویمنت استفاده میشود. مزیت این روش این است که میتوان زمان بیشتری روی توسعه خود نرم افزار و قابلیت های مورد نیاز آن صرف کرد و نیاز نیست بخشی از زمان به فرآهم کردن زیرساخت مناسب برای استقرار نرم افزار صرف شود. البته عیب اصلی این نوع معماری این است که امکان شخصی سازی کامل مسائل مربوط به زیرساخت در آن وجود ندارد.Domain Driven Design:در این روش معماری ماژول ها و اجزای نرم افزار دقیقا مشابه اجزای کسب و کاری که نرم افزار آن را مدل میکند پیاده سازی میکند. هر ماژول یک domain نامیده میشود که معرف یکی از اجزای کسب و کار است. به عنوان مثال در یک نرم افزار بانکی تمام موارد مربوط به وام دهی در یک ماژول جدا پیاده سازی میشود.Hexagonal architecture:هدف از این روش معماری این است که اجزای نرم افزار تا حد ممکن کمترین وابستگی و ارتباط را با هم داشته باشند. در این روش تمام اجزایی که کار مشابه میکنند یا به هم وابستگی دارند در کنار هم پیاده سازی میشوند. هر کدام از این اجزا مانند یک ضلع چند ضلعی پیاده سازی میشوند. اضلاع این چند ضلعی با هم در ارتباط نبوده و تمام این اضلاع در کنار هم نیاز کسب و کاری مورد نیاز را رفع میکنند.Event Sourcing:زمانی که نیاز داریم یک تغییری در پایگاه داده ایجاد کرده و نتیجه آن را به یک سرویس message broker ارسال کنیم میتوانیم از این تکنیک استفاده کنیم. از آنجایی که بعضی از تغییر ها در پایگاه داده میتواند زمان بر باشد پس این فرآیند ایجاد تغییر و ارسال نتیجه میتواند اتوماتیک بوده و توسط این پترن انجام شود. این پترن به این شکل کار میکند که هر زمان state پایگاه داده تغییر کرد ( در داده ها تغییری ایجاد شد‌ ) یک پیام به message broker ارسال میکند و این تغییر state را اطلاع میدهد. این روش معمولا در کنار معماری CQRS استفاده میشود.Low code platforms:این نوع پلتفرم ها امکان طراحی و توسعه نرم افزار ها را توسط یک محیط گرافیکی فرآهم میکنند. معمولا در این پبتفرم ها نیاز به نوشتن کمی کد برای تنظیمات خاص میباشد و بقیه موارد توسط خود پلتفرم انجام میشود. خوبی این پلتفرم ها این است که افراد بدون دانش فنی میتوانند با آن کار کنند. از معروف ترین این پلتفرم ها میتوان به Appian ، Mendix ، OutSystems و … اشاره کرد.Business Process Management Systems:این سیستم ابزار هایی را فرآهم میکند که میتوان با آن فرآیند های مرتبط با کسب و کار را بهتر میدیریت کرد. این فرآیند ها شامل مواردی مثل طراحی ، مدل سازی ، اجرای فرآیند ، نظارت بر فرآیند ، بهینه‌ سازی و طراحی مجدد میباشد. این سیستم برخی از این فرآیند ها را خودکار کرده و با این کار اتلاف زمان و انرژی را به حداقل میرساند. این سیستم در بخش های مختلف یک کسب و کار مانند منابع انسانی ، امور مالی ، قسمت فروش و … کاربرد دارد. تعداد زیادی از نرم افزار های متن باز وجود دارد که این سیستم را پیاده سازی کرده اند.Message Queue:این ابزار ها یک صف را پیاده سازی میکنند. کاربرد این صف ها برای ارتباط بین سرویس ها معمولا در معماری میکروسرویس میباشد. از آنجایی که یک سرویس ممکن است امکان پاسخ گویی به تعداد زیادی درخواست در آن واحد را نداشته باشد به یک سیستم واسط نیاز است که درخواست ها در یک ساختار داده مانند صف قرار بگیرند و به نوبت به آنها رسیدگی شود. از ابزار های مرسوم برای این کار میتوان به RabbitMQ و kafka اشاره کرد که در اکثر نرم افزار های مبتنی بر سرویس از این دو استفاده میشود.Container orchestration:هنگام کانترنرایز کردن یک نرم افزار به ابزاری نیاز است که مدیریت این کانتینر ها را راحت تر کند. این کار باعث میشود که نیاز به تعداد زیادی از افراد برای مدیریت کانتینر ها نباشد و فرآیند ها تا حد زیادی خودکار شوند. از جمله مواری که این نرم افزار ها مدیریت میکنند میتوان به لود بالانسینگ ، دیپلویمنت و تمام مواردی که مربوط به life cycle کانتینر ها میباشد. از جمله نرم افزار هایی که برای این منظور استفاده میشود میتوان به kubernetes اشاره کرد.Log Management Tools:مدیریت لاگ ها در سیستم هایی که از چند سرویس مجزا تشکیل شده اند کار دشواری است، همچنین برای این سیستم ها نیاز است که در صورت وجود اشکال با برسی لاگ های سیستم مشخص شود که اشکال اصلی از کدام سرویس میباشد. به این منظور به ابزار هایی نیاز است که مدیریت لاگ ها در اینگونه سیستم ها را تا حد زیادی خودکار کرده و به شکل قابل فهمی نمایش دهد. این ابزار ها به این هدف تولید شده اند. از معروف ترین این ابزار ها میتوان به سه ابزار elastic , kibana و logstash اشاره کرد که معمولا این سه در کنار هم استفاده میشوند.Monitoring tools:با بیشتر شدن استفاده از نرم افزار های cloud native نیاز به ابزاری که بتواند سرور های نرم افزار را به درستی برسی و مانیتورینگ کند بیشتر احساس میشود. این نرم افزار ها باید تا حد زیادی قابل اعتماد باشند که بتوان از آن ها اطلاعات درستی در مورد سرور ها به دست آورد. از معروف ترین این ابزار ها میتوان به prometheus اشاره کرد. این ابزار به طور منظم داده های مرتبط با پرفرمنس سیستم را جمع آوری کرده و در یک دیتابیس مبتنی بر زمان (time-series database) ذخیره کرده و میتوان از این داده ها جهت عیب یابی سرور ها استفاده کرد.Static Code Analysis:این نرم افزار ها بخشی از فرآیند code review را خودکار کرده و میتواند ایرادات بیشتر ظاهری کد را شناسایی و پیش از اجرای کد برطرف کند. همچنین معمولا در فرآیند های CI/CD اولین stage مربوط به این بخش میباشد. از ابزار های مناسب برای این کار میتوان به sonarQube اشاره کرد.