توضیحات بیسیک درباره موضوعات مهم (معماری نرم افزار)

Modular Monolithicمعماری یکپارچه یک مدل سنتی از یک برنامه نرم افزاری است که به عنوان یک واحد واحد ساخته شده است که مستقل و مستقل از سایر برنامه ها است. کلمه "مونولیت" اغلب به چیزی بزرگ و یک تکه نسبت داده می شود که از حقیقت معماری یکپارچه برای طراحی نرم افزار دور نیست. معماری یکپارچه یک شبکه محاسباتی بزرگ و منفرد با یک پایه کد است که همه دغدغه‌های تجاری را با هم پیوند می‌دهد. برای ایجاد تغییر در این نوع برنامه، نیاز به به روز رسانی کل پشته با دسترسی به پایه کد و ساخت و استقرار یک نسخه به روز شده از رابط سمت سرویس است. این امر به روز رسانی را محدود و زمان بر می کند. Monolithic ها می توانند در اوایل ساخت پروژه برای سهولت مدیریت کد، سربار شناختی و استقرار راحت باشند.همچنین اجازه می دهد تا همه چیز در یک کل واحد به یکباره ریلیز شود.https://www.atlassian.com/microservices/microservices-architectureAWSسرویس وب آمازون یک پلتفرم جامع و در حال تحول رایانش ابری است که توسط آمازون ارائه شده است که شامل ترکیبی از زیرساخت به عنوان یک سرویس (IaaS)، پلت فرم به عنوان یک سرویس (PaaS) و نرم افزار بسته بندی شده به عنوان ارائه خدمات (SaaS). سرویس‌های AWS می‌توانند ابزارهایی مانند توان محاسباتی، ذخیره‌سازی پایگاه داده و خدمات تحویل محتوا را به سازمان ارائه دهند. خدمات وب Amazon.com اولین خدمات وب خود را در سال 2002 از زیرساخت داخلی که Amazon.com برای مدیریت عملیات خرده فروشی آنلاین خود ساخته بود راه اندازی کرد. در سال 2006، شروع به ارائه خدمات تعریف شده IaaS خود کرد. AWS یکی از اولین شرکت‌هایی بود که یک مدل رایانش ابری پرداخت به‌موقع را معرفی کرد که برای ارائه محاسبات، ذخیره‌سازی یا توان عملیاتی به کاربران در صورت نیاز مقیاس می‌شد. AWS ابزارها و راه حل های مختلفی را برای شرکت ها و توسعه دهندگان نرم افزار ارائه می دهد که می توانند در مراکز داده در بیش از 190 کشور استفاده شوند. گروه هایی مانند سازمان های دولتی، موسسات آموزشی، سازمان های غیرانتفاعی و خصوصی می توانند از خدمات AWS استفاده کنند. چگونه AWS کار می کند AWS به سرویس های مختلفی تقسیم می شود. هر کدام را می توان به روش های مختلف بر اساس نیاز کاربر پیکربندی کرد. کاربران می توانند گزینه های پیکربندی و نقشه های جداگانه سرور را برای یک سرویس AWS ببینند.https://www.techtarget.com/searchaws/definition/Amazon-Web-ServicesAPI-first Approachرویکرد API-first که رویکردی ست که در آن API ها را در ابتدای فرآیند توسعه نرم افزار اولویت بندی می کنند و API ها را به عنوان بلوک های سازنده نرم افزار قرار می دهد. سازمان‌های API-first قبل از نوشتن کدهای دیگر، API را توسعه می‌دهند، به‌جای اینکه آنها را به‌عنوان افکار بعدی در نظر بگیرند. این به تیم‌ها اجازه می‌دهد برنامه‌هایی را با سرویس‌های داخلی و خارجی بسازند که از طریق API ارائه می‌شوند. شرکت API-first سازمانی است که مدل توسعه API-first را اتخاذ کرده است. API-first چگونه کار می کند؟ برای اینکه یک سازمان یک مدل توسعه API-first را اتخاذ کند، باید API ها را اولویت بندی کند، نقش API های عمومی، خصوصی و شریک در سازمان ها را بشناسد و چرخه عمر API و ابزار مورد نیاز برای تبدیل شدن به API-اول را درک کند.https://www.postman.com/api-firsNoSQL Databasesپایگاه داده NoSQL (غیر SQL) یا پایگاه داده بدون رابطه، یک نوع پایگاه داده است که برای ذخیره و بازیابی داده‌ها استفاده می‌شود و از مدل غیر رابطه‌ای برای سازماندهی داده‌ها استفاده می‌کند. در مقابل، پایگاه داده‌های رابطه‌ای از روش مبتنی بر جداول و رابطه‌های میان جداول برای سازماندهی داده‌ها استفاده می‌کنند.در پایگاه داده NoSQL، داده‌ها به صورت سند‌ها، ستون‌ها، کلید-مقدار یا گراف‌ها ذخیره می‌شوند. هر سند معمولاً به صورت JSON یا BSON نمایش داده می‌شود که اجازه می‌دهد ساختار برای داده‌ها تعریف شود. در این نوع پایگاه داده، به جای استفاده از جداول و رابطه‌ها، از ساختارهایی مانند کلید-مقدار، نمایش‌های داده‌ها و ساختارهای برنامه‌نویسی استفاده می‌شود.پایگاه داده NoSQL برای کاربردهایی که نیاز به مقیاس‌پذیری بالا، عملکرد سریع، انعطاف‌پذیری در ساختار داده‌ها و قابلیت توسعه آسان دارند، مناسب است. برخی از موارد استفاده از پایگاه داده NoSQL عبارتند از: ذخیره و بازیابی داده‌های حجیم، ذخیره سازی و تجزیه و تحلیل داده‌های نیمه ساخت یا غیر ساخت یا داده‌های غیر ساخت یا نیمه ساخت، انتخابات و رای‌گیری آنلاین، ذخیره و بازیابی داده‌های گرافی، وب‌سایت‌ها و برنامه‌هایی که نیاز به انعطاف‌پذیری بالا در ساختار داده دارند.برخی از نمونه‌های معروف پایگاه داده NoSQL عبارتند از MongoDB، Cassandra، Redis، Couchbase و Neo4j. هر یک از این پایگاه‌های داده دارای ویژگی‌ها و قابلیت‌های منحصر به فرد خود هستند و ممکن است بر اساس نیازهای خاص پروژه، انتخاب شوند.Serverless Architectureمعماری بدون سرور (Serverless Architecture) یا همچنین به عنوان معماری فاقد سرور یا معماری تابع‌محور (Function-as-a-Service) شناخته می‌شود. در این معماری، توسعه‌دهندگان برنامه‌ها فقط به نوشتن کدهای منطقی و تابع‌ها تمرکز می‌کنند و نیازی به مدیریت زیرساخت سروری، پیکربندی سرورها و مقیاس‌پذیری آنها ندارند. به جای آن، ارائه‌دهنده خدمات ابری (مانند امازون وب سرویس‌ها، مایکروسافت آزور و گوگل کلود پلتفرم) مسئول مدیریت زیرساخت سروری است و تابع‌ها را به صورت رویدادها فراخوانی می‌کند.در معماری بدون سرور، تابع‌ها به صورت مجزا و مستقل از یکدیگر و در واکنش به رویدادها (Event-driven) اجرا می‌شوند. هر تابع به عنوان یک واحد عملکردی کوچک، محدود و قابل مقیاس‌پذیری طراحی می‌شود و معمولاً به صورت یک تابع کوتاه و محدودیت‌های زمانی اجرا می‌شود. این تابع‌ها توسط یک سرویس مدیریت شده توسط ارائه‌دهنده ابری فراخوانی و اجرا می‌شوند، و پس از اتمام عملیات، مقیاس‌پذیری و خاموش می‌شوند.Domain Driven Designطراحی دامنه محور (Domain-Driven Design (DDD)) یک رویکرد معماری و روش توسعه نرم‌افزار است که هدف آن هماهنگ کردن سیستم‌های نرم‌افزاری با دامنه کسب و کار است. این روش، مجموعه‌ای از اصول، الگوها و شیوه‌های طراحی برای ساخت سیستم‌های نرم‌افزاری پیچیده را ارائه می‌دهد که متمرکز بر مفاهیم و منطق اصلی کسب و کار است.تمرکز اصلی DDD بر روی درک و مدل‌سازی دامنه مسئله کسب و کار است. این رویکرد بر همکاری بین کارشناسان دامنه و توسعه‌دهندگان تاکید دارد. با استفاده از زبانی مشترک و توافق بر مفاهیم و اصطلاحات دامنه، تیم‌های توسعه قادرند تا سیستم‌های نرم‌افزاری را بر اساس نیازها و توانایی‌های واقعی کسب و کار طراحی و پیاده‌سازی کنند.Hexagonal architectureمعماری هگزاگونال (Hexagonal Architecture) یک الگوی طراحی نرم‌افزار است که بهبود قابل توجهی در جداسازی و مدیریت وابستگی‌ها و ارتباطات بین لایه‌های مختلف سیستم نرم‌افزاری را بهبود می‌بخشد. این الگو بر مفهوم اصلی "دامنه هسته" (Core Domain) تمرکز دارد و سیستم را درون یک لایه مرکزی قرار می‌دهد که به آن "هسته" (Core) یا "دامنه هسته" (Core Domain) می‌گویند.مفهوم اصلی هگزاگونال این است که هسته سیستم (یا دامنه هسته) باید مستقل از جزئیات فنی و جزئیات بیرونی سیستم باشد. به عبارت دیگر، هسته سیستم باید بتواند بدون توجه به رابط‌ها و فناوری‌های خارجی خود را تغییر دهد.معماری هگزاگونال تشریح می‌کند که یک سیستم نرم‌افزاری باید به شکل یک هگزاگون (شش ضلعی) به نظر برسد. در این هگزاگون، هسته سیستم در مرکز قرار می‌گیرد و محاط از طریق لایه‌های مستقیم (Adapters) با عوامل خارجی ارتباط برقرار می‌کند. این لایه‌های مستقیم می‌توانند شامل واسط‌های کاربری (UI Adapters)، واسط‌های دسترسی به داده (Data Access Adapters)، واسط‌های نرم‌افزاری خارجی (External Software Adapters) و ... باشند.مزیت اصلی معماری هگزاگونال در جداسازی هسته سیستم از جزئیات بیرونی آن است. این الگو به توسعه‌دهندگان اجازه می‌دهد تا هسته را براساس منطق و قوانین دامنه بهینه کنند و در عین حال از مشکلاتی مانند تغییرات فنی و وابستگی به تکنولوژی‌های خاص جلوگیری کنند. در صورت نیاز به تغییرات، تنها لایه‌های مستقیم را باید تغییر داد و هسته سیستم به صورت خودکار تغییرات را اعمال می‌کند.Event Sourcingیک الگوی طراحی نرم‌افزار است که برای ذخیره‌سازی و بازیابی وضعیت سیستم بر اساس رویدادها (Events) در طول زمان استفاده می‌شود. در این الگو، هر عملیات یا تغییری که در سیستم رخ می‌دهد به صورت یک رویداد ثبت می‌شود و سیستم بر اساس این رویدادها به حالت فعلی خود می‌رسد.در مدل Event Sourcing، وضعیت فعلی سیستم تنها توسط رویدادهایی که در گذشته رخ داده‌اند، تعیین می‌شود. به عبارت دیگر، به جای ذخیره کردن وضعیت فعلی سیستم، ما می‌توانیم تمام رویدادها را ذخیره کنیم و با اجرای آنها به ترتیب زمانی، وضعیت فعلی سیستم را بازسازی کنیم. این الگو به ما اجازه می‌دهد تا یک تاریخچه کامل از تغییراتی که در سیستم رخ داده‌اند را داشته باشیم و بتوانیم به هر زمان مشخصی در گذشته بازگردیم.با استفاده از Event Sourcing، می‌توانیم عملیاتی مانند ثبت نام، بروزرسانی اطلاعات، حذف و غیره را با استفاده از رویدادها ذخیره کنیم. هر رویداد در واقع یک شیء است که شامل اطلاعاتی در مورد تغییراتی است که در سیستم رخ داده است (برای مثال: رویداد "کاربر ساخته شد" شامل اطلاعات مانند شناسه کاربر، نام، ایمیل و زمان ساخت کاربر است).Low code platformsپلتفرم‌های Low-Code یا Low-Code Platforms، ابزارهای توسعه نرم‌افزار هستند که به توسعه‌دهندگان امکان می‌دهند بدون نیاز به تجربه برنامه‌نویسی عمیق، برنامه‌های کاربردی را سریع‌تر و با کمترین تلاش ایجاد کنند. این پلتفرم‌ها با ارائه یک محیط توسعه گرافیکی و ابزارهای بصری، فرایند توسعه نرم‌افزار را ساده‌تر و قابل فهم‌تر می‌کنند.مزایای استفاده از پلتفرم‌های Low-Code عبارتند از:سرعت توسعه: با استفاده از ابزارها و قالب‌های بصری، توسعه‌دهندگان قادرند به سرعت برنامه‌های کاربردی را ایجاد کنند و زمان توسعه را به شدت کاهش دهند.سهولت استفاده: پلتفرم‌های Low-Code برای توسعه‌دهندگان با سطح مهارت مختلف قابل استفاده هستند. این به معنی این است که حتی افرادی که تجربه برنامه‌نویسی کمی دارند می‌توانند از این پلتفرم‌ها بهره ببرند و برنامه‌های قابل استفاده را ایجاد کنند.کاهش وابستگی به توسعه‌دهندگان: با استفاده از پلتفرم‌های Low-Code، توسعه‌دهندگان می‌توانند به شدت وابستگی به توسعه‌دهندگان خاص را کاهش دهند. این به معنی این است که اگر یک توسعه‌دهنده راهی سازمان را ترک کند، دیگر توسعه‌دهندگان می‌توانند به راحتی پروژه را ادامه دهند.انعطاف‌پذیری: پلتفرم‌های Low-Code انعطاف بالایی دارند و امکان توسعه و تغییر برنامه‌ها را با سرعت بالا به توسعه‌دهندگان می‌دهند. این به معنی این است که در صورت نیاز به اعمال تغییرات در برنامه، آن را بسرعت و با کمترین کدنویسی ممکن انجام داد.اتصال به سیستم‌های موجود: پلتفرم‌های Low-Code قابلیت اتصال به سیستم‌ها و خدمات موجود را دارند. این به معنی این است که می‌توانید به راحتی با سیستم‌های دیگر ارتباط برقرار کنید و از قابلیت‌های آنها بهره ببرید.Business Process Management Systems (BPMS)سیستم‌های مدیریت فرآیند کسب و کار (Business Process Management Systems یا BPMS) ابزارهایی هستند که برای مدیریت و بهینه‌سازی فرآیندهای کسب و کار در یک سازمان استفاده می‌شوند. این سیستم‌ها امکانات متنوعی را برای تعریف، مدیریت، اجرا، نظارت و بهبود فرآیندها فراهم می‌کنند.سیستم BPMS به تیم‌های سازمانی اجازه می‌دهند تا فرآیندهای کسب و کار را به صورت گرافیکی تعریف کنند و قابلیت اتوماسیون اجرای این فرآیندها را فراهم می‌سازند. همچنین، این سیستم‌ها اطلاعاتی درباره عملکرد فرآیندها ارائه می‌دهند که به تصمیم‌گیری بهتر و بهبود مستمر کمک می‌کنند.سیستم BPMS معمولاً شامل ابزارهایی برای تنظیم قوانین، مدیریت و پیگیری وظایف، اتصال به سیستم‌های دیگر و گزارش‌گیری است. این ابزارها به سازمان‌ها کمک می‌کنند تا به صورت کارآمدتر و تصمیم‌گیری بهتری درباره فرآیندهای کسب و کار خود داشته باشند.Message Queue (such as Kafka and RabbitMQ)صف پیام (Message Queue) یک مکانیزم نرم‌افزاری است که برای انتقال و ذخیره پیام‌ها بین اجزای سیستم مورد استفاده قرار می‌گیرد. سیستم‌های صف پیام مانند Apache Kafka و RabbitMQ ابزارهایی هستند که برای پیاده‌سازی این مکانیزم استفاده می‌شوند.صف پیام به عنوان یک لایه میانی بین فرستنده و گیرنده پیام‌ها عمل می‌کند. در این سیستم، فرستنده پیام پیام خود را به یک صف (یا یک تاپیک در Kafka) ارسال می‌کند و سپس گیرنده پیام از همان صف پیام برای دریافت و پردازش پیام استفاده می‌کند. این فرآیند اجازه می‌دهد که فرستنده و گیرنده پیام‌ها به صورت ناهمزمان (Asynchronous) و مستقل از هم عمل کنند.Container orchestration (such as Kubernetes)مدیریت ظرفیت (Container orchestration) یک روش برای مدیریت و اجرای برنامه‌های محاکمه شده درون ظروف (container) مانند Docker است. یکی از ابزارهای معروف برای مدیریت ظرفیت، Kubernetes است.کوبرنتیز (Kubernetes) یک سامانه متن‌باز و قابل مقیاس برای مدیریت و اجرای برنامه‌های محاکمه شده درون ظروف است. با استفاده از Kubernetes، می‌توانید یک مجموعه از ظروف را به عنوان یک واحد سازماندهی و مدیریت کنید. این سیستم مسئولیت‌هایی مانند توزیع بار، مقیاس پذیری خودکار، بررسی و تعمیر خودکار، مدیریت نودها و مانیتورینگ را بر عهده می‌گیرد.با استفاده از Kubernetes، می‌توانید برنامه‌های خود را درون ظروف اجرا کرده و آن‌ها را در یک محیط متناوب و قابل اعتماد مدیریت کنید. این سیستم به شما اجازه می‌دهد تا برنامه‌های خود را بر روی یک مجموعه از سرورها، معمولاً به عنوان یک خوشه (cluster) شناخته می‌شوند، توزیع کنید. این خوشه می‌تواند شامل چندین نود (node) باشد که هرکدام از آن‌ها می‌توانند درون ظروفی که برنامه‌ها را اجرا می‌کنند، قرار گیرند.با استفاده از Kubernetes، می‌توانید برنامه‌های خود را به صورت اتوماتیک مقیاس پذیر کنید. در صورتی که بار کار برنامه افزایش یابد، Kubernetes می‌تواند تعداد ظروف که برنامه را اجرا می‌کنند، به طور خودکار افزایش دهد تا بتواند با ترافیک بیشتر سر و کار داشته باشد. همچنین، در صورت کاهش بار کار، می‌توانید تعداد ظروف را کاهش دهید تا منابع سیستم را بهینه سازی کنید.با استفاده از Kubernetes، می‌توانید نیازمندی‌های خود را توسعه دهید و برنامه‌های خود را به صورت مداوم بروزرسانی کنید بدون اینکه برنامه را متوقف یا از دسترس برای کاربرانتان ببرید. این سیستم به صورت هماهنگی و همزمانی بین برنامه‌های مختلف و نگهداری خوبی از آن‌ها، بروزرسانی‌ها را فراهم می‌کند.همچنین با استفاده از Kubernetes، می‌توانید مانیتورینگ و مدیریت عملکرد برنامه‌های خود را بهبود بخشید. Kubernetes امکاناتی برای نظارت بر عملکرد ظروف و نودها را فراهم می‌کند و اطلاعاتی مانند میزان استفاده از منابع سیستم، ترافیک شبکه، وضعیت سلامتی ظروف و غیره را در اختیار شما قرار می‌دهد. این اطلاعات به شما کمک می‌کنند تا عملکرد برنامه‌ها را بررسی کرده، مشکلات را تشخیص دهید و تصمیم‌گیری‌های مناسب برای بهبود عملکرد بگیرید.Log Management Tools (such as ELK)ابزارهای مدیریت لاگ (Log Management Tools) مجموعه‌ای از ابزارها و سیستم‌ها هستند که برای جمع‌آوری، مدیریت، ذخیره و تجزیه و تحلیل لاگ‌ها (Logs) استفاده می‌شوند. این ابزارها به سازمان‌ها کمک می‌کنند تا لاگ‌های تولید شده توسط سیستم‌ها و برنامه‌های مختلف را به صورت مرتب و قابل جستجو ذخیره و بهبود پیدا کنند.یکی از ابزارهای معروف مدیریت لاگ ELK است که شامل مجموعه‌ای از ابزارها به نام‌های Elasticsearch، Logstash و Kibana است. این مجموعه ابزارها که با هم تعامل می‌کنند، قابلیت‌های مختلفی را در زمینه مدیریت لاگ‌ها فراهم می‌کنند.الستیک سرچ (Elasticsearch) یک موتور جستجو و تحلیل توزیع‌شده است که برای ذخیره و جستجوی سریع و قابل مقیاس لاگ‌ها و سایر داده‌ها استفاده می‌شود. این سیستم مقیاس‌پذیری بالا را ارائه می‌دهد و قابلیت پردازش موازی و جستجوی پیچیده را در داده‌ها فراهم می‌کند.لاگ ستچ (Logstash) یک ابزار تجزیه و تحلیل لاگ است که برای جمع‌آوری، تبدیل و فیلتر کردن لاگ‌ها استفاده می‌شود. این ابزار می‌تواند لاگ‌ها را از منابع مختلفی مانند فایل‌های لاگ، سیستم‌های مختلف مانیتورینگ و سرویس‌های شبکه جمع‌آوری کند و آن‌ها را برای تحلیل و ذخیره در Elasticsearch آماده کند.کیبانا (Kibana) یک رابط کاربری وب برای تجزیه و تحلیل و نمایش داده‌های ذخیره شده در Elasticsearch است. با استفاده از Kibana، کاربران می‌توانند به راحتی نمودارها، نمودارهای متحرک، جداول و داشبوردهای تعاملی را براساس داده‌های لاگ‌ها و سایر داده‌ها ایجاد کنند و به تحلیل و نظارت بر عملکرد سیستم‌ها و برنامه‌ها بپردازند.با استفاده از این ابزارها، سازمان‌ها می‌توانند لاگ‌های سیستم و برنامه‌های خود را به صورت مرکزی جمع‌آوری کرده، آن‌ها را تحلیل کنند و به راحتی درک کنند که در طول زمان چه اتفاقی در سیستم‌ها و برنامه‌ها رخ داده است. همچنین، این ابزارها قابلیت‌های جستجو و فیلتر کردن پیشرفته را فراهم می‌کنند، که به کاربران امکان می‌دهد بر اساس معیارهای مختلف لاگ‌ها را جستجو و تحلیل کنند.Monitoring tools (such as Prometheus)ابزارهای نظارت (Monitoring tools) مجموعه‌ای از ابزارها و سیستم‌ها هستند که برای مانیتورینگ و پایش عملکرد سیستم‌ها، برنامه‌ها و خدمات مورد استفاده قرار می‌گیرند. این ابزارها به سازمان‌ها کمک می‌کنند تا معیارهای مختلفی مانند عملکرد، قابلیت دسترسی، استفاده از منابع و وضعیت سیستم را نظارت کرده و در صورت بروز مشکلات و خطاها، هشدار دهند و اطلاعات لازم را برای تحلیل و رفع مشکل فراهم کنند.یکی از ابزارهای معروف نظارت Prometheus است که به عنوان یک سیستم متن‌باز برای جمع‌آوری و ذخیره سازی داده‌های معیار استفاده می‌شود. نحوه عملکرد Prometheus از طریق معماری Pull می‌باشد، به این صورت که Prometheus به طور مداوم از سرویس‌ها و برنامه‌های هدف درخواست‌های HTTP می‌گیرد و داده‌های معیار آن‌ها را جمع‌آوری می‌کند.Static Code Analysis (such as SonarQube)تجزیه و تحلیل کد استاتیک (Static Code Analysis) یک فرآیند اتوماتیک است که در آن نرم‌افزارها و کدهای برنامه‌نویسی برای شناسایی خطاها، نقاط ضعف امنیتی، عدم رعایت قوانین برنامه‌نویسی و مشکلات عملکردی مورد بررسی قرار می‌گیرند. این فرآیند بر روی کدهای منبع (source code) صورت می‌گیرد و بدون اجرای واقعی برنامه، بررسی‌های مورد نیاز را انجام می‌دهد.یکی از ابزارهای معروف برای تجزیه و تحلیل کد استاتیک، SonarQube است. SonarQube یک ابزار متن‌باز است که برای ارزیابی کیفیت کد و شناسایی مشکلات مختلف در برنامه‌های نرم‌افزاری استفاده می‌شود. این ابزار می‌تواند در پروژه‌های برنامه‌نویسی با زبان‌های مختلف از جمله Java، C، C++، C#، JavaScript و Python استفاده شود.