مفاهیمی از دنیای معماری نرم‌افزار

Modular Monolithicاین معماری که به سادگی و قابلیت نگه‌داری بالا معروف است ترکیبی از معماری ماژولار و معماری مونولوتیک است. در این معماری کد بزرگ برنامه اصلی بر اساس منطق کسب و کار به تعدادی بخش با ارتباط کم (loosely coupled) تقسیم می‌شود تا در صورت نیاز به تغییر یا توسعه‌ی هر بخش از کسب و کار، تاثیرهای ناخواسته بر کل برنامه کم شده و نیاز به بررسی کل کد برای سازگاری با هر تغییر نباشد.هرچند این معماری شباهت زیادی به معماری میکروسرویس دارد اما در معماری میکروسرویس استقلال بیشتری وجود داشته و هر میکروسرویس می‌تواند پایگاه داده‌، زبان برنامه نویسی و چهارچوب جدایی داشته باشد. اما معماری مونولوتیک ماژولار این تفاوت‌های بین ماژول‌ها وجود نداشته و بیشتر شبیه آنست که برنامه‌ای که از ابتدا یک کد بزرگ بوده را به بخش‌های کوچک‌تر بکشنیم. هرچند مقیاس پذیری معماری ماژولار مونولوتیک کمتر از معماری میکروسویس است اما در عوض پیچیدگی کمتری نسبت به آن دارد.این معماری قابلیت استفاده مجدد، نگه داری، refactor کردن، کپسوله سازی و مدیریت برنامه را ساده‌تر می‌سازد. [1,2]مقایسه معماری‌هاAWSوب سرویس آمازون یا Amazone Web Service، نام مجموعه‌ای از خدمات ابری شرکت آمازون شامل سرویس‌های محاسباتی، ذخیره‌سازی، شبکه‌، امینت و ... است که به توسعه‌دهندگان و استفاده‌کنندگان این امکان را می‌دهد تا به جای صرف انرژی و هزینه بر روی زیرساخت، بر روی ایده‌ی خود متمرکز شوند. این سرویس‌ها قابلیت آن را دارند که مصرف کننده تنها به میزانی که از آن‌ها استفاده می کند پول پرداخت کند و برای زمان‌هایی که استفاده‌ای ندارد هزینه محاسبه نشود. Elastic Compute Cloud (EC2) ، Simple Storage Service (S3)، Amazon RDS, DynamoDB, Redshift، Virtual Private Cloud (VPC), Route 53تعدادی از زیرمجموعه‌های سرویس AWSآمازون هستند. [3,4]پراکندگی جغرافیای AWSآمازونAPI-first Approachدر این روش توسعه‌ی نرم‌افزار، ابتدا APIها توسعه داده شده و سپس بقیه‌ی بخش‌هایی که از این APIها استفاده می‌کنند را توسعه می‌دهیم.این روش توسعه‌ انهطاف پذیری، قابلیت استفاده مجدد، تست پذیریو سرعت توسعه را افزایش داده و اجازه‌ی توزیع شده بودن را به ما می‌دهد. [5, 6]NoSQL Databasesاین نوع پایگاه داده که برای داده‌های غیر ساختاریافته و نیمه ساختاریافته مناسب است، در مواردی که نیاز به انعطاف پذیری بالا، کار با داده حجیم و متنوع است این نوع پایگاه داده به ذخیره و بازیابی و جستجتوی بهینه کمک شایانی می‌کند. [7,8]برخی پایگاه‌داده‌های غیررابطه‌ایServerless Architectureاین نوع معماری نرم‌افزار برای جداسازی دغدغه‌های سروری از نرم‌افزاری ساخته شده تا این مسئولیت‌های بر دوش ارائه دهنده‌ی خدمات ابری و نه توسعه دهنده باشد. توسعه دهنده برنامه را به صورت سرویس‌ها پیاده‌سازی کرده و مدیریت سرور به عهده توسعه دهنده نیست. این معماری چندین نوع دارد از جمله :این نوع معماری کاهش هزینه و افزایش مقایس پذیری و بهره‌وری را به دنبال دارد. [9,10]Domain Driven DesignDomain Driven Design یا DDDطراحی دامنه مجور نرم‌افزار است که در آن برنامه با توجه بیشتری به موضوعات و مفاهیمی که در دامنه وجود دارند طراحی می‌شوند. مسائلی مانند کلاس‌ها و متدها و اشیا از این دست موارد هستند. در این نوع توسعه به مفاهیم کسب‌پ کار توجه بیشتری می‌شود و هر ماژول برابر با یک دامنه مسئله خواهد بود. این نوع توسعه شامل Aggregate، Entity، Value Object و Repository است.طراحی دامنه محور قابلیت نگه‌داری و تغییر در نرم‌افزار را افزایش می‌دهد اما افزایش هزینه‌ی توسعه و پیچیدگی را به دنبال دارد. [11,12]Hexagonal architectureاین نوع از معماری که در آن برنامه از طریق پورت‌ها و یا آداپتورها با دیگر اجزا تعامل برقرار می‌کند به نام‌های معاری پورت و معماری آداپتور هم معروف است. ورودی‌ها و خروجی‌های نرم افزار از هسته اصلی جدا هستند و معماری مستقل از رابط هم به آن گفته می‌شود.مزیت بزرگ این معماری قابل تغییر و جایگزین بودن اجزای آن است. در این نوع معماری دامنه‌اصلی به صورت هسته‌ای در وسط قرار داشته و آن را از جزییات فنی جدا می‌کنیم. با این جداسازی تست پذیری و توسعه آسان تر می‌شود. [13,14]Event Sourcingگاهی اوقات به دلایل مختلفی مانند پایش عملکرد برنامه و رفع باگ لازم است تا استیت برنامه مانند مقادیر متغییر‌ها را ذخیره و تحلیل کنیم. بدیهی است که هر برنامه تعداد بسیار زیادی متغییر دارد و این مقادیر متغییرها با کمک الگوی نرم‌افزاری مدیریت رویدادها به صورت بهتری مدیریت می‌شوند.از معایب استفاده از این روش می‌توان به هزینه و پیچیدگی بالا اشاره نمود. [15,16]Low code platformsامروزه برنامه نویسی و تولید نرم‌افزار تنها مختص به دانش آموختگان رشته‌ی مهندسی کامپویتر نیست و هر کسی ممکن است نیار به توسعه‌ی نرم‌افزاری برای کار خود داشته باشد. جدای از افرادی که از طریق کانال ها و کتب آموزشی برنامه نویسی را یاد میگیرند، افرا بسیار زیادی نیز هستند که تنها یک بار در تمام عمر خویش ممکن است نیاز به توسعه‌ی یک نرم‌افزار نسبتا ساده پیدا کنند و نمی‌خواهند مدت زمان زیادی را صرف آموزش مفاهیم پایه‌ای و حتی پیچیده‌ی دنیای کامپیوتر و نرم‌افزار کنند. ابزارهای توسعه‌ی برنامه‌ی بدون نیاز به کد نویسی یا نیاز کم به کد نویسی مخصوص این افراد هستند. از جمله‌ی این ابزارها می‌توان به موارد زیر اشاره نمود: [17,18]Salesforce Platformو Google AppSheet و ‌ Microsoft Power Appsو Appianو OutSystemsBusiness Process Management Systems (BPMS)با کمک سیستم‌های مدیریت فرآیند تجاری، نقاط ضعف و قوت سازمان و فرآیندها شناسایی شده و از هدر رفت انرژی و زمان حلوگیری می‌شود تا با صرف هزینه و انرژی انسانی و ماشینی کمتر بازدهی بیشتری به دست بیاوریم. [19,20]Message Queue (such as Kafka and RabbitMQ)هنگامی که معماری‌هایی مانند معماری میکرو سرویس برای شکستن برنامه به اجزای کوچک تر استفاده می‌:نیم، این روش عیوب خود را نیز دارد، مواردی مانند افزایش پیچیدگی برنامه به دلیل افزایش تعامل میان میکروسرویس‌ها این تعاملات و پیام‌ها ممکن است قابلیت دریافت و پردازش و پاسخ دهی در لحظه‌ را به دلایلی مانند محدودیت منابع نداشته باشند. برای اینکه خللی در این پیام‌ها به وجود نیاید می‌توان از یک صف پیام مانند Apache Kafkaو RabbitMQ استفاده نمود به طوریکه پیام‌ها بدون آنکه بلاک شوند با میکروسرویسی منتظر پیامی بماند بقیه بخش ها به درستی کار خود را انجام دهند. [21,22]'=Container orchestration (such as Kubernetes)امروزه که اکثر برنامه‌های خصوصا بزرگ و دارای چندین لایه مانند پایگاه داده، لاجیک و فرانت به صورت کانتینرهایی در محیط هایی مانند داکر اجرا می‌شوند، هماهنگی این کانتینرها نیازمند مدیریت خاصی است که ابزارهایی برای آن‌ها وجود دارد. [23,24]Log Management Tools (such as ELK)زمانی که برنامه به صورت توزیع شده بر روی بیش از یک سرور قرار گرفته باشد، مدیریت و بررسی لاگ‌ها نیازمند هزینه و زمان بیشتری است. ابزارهای مدیریت و پایش لاگ ابزارهایی هستند که برای جمع‌آوری، ذخیره، تجزیه و تحلیل، نمایش و مدیریت لاگ‌ها و رویدادهای سیستمی در یک سیستم نرم‌افزاری استفاده می‌شوند. این ابزارها به توسعه‌دهندگان و مدیران سیستم کمک می‌کنند تا به راحتی دسترسی به اطلاعات لازم برای مشاهده و تحلیل عملکرد سیستم‌ها داشته باشند و مشکلات و مسائل عملیاتی را شناسایی کنند. ابزارهای مدیریت لاگ به صورت خودکار داده‌های لاگ را از منابع مختلف سیستم، برنامه‌ها، و سرویس‌ها جمع‌آوری می‌کنند. این شامل پیام‌های سیستم، خطاها، و رویدادهای مختلف می‌شود.ابزار ELK (Elasticsearch, Logstash, Kibana) یکی از معروف‌ترین مجموعه‌های ابزار مدیریت لاگ است. Elasticsearchبرای ذخیره و جستجوی لاگ‌ها و داده‌های سیستمی استفاده می‌شود، Logstash برای تجمیع و پردازش لاگ‌ها، و Kibana برای تصویرسازی و نمایش داده‌ها به صورت گرافیکی و تحلیلی استفاده می‌شود.[25,26]Monitoring tools (such as Prometheus)نظارت و مانیتور بخش مهمی از فرآیند نگه‌داری نرم‌افزار برای یافتن باگ‌ها و مشکلات پس از انتشار است. در برخی از این نرم‌افزارهای مانیتورینگ می‌توان متریک‌هایی را تعریف نمود تا برخی باگ‌ها مانند باگ‌های امنیتی قبل رخدادن یا در زمانی که به میزان مشخصی رخ دهند هشداری داده شود. پرومتئوس یکی از ابزارهای مانیتورینگ است که اطلاعات را از منابع متعددی مانند سرورها، کانتینرها، سیستم‌های ابری، و برنامه‌ها جمع‌آوری می‌کند و امکان تجزیه و تحلیل آنها را فراهم می‌کند.ابزار پرومتئوس معمولا به همراه Kubernetesاستفاده می‌شود. [27, 28]Static Code Analysis (such as SonarQube)این روش تحلیل برنامه که زیرشاخه‌ از white box testing است زیرا به کدبرنامه دسترسی داریم و جز اولین مراحل فرآیند CI/CD است به افزایش کیفیت و امینت برنامه کمک می‌کند. این ابزارها به توسعه دهندگان کمک می‌کند تا بدون نیاز به اجرای کد خطاهای اشتباهات نحوی و سینتکسی آن را پیدا کنند. مواردی مانند استفاده اشتباه از متغیرها، تعریف نادرست توابع و ...اما از عیب های این روش می‌توان به وجود موارد مثبت و منفی کاذب اشاره نمود.SonarQube یکی از ابزارهای معروف تحلیل ایستای کد است که قابلیت تحیلیل برنامه نوشته شده به زبان‌های مختلف و بررسی کیفیت کد، تست‌ها، باگ‌ها و آسیب‌پذیری‌های امنیتی را دارد. [29, 30]1- Microservices Killer: Modular Monolithic Architecture | by Mehmet Ozkaya | Design Microservices Architecture with Patterns &amp; Principles | Medium2 - Modular Monolithic vs. Microservices (fullstacklabs.co)3 - What is AWS (amazon.com)4 - Overview of Amazon Web Services - Overview of Amazon Web Services5 - Understanding the API-First Approach to Building Products (swagger.io)6 - What is API-first? The API-first Approach Explained | Postman7 - What Is NoSQL? NoSQL Databases Explained | MongoDB8 - What is NoSQL? | Nonrelational Databases, Flexible Schema Data Models | AWS (amazon.com)9 - Serverless Architectures (amazon.com)10 - Serverless Architecture: What It Is &amp; How It Works | Datadog (datadoghq.com)11 - Best Practice - An Introduction To Domain-Driven Design | Microsoft Learn12 - معرفی معماریDomain Driven Design (sokanacademy.com)13 - Hexagonal Architecture, there are always two sides to every story | by Pablo Martinez | SSENSE-TECH | Medium14 - Hexagonal architecture – overview and best practices (tsh.io)15 - Event sourcing (microservices.io)16 - Event Sourcing pattern - Azure Architecture Center | Microsoft Learn17 - outsystems.com/guide/low-code/18 - What is Low-Code Development? | Mendix19 - Business process management - Wikipedia20 - What is business process management software? (techtarget.com)21 - Apache Kafka Vs RabbitMQ: Main Differences You Should Know (simplilearn.com)22 - RabbitMQ vs Kafka - Difference Between Message Queue Systems - AWS (amazon.com)23 - Beginner’s Guide to Containers and Orchestration (pluralsight.com)24 - What is container orchestration? (redhat.com)25 - Log Management Tools(such as ELK) - ویرگول (virgool.io)26 - What Is ELK Stack: Tutorial on How to Use It for Log Management - Sematext27 - BrowserStack Test Observability28 - Remote Hands, server support and monitoring – CloudSolution (solutions-cloud.net)29 - Static + Dynamic Code Analysis with SonarQube | by Sandeep Kumar | Medium30 - SonarQube — Static Code Analysis. Code quality is important for overall… | by Nikhil karkra | Code To Express | Medium