مروری بر معماری‌ها و مفاهیم نوین نرم‌افزاری

این مطلب تمرینی از درس معماری نرم افزار دانشگاه شهید بهشتی به تدریس دکتر صادق علی اکبری می باشد.Modular Monolithicمعماری Modular Monolithic (یکپارچه ماژولار) یک رویکرد توسعه نرم افزار است که سادگی یک معماری یکپارچه را با مزایای طراحی ماژولار ترکیب می کند. این برنامه را به ماژول‌هایی تقسیم می‌کند که هر کدام دارای مرزها و وابستگی های کاملا مشخص هستند. هر ماژول منطق کسب و کار مستقل را برای خود دارد و می تواند دارای پایگاه داده خود باشد. این معماری امکان جداسازی منطقی درون ماژول ها را با پیروی از اصول معماری تمیز فراهم می کند. اگرچه نگرانی هایی مانند زمان طولانی کامپایل و مدت زمان deployment وجود دارد اما مزایایی مانند افزایش بهره وری، debugging ساده، افزایش قابلیت نگهداری (maintainability) و اینکه می تواند به صورت تدریجی به سمت میکروسرویسی شدن معماری رود را دارد. به طور کلی، معماریModular Monolithic انتخابی برای سناریوهای خاص است که تعادلی بین سادگی و مقیاس پذیری ارائه می دهد و باید توسط معمار سیستم گرفته شود.AWS – Amazon Web Servicesخدمات وب آمازون (AWS) یک پلتفرم رایانش ابری جامع است که توسط آمازون ارائه شده است و ارائه دهنده محصولات زیرساخت به عنوان سرویس(IaaS)، پلتفرم به عنوان سرویس (PaaS) و نرم افزار به عنوان سرویس (SaaS) است. AWS اولین خدمات وب خود را در سال 2002 راه اندازی کرد که از زیرساخت داخلی آمازون که برای عملیات خرده فروشی آنلاین طراحی شده بود، سرچشمه می گرفت. با بیش از 200 سرویس طبقه بندی شده در محاسبات، ذخیره سازی، پایگاه های داده، تجزیه و تحلیل، شبکه و موارد دیگر، AWSتوسط سازمان ها در کشور های توسعه یافته :))) از جمله سازمان های دولتی، موسسات آموزشی و شرکت های خصوصی استفاده می شود. AWS در 87 منطقه که در ده‌ها مرکز داده در سراسر جهان پخش شده‌، خدمات کلیدی که ارائه می دهد عبارتند از Amazon EC2 برای سرورهای مجازی،Amozon S3 برای ذخیره سازی اشیاء مقیاس پذیر و پایگاه داده های مختلف مانند DynamoDB و Amazon RDS. ویژگی‌های امنیتی این پلتفرم شامل AWS Identity and Access Management، خدمات رمزگذاری و ابزارهایی مانند Amazon Inspector برای تجزیه و تحلیل آسیب‌پذیری است. AWS بالاترین سهم را در بازار ابری دارد و تا سه ماهه اول سال 2022، 33 درصد از کل سهم بازار را در اختیار داشته و از رقبایی مانند Microsoft Azure و Google پیشی گرفته است.API-first Approachیک پارادایم توسعه نرم افزار است که API ها را در اولویت قرار می دهد و آنها را به عنوان عناصر اساسی در ایجاد برنامه ها در نظر می گیرد. در رویکرد API-first، توسعه‌دهندگان قبل از نوشتن کدهای دیگر،API را می‌سازند.API ها می توانند private، partner و public باشند که نقش های مختلفی دارند مثلا API های خصوصی برای استفاده داخلی است. اتخاذ یک مدل API-first مزایای قابل توجهی را به همراه دارد و توسعه دهندگان را قادر می سازد تا نرم افزارهای انعطاف پذیرتر را در زمان کمتری ایجاد کنند. به غیر از استفاده ای که خود توسعه دهندگان از API ها دارند به تحلیلگران کسب و کار و مدیران محصول، اجازه می دهد در ساخت برنامه های کاربردی شرکت کنند. بهبود کیفیت نرم‌افزار نتیجه مستقیم رویکرد API-first است که از رسیدن اشکالات به تولید جلوگیری می‌کند و همکاری بین تیم‌ها را افزایش می‌دهد.NoSQL Databasesپایگاه های داده NoSQL دسته ای از پایگاه های داده هستند که برای ذخیره سازی انعطاف پذیر، مقیاس پذیر از داده های بدون ساختار یا نیمه ساختار یافته طراحی شده اند. برخلاف پایگاه‌های داده SQL، پایگاه‌های داده NoSQL برخی از محدودیت‌های سازگاری داده‌ها را برای بهینه‌سازی سرعت، مقیاس‌پذیری و انعطاف‌پذیری توسعه‌دهنده کاهش می‌دهند. آن‌ها از مدل‌های مختلف داده، از جمله key-value، document، wide-column و graph استفاده می‌کنند. به عنوان مثال برای ذخیره‌سازی با key-value (Amazon DynamoDB)، ذخیره‌سازی document (MongoDB) و ذخیره سازی graph (Amazon Neptune). پایگاه داده های NoSQL در سناریوهایی که انعطاف‌پذیری، مقیاس‌پذیری و عملکرد بسیار مهم هستند، استفاده می‌شوند.Serverless Architectureمعماری serverless یک مدل توسعه cloud-native است که به توسعه‌دهندگان اجازه می‌دهد تا بدون پرداختن به مدیریت زیرساخت سرور، تنها بر روی کد تمرکز کنند. در معماری serverless، ارائه‌دهندگان cloud وظایفی مانند ارائه(provisioning)، مقیاس‌بندی و نگهداری را انجام می‌دهند و مقیاس خودکار (automated scaling)را بر اساس تقاضا امکان‌پذیر می‌کنند.دو مدل اصلی serverless عبارتند از Backend-as-a-Service (BaaS)وFunction-as-a-A-Service (FaaS)مانند AWS Lamda و Azure Functions. این معماری برای برنامه‌های stateless مناسب هستند و در سناریو هایی که احتمال افزایش تقاضای غیرقابل پیش‌بینی را می دهیم کاربرد دارند. معماری serverless مدیریت سرور را ساده می کند و به ویژه در ساخت RESTFul API ها، پردازش ناهمزمان، بررسی های امنیتی وCI/CD بسیار مناسب می باشد.Domain Driven Designطراحی دامنه محور (DDD) یک رویکرد توسعه نرم افزار است که توسط Eric Evans معرفی شده که بر ایجاد درک مشترک از فضای مسئله (دامنه) بین ذینفعان فنی و غیر فنی تاکید دارد. در DDD، یک مفهوم کلیدی، زبان فراگیر(Ubiquitous) است که استفاده از واژگان مشترک توسعه دهندگان و متخصصان domain را ترویج می کند. موجودیت ها و value object ها اجزای اساسی در DDD هستند. موجودیت ها هویت مختلف دارند، در حالی که object valueها با ویژگی هایشان تعریف می شوند. این مفاهیم به مدل سازی دقیق domain کمک می کند. Service ها در DDD منطق تجاری را در بر می گیرد که به طور طبیعی در محدوده موجودیت ها یا object value ها قرار نمی گیرد. آنها عملیات یا فعالیت هایی را نشان می دهند که بر روی عناصر domain عمل می کنند. DDD به ویژه برای پروژه های پیچیده و در مقیاس بزرگ که درک عمیق از حوزه کسب و کار برای موفقیت بسیار مهم است مفید است.Hexagonal architectureمعماری Hexagonal (شش ضلعی) که به عنوان Ports and Adaptors شناخته می شود، یک الگوی طراحی است که با معرفی یک شکل شش ضلعی برای نمایش بصری Port های مختلف (نقاط ورودی) و Adaptor ها (اجرای) یک برنامه، به چالش های معماری layered می پردازد. هدف این الگو جدا کردن منطق اصلی کسب و کار در مرکز شش ضلعی است. اصل وارونگی وابستگی (Dependency Inversion) در معماری شش ضلعی مورد توجه است و بر وارونگی وابستگی بین آداپتورهای driving و آداپتورهای driven تأکید دارد. این وارونگی امکان انعطاف پذیری و تست آسان را فراهم می کند و به پایداری و گسترش طولانی مدت برنامه کمک می کند.از مزایای معماری شش ضلعی جداسازی کامل منطق برنامه و انعطاف پذیری در طراحی رابط ها است. این به خوبی با طراحی Domain-Driven مطابقت دارد و از خراب کاری در منطق domain جلوگیری می کند.Message Queueصف کردن Message ها شکلی از ارتباط ناهمزمان است که به برنامه‌ها اجازه می‌دهد از طریق صف ارتباط برقرار کنند و به فرستنده کمک می کند تا بدون وقفه کار کند، به‌ویژه زمانی که سرویس مقصد مشغول یا قطع است. در Message Queue، یک صف نقش ذخیره کننده موقت بین فرستنده و گیرنده عمل می کند و پیام ها را تا زمانی که مصرف کننده آنها را پردازش کند نگه می دارد و پردازش ناهمزمان را تسهیل می کند. یک Message، معمولاً یک byte array با header، داده‌ای است که بین فرستنده و گیرنده منتقل می‌شود و وظایف یا رویدادها را نشان می‌دهد. صف کردن Message از قطع و خرابی سرویس محافظت می کند و به قابلیت اطمینان سیستم کمک می کند. در معماری میکروسرویس، صف پیام برای تسهیل ارتباط بین سرویس‌ها بسیار مهم است و به آن‌ها اجازه می‌دهد پیام‌ها را به‌صورت ناهمزمان به صف هدایت کنند و از تحویل به مقصد صحیح اطمینان حاصل کنند. صف‌های پیام مانند Kafka، Amazon SQS و RabbitMQ نقشی محوری در معماری‌های ابری مدرن دارند و بافری سبک برای ارتباطات ناهمزمان و افزایش قابلیت اطمینان، مقیاس‌پذیری و انعطاف‌پذیری سیستم ارائه می‌کنند.Container orchestrationمجتمع سازی کانتینر ها(Container orchestration) در واقع مدیریت خودکار workload های کانتینری است که به وظایفی مانند provisioning، deployment، مقیاس‌بندی، networking و load balancing رسیدگی می‌کند. نیاز به container orchestration از پیچیدگی عملیاتی ناشی از مدیریت container ها به ویژه در سیستم‌های مقیاس بزرگ با میکروسرویس‌های متعدد ناشی می‌شود. Kubernetes یک پلتفرم open source محبوب در این زمینه است که قابلیت های گسترده و رویکردی اعلامی برای automation ارائه می دهد. مجتمع سازی کانتینر ها با Docker، که پلتفرمی برای ساخت کانتینرها است متفاوت است. ابزارهای مجتمع سازی کانتینر، مانند Kubernetes، Docker Swarm و Apache Mesos چارچوب‌هایی را برای مدیریت کانتینرها و میکروسرویس‌ها فراهم می‌کنند.Static Code Analysisتجزیه و تحلیل کد static یک روش خودکار برای تجزیه و تحلیل کد منبع برای نقص و مشکلات کیفیت بدون اجرای کد است. مزایای زیادی مانند تشخیص زودهنگام باگ و بهبود کیفیت کد را ارائه می دهد. ابزارهای محبوب مانند SonarLint با IDE ها ادغام می شوند تا تجزیه و تحلیل real-time را فعال کنند. به طور کلی، تجزیه و تحلیل static به خوبی با روش‌های DevOps مدرن از طریق بازخورد اولیه(early feedback) و پیشگیری از نقص (defect prevention)هماهنگ است. هنگامی که به طور مناسب از آن استفاده می شود، ابزار ارزشمندی برای تولید نرم افزار است. SonarLintیک ابزار تجزیه و تحلیل کد استاتیک محبوب است که به دلیل ادغام با IDE های محبوب مانندIntelliJ IDEA، Eclipse، Visual Studio و Visual Studio Code شناخته شده است. SonarLint با پشتیبانی از چندین زبان برنامه نویسی مانند جاوا، سی شارپ، جاوا اسکریپت و پایتون، بازخورد real-time را ارائه می دهد، مشکلات کدنویسی را مشخص می کند و هنگام نوشتن کد، پیشرفت هایی را پیشنهاد می کند.