توضیح چند موضوع معماری نرم‌افزار

معرفی Modular Monolithic:به طور کلی ما سه دسته الگوی monolithic داریم۱.الگوی single monolithic که الگوی متداول و معمولی هست که برنامه نویسان در ابتدای شروع کار خود معمولا بدون اینکه بدانند از این الگو استفاده می‌کنند. به طور کلی به این صورت است که شما تمام پروژه را در داخل یک فولدر نگهداری می‌کنید و بخش‌های پروژه به یک دیگر وابسته هستند و اگر بخشی تغییر کند بقیه بخش‌ها هم ممکن است تغییر کند.۲.الگوی modular monolithic یا همون ماژولار مونولوتیک: این الگو مانند الگوی قبل است ولی با این تفاوت که هر بخش به صورت ماژولار توسعه داده می‌شود و حتی می‌توانیم تیم‌های متفاوتی را مسئول انجام هر ماژول قرار بدهیم.توسعه پروژه در این رویکرد راحت‌تر از رویکرد قبلی است و همچنین هر ماژول را می‌توانیم در پروژه‌های دیگه نیز استفاده کنیم و به نوعی این رویکرد یک رویکردی بین single monolithic و micro service هست. یکی از کاربردهای این الگو این می‌باشد که شما در زمان توسعه اولیه یک نرم‌افزار می‌توانید از این الگو استفاده کنید و بعد از اینکه به نسخه اولیه رسیدید و لازم شد پروژه خود را scale کنید می‌توانید از این الگو به الگوی micro service مهاجرت کنید.۳.الگوی layeres monolithic یا همون مونولوتیک لایه بندی شده:در این رویکرد مانند قسمت قبل است فقط با این تفاوت که رویکرد لایه‌ای به معماری نرم‌افزار خواهیم داشت. به عنوان مثال معماری MVC یک معماری است بر پایه Model-view-controler که در طراحی نرم‌افزارهای وب و اپلیکیشن‌ها استفاده می‌شود.معرفی AWSکلمه AWS که مخفف Amazon Web Services است یک سرویس ابری امن است که خدماتی مثل قدرت محاسبه،ذخیره سازی پایگاه داده،تحویل محتوا و سایر قابلیت هایی که به رشد کسب و کار شما میکند ارائه میدهد. این سرویس بر اساس قراردادی که شما با آن دارید می‌تواند مواردی مانند امنیت و افزایش منابع در زمان پیک درخواست ها را برای شما فراهم کند.به کمک این سرویس شما دیگر لازم نیست که تمرکز خود را بر روی زیرساخت و خنک سازی سرورهای خود قرار دهید تمام این موارد را سرویس ابری انجام می‌دهد و شما تمرکز خود را بر روی نرم‌افزار خود قرار می‌دهید.معرفی API-first Approachدر این رویکرد توسعه نرم‌افزار تلاش بر این است که API های بین سرویس‌ها را در ابتدا پیاده‌سازی کند. مزیت این رویکرد این است که هر تیمی بعد از این فاز دیگر می‌تواند به معماری داخلی سرویس‌های خود تمرکز کند و ارتباط بین تیمی کمتر می‌شود و همچنین تاثیری غیر مستقیم بر طراحی ساختار کلی نرم‌افزار نیز دارد زیرا وقتی که یک سرویس می‌داند که چه خروجی هایی یا ورودی‌هایی دریافت می‌کند طراحی بهتری نسبت به دیتابیس و فرایندهای داخلی خود خواهد داشت. بر اساس گزارش وضعیت API 2022 Postman که بیش از 37000 متخصص API را مورد بررسی قرار داد، در واقع، 58 درصد از APIهایی که توسعه دهندگان با آنها کار می کنند، فقط برای استفاده داخلی هستند. و این نشان می‌دهد که این رویکرد فقط برای ارتباط با مشتریان نیست بلکه برای ارتباط بین ماژول‌های داخلی یک نرم‌افزار نیز استفاده می شود.معرفی NoSQL Databasesیک رویکرد در طراحی دیتابیس می‌باشد که برای ساختار دیتاهایی که از نظم خاصی پیروی نمی‌کنند استفاده می‌شود در پروژه‌های تحلیل لاگ سیستم و یا big-data استفاده می‌شود. خود این رویکرد به چندین دسته تقسیم می شود که شامل document، key-value، wide-column و graph می‌شوند. به عنوان مثال، پایگاه داده‌های document-based، از ساختارهای JSON یا XML برای ذخیره داده استفاده می‌کنند.برخی از مزایای آن شامل امکان ذخیره و بازیابی داده‌های نامنظم و بزرگ، قابلیت مقیاس‌پذیری بیشتر نسبت به پایگاه‌های داده رابطه‌ای، قابلیت ذخیره سازی انواع مختلف داده‌ها، سهولت در استفاده و انعطاف‌پذیری آن است.اما برخی از معایب آن شامل کمتر بودن امکانات پشتیبانی، کمتر بودن امکانات پرس‌وجو، عدم پشتیبانی از تراکنش‌های چندگانه و پایداری پایین‌تر آن نسبت به پایگاه‌های داده رابطه‌ای است.معرفی Serverless Architecture:این معماری بر این معنی نیست که نرم‌افزار شما اصلا نیازی به ارتباط با اینترنت نداشته باشد بلکه منظور بر این است که شما سرور فیزیکی و تنظیم کردن آن را نیاز نداشته باشید بلکه تمرکز خود را بر روی کسب و کار خود قرار بدهید. این رویکرد هزینه‌های عملیاتی را کاهش می‌دهد زیرا نیرویی که سرور را مدیریت بکند لازم ندارید و سرویس ابری عملیات‌هایی مانند مدیریت منابع و امنیت را برای شما ایجاد می‌کند. همچنین هزینه‌ها عملیاتی کمتر می‌شود زیرا بر اساس نیاز و مصرفی که دارید به سرویس دهنده ابری پول می‌دهید. البته این معماری مشکلاتی نیز دارد زیرا زمانی که شما از این سرویس‌ها استفاده می‌کنید باید مراقب قوانین داخلی ابر‌ها باشید به عنوان مثال فرض کنید شما یک port برای ارتباط خود با سرور نیاز دارید ولی سرویس‌دهنده ابری ممکن است بگوید در سیاست‌های کلی ما نیست که این port را به شما بدهد.معرفی Domain Driven Design:در این رویکرد تلاش بر این است که توسعه دهندگان با متخصصین دامنه کسب وکار آشنا بشوند و از متخصصین کلمات کلیدی حوزه کسب وکار را همراه با مفهوم عملی آن دریافت کنند و در کد نویسی خود نام کلاس‌ها و توابع را بر اساس دامنه حوزه کسب وکار بنویسند این رویکرد برای تمامی پروژه‌ها خوب نیست زیرا هزینه توسعه نرم‌افزار را افزایش می‌دهد(چون شما باید یک دانش اولیه از کسب و کار خود را به برنامه نویسان خود بدهید).به طور خلاصه، مزایای DDD عبارتند از:ارتباطات بهتر بین توسعه‌دهندگان و متخصصان دامنهانعطاف‌پذیری بیشتر در برابر تغییراتقابلیت نگهداری بیشترمعایب DDD عبارتند از:منحنی یادگیری بالازمان و تلاش بیشتر برای پیاده‌سازینمی‌توان برای هر پروژه از DDD استفاده کرد.معرفی Hexagonal architectureبه طور کلی این رویکرد تلاش بر این دارد برنامه را به ماژول‌هایی تقسیم بندی بکند که هر جفت این ماژول ها کمترین سطح ارتباطی را با یکدیگر داشته باشند همچنین باید قابلیت تعویض هر بخش وجود داشته باشد (بدون تغییر بخش دیگر)این رویکرد.به عبارت دیگر، Hexagonal architecture یک الگوی معماری لایه‌ای است که برای جداسازی لایه‌های مختلف برنامه‌ای به کار می‌رود. در این الگوی معماری، هر لایه به صورت مجزا پیاده‌سازی می‌شود و با استفاده از پورت‌ها و آداپتورها به لایه‌های دیگر متصل می‌شود.به عنوان مزیت‌های Hexagonal architecture می‌توان به موارد زیر اشاره کرد:جداسازی لایه‌های مختلف برنامه‌ایافزایش قابلیت تستافزایش قابلیت تغییرافزایش قابلیت توسعهبه عنوان معایب این الگوی معماری می‌توان به موارد زیر اشاره کرد:پیچیدگی بیشتر در پیاده‌سازیافزایش تعداد کدهای تکراری زیرا هر لایه به صورت مستقل ممکن است یک عملکرد را تکرار کندمعرفی Event Sourcingدر این الگو، هدف بر این است که تمام رویدادهایی که در سیستم اتفاق می‌افتد به همراه زمان وقوع در یک دیتابیس ذخیره‌سازی شود این باعث می‌شود مسیر حرکت کاربران و اتفاقاتی که برای سیستم اتفاق می‌افتد ضبط شود و در صورت نیاز یک اتفاقی بازگردانی شود و به حالت قبل خود برگردد. این رویکرد مزایا و معایبی به شرح زیر دارد:مزایایی همچون:افزایش قابلیت اطمینانافزایش قابلیت تغییرپذیریافزایش قابلیت پیش‌بینیافزایش قابلیت بازیابی داردو معایبی مانند:این الگو، برای پیاده‌سازی نیاز به تغییر در روش‌های طراحی و پیاده‌سازی دارد.به دلیل اینکه تمامی رویدادها در پایگاه داده ذخیره می‌شوند، نیاز به پایگاه داده‌های بزرگ و پرقدرت است.هزینه نگهداری دیتابیس و ذخیره سازی آن به مرور زمان به صورت نمایی افزایش پیدا می‌کندهمچنین، برای پیاده‌سازی این الگو، نیاز به تغییر در روش‌های طراحی و پیاده‌سازی داردمعرفی Low code platformsکلمه Low-Code یا کد کم، یک روش توسعه نرم‌افزار است که در آن از ابزارها و ماژول‌های پیش‌ساخته برای انجام عملیات‌های مورد نیاز استفاده می‌شود. این روش، به کاربران اجازه می‌دهد تا بدون نیاز به دانش برنامه‌نویسی، برنامه‌های کاربردی خود را طراحی و پیاده‌سازی کنند. این روش، سرعت توسعه نرم‌افزار را به شدت افزایش می‌دهد و هزینه‌های توسعه را کاهش می‌دهد. همچنین، این روش، به کاربران اجازه می‌دهد تا بدون نیاز به دانش برنامه‌نویسی، برنامه‌های کاربردی خود را طراحی و پیاده‌سازی کنند. این روش، سرعت توسعه نرم‌افزار را به شدت افزایش می‌دهد و هزینه‌های توسعه را کاهش می‌دهد. از دیگر مزایای این روش می‌توان به افزایش قابلیت تغییرپذیری و افزایش سرعت توسعه نرم‌افزار اشاره کرد. با این حال، این روش نیز دارای معایبی است. به عنوان مثال، این روش، برای پیاده‌سازی، نیاز به تغییر در روش‌های طراحی و پیاده‌سازی دارد.همچنین این روش می‌تواند مشکلاتی را به همراه خود داشته باشد به عنوان مثال اگر ابزاری که استفاده کردید باگی داشته باشد یا حفره امنیتی داشته باشد نرم افزار شما هم دچار مشکل می‌شود همچنین اگر ماژول‌ها از نظر استفاده منابع به تضاد بخورند شما مجبور هستید که یکی از ماژول‌ها را از نرم افزار خود جدا کنید. همچنین این رویکرد ممکن است بر معماری کلی نرم‌افزار شما تاثیر منفی بگذارد و شما را محدود بکند به پیاده‌سازی معماری خاصی.معرفی Business Process Management Systems (BPMS)به کمک این دسته از ابزارها شما می‌توانید بدون داشتن دانش برنامه نویسی به تجزیه و تحلیل کسب وکار خود و پیاده‌سازی و نظارت بر فرایندهای کسب و کار خود بپردازید.این مجموعه برنامه، نقاط ضعفی که باعث از بین رفتن زمان و سرمایه می‌شود را درکسب و کارها شناسایی می‌کند و به کنترل آن‌ها کمک می‌کند تا کارآمدی کارکنان شرکت را افزایش دهد.این روش، سرعت توسعه نرم‌افزار را به شدت افزایش می‌دهد و هزینه‌های توسعه را کاهش می‌دهد. البته این رویکرد مشکلاتی را نیز دارد به عنوان مثال شما بسیار وابسته به کد ابزار می‌شوید و اگر زمانی ابزار شما آپدیت ورژن جدید ندهد تمام سرمایه گذاری شما از بین خواهد رفت. همچنین در کتاب clean architecture این موضوع بسیار نفی شده است زیرا وابستگی شدیدی برای کسب و کار شما ایجاد می‌کند.معرفی Message Queue (such as Kafka and RabbitMQ)یک ابزاری است برای مدیریت load سیستم و توضیع پیام‌های سیستم شما فرض کنید که چندین ابزار برای مدیریت دیتا دارید که هر ابزار مسئولیت اجرا و نمایش یکسری از ویژگی‌های سیستم شما است به کمک این صف شما می‌توانید تمام این ابزارها و برنامه ها را به یکدیگر متصل کنید. در این سیستم پیام‌ها به صورت یک صف قرار می‌گیرند و برنامه‌های مختلف می‌تواند پیام‌های مورد نظر خود را انتخاب کنند و بردارند.این سیستم، مزایایی همچون افزایش قابلیت توسعه، افزایش قابلیت پیش‌بینی، افزایش قابلیت بازیابی و افزایش قابلیت تغییرپذیری دارد.دو سیستم Message Queue محبوب که در حال حاضر استفاده می‌شوند، Apache Kafka و RabbitMQ هستند.به عنوان مثال، Kafka برای پردازش داده‌های بزرگ و پیام‌های بسیار زیاد مناسب است، در حالی که RabbitMQ برای پردازش پیام‌های کوچک و بسیار زیاد مناسب است.معرفی Container orchestration (such as Kubernetes)یکی از ابزارهای مهم برای مدیریت و اجرای container ها kubernetes است. شما می‌توانید هر مدل contain را با هرگونه شرط و قیدی که نیاز دارید در kubernetes پیاده سازی کنید.Kubernetes یک پلتفرم متن باز و آماده تولید است که با تجربه انباشته Google در ارکستراسیون کانتینر طراحی شده است و با بهترین ایده های جامعه ترکیب شده است. به کمک این ابزار شما فقط مانند docker یک container را بالا نمی‌آورید بلکه توانایی مدیریت و ساخت mirror هم دارید. در نتیجه به راحتی می‌توانید performance نرم افزار خود را افزایش بدهید.مزایا این ابزار به شرح زیر است:مدیریت و کنترل برنامه‌های کانتینری در مقیاس بزرگافزایش قابلیت اطمینان و پایداری برنامه‌های کانتینریافزایش سرعت و کارایی در اجرای برنامه‌های کانتینریمعایب این ابزار به شرح زیر است:پیچیدگی بالای این ابزارنیاز به تجربه و دانش کافی برای استفاده از این ابزارنیاز به سرورهای قدرتمند برای اجرای Kubernetesمعرفی Log Management Tools (such as ELK):برای مدیریت لاگ‌ها ابزارهای مدیریت لاگ مانند ELK Stack بسیار مفید هستند. ELK Stack شامل سه پروژه متن‌باز Elasticsearch، Logstash و Kibana است. Elasticsearch یک موتور جستجوی متن و تحلیلی است.Logstash یک مجمع لاگ است که داده‌ها را از منابع مختلف جمع‌آوری، پردازش و به مقاصد مختلفی مانند Elasticsearch ارسال می‌کند. و در نهایت، Kibana یک رابط کاربری فراهم می‌کند که انواع نمودار‌ها و نمایشگرها را در دل خود دارد، که به کاربران اجازه می‌دهد داده‌های خود را از طریق نمودارها مشاهده، پرس و جو و تجزیه و تحلیل کنند. این ابزارها به کاربران اجازه می‌دهند تا میزان بزرگی از داده‌های لاگ را از هر جایی در زیرساخت خود جمع‌آوری کنند، سپس در آنها را جستجو، تجزیه و تحلیل کنند و آنها را به نمایش بگذارند.مزایای استفاده از این ابزار:قابلیت جمع‌آوری داده‌های لاگ از منابع مختلف.قابلیت جستجوی داده‌های لاگ در زمان واقعی.قابلیت تجزیه و تحلیل داده‌های لاگ با استفاده از الگوهای پیش‌فرض یا سفارشی.قابلیت نمایش داده‌های لاگ در قالب نمودارها و نمودارها.قابلیت ارسال داده‌های لاگ به مقاصد مختلفی مانند Elasticsearch.قابلیت افزایش قابلیت اطمینان و امنیت با استفاده از Beats.معایب استفاده از این ابزار:نیاز به تنظیمات پیکربندی پیچیده.نیاز به تجربه کاربری برای استفاده از این ابزارها.نیاز به سرورهای قدرتمند برای پردازش داده‌های لاگ.هزینه‌های بالای پشتیبانی و نگهداری.معرفی Monitoring tools (such as Prometheus): برای مانیتورینگ سیستم‌ها، ابزارهای مانیتورینگ مانند Prometheus بسیار مفید هستند. Prometheus یک ابزار مانیتورینگ و هشدار دهی منبع باز است که ابتدا در SoundCloud ساخته شد. این ابزار متن‌باز، مجموعه‌ای از ابزارهای مانیتورینگ و هشدار دهی است که برای جمع‌آوری داده‌های متن‌باز و مانیتورینگ سیستم‌های مختلف استفاده می‌شود. Prometheus از زبان Go برای پیاده‌سازی خود استفاده کرده است.این ابزار از مدل جمع‌آوری داده‌های pull برای جمع‌آوری داده‌های متریک استفاده می‌کند و داده‌های متریک را به صورت سری زمانی ذخیره می‌کند. Prometheus از زبان PromQL برای پرس و جوی داده‌های متریک استفاده می‌کند. در تصویر زیر نمایی از یک معماری آمده استمزایا:قابلیت جمع‌آوری داده‌های متریک از منابع مختلف.قابلیت جستجوی داده‌های متریک در زمان واقعی.قابلیت تجزیه و تحلیل داده‌های متریک با استفاده از الگوهای پیش‌فرض یا سفارشی.قابلیت نمایش داده‌های متریک در قالب نمودارها و نمودارها.قابلیت ارسال داده‌های متریک به مقاصد مختلفی مانند Elasticsearch.قابلیت افزایش قابلیت اطمینان و امنیت با استفاده از Beats.معایب:نیاز به تنظیمات پیکربندی پیچیده.نیاز به تجربه کاربری برای استفاده از این ابزارها.نیاز به سرورهای قدرتمند برای پردازش داده‌های متریک.هزینه‌های بالای پشتیبانی و نگهداری.معرفی Static Code Analysis (such as SonarQube)تحلیل کد استاتیک یا Static Code Analysis برای تشخیص آسیب‌پذیری‌های احتمالی در کد، ابزارهای Static Code Analysis مانند SonarQube می‌توانند به شما کمک کنند. این ابزارها با استفاده از الگوریتم‌های خود، کد شما را بررسی کرده و به شما اطلاعاتی درباره‌ی مشکلات و آسیب‌پذیری‌های موجود در کد شما ارائه می‌دهند. با استفاده از این ابزارها، می‌توانید به راحتی مشکلات و آسیب‌پذیری‌های موجود در کد خود را شناسایی کرده و آن‌ها را برطرف کنید.مزایایی همچون شناسایی مشکلات و آسیب‌پذیری‌های موجود در کد، افزایش کیفیت کد، افزایش سرعت توسعه و کاهش هزینه‌های توسعه را به همراه دارد. همچنین، با استفاده از این ابزارها، می‌توانید به راحتی مشکلات و آسیب‌پذیری‌های موجود در کد خود را شناسایی کرده و آن‌ها را برطرف کنید.از معایب استفاده از این ابزارها می‌توان به این نکته اشاره کرد که این ابزارها نمی‌توانند به صورت کامل به جای انسان، کد شما را بررسی کنند. همچنین، استفاده از این ابزارها ممکن است به دلیل تعداد زیاد پیام‌های خطا، باعث ایجاد اشکال در فرآیند توسعه شود.