طاهره شهابی
طاهره شهابی
خواندن ۱۱ دقیقه·۲ ماه پیش

مفاهیم پیرامون معماری نرم افزار

1. Infrastructure as Code (IAC)

در گذشته، راه‌اندازی زیرساخت‌های نرم‌افزاری مثل سرورها، شبکه‌ها و پایگاه‌های داده به‌صورت دستی انجام می‌شد. این کار نه‌تنها زمان‌بر بود، بلکه احتمال خطا هم در آن زیاد بود. اما با معرفی مفهوم «زیرساخت مبتنی بر کد» (IaC)، همه چیز تغییر کرد. IaC به ما این امکان را می‌دهد که با نوشتن فایل‌های متنی (مثلاً با زبان‌هایی مثل JSON)، تمام زیرساخت موردنیاز را تعریف و خودکارسازی کنیم. ابزارهایی مثل Terraform، Ansible و AWS CloudFormation هم این روند را امکان‌پذیر کرده‌اند.

مزیت اصلی IaC این است که زیرساخت، مانند نرم‌افزار، قابل نسخه‌بندی، آزمایش و تکرار است. مثلاً می‌توان با یک فایل مشخص، دقیقاً همان زیرساخت را در محیط تست، تولید و توسعه ساخت. این روش باعث کاهش خطا، افزایش سرعت استقرار و استانداردسازی محیط‌ها می‌شود. در پروژه‌های مدرن ابری، IaC تبدیل به یک مهارت ضروری برای تیم‌های DevOps شده است.

Infrastructure as Code (IAC) روند پیاده سازی
Infrastructure as Code (IAC) روند پیاده سازی


2. API Gateway و Service Mesh

در معماری‌های مدرن به‌خصوص میکروسرویس‌ها، ارتباط بین بخش‌های مختلف سیستم به یک چالش بزرگ تبدیل شده است. برای مدیریت این ارتباطات، دو مفهوم مهم به‌وجود آمده‌اند API Gateway و Service Mesh.

در واقع API Gateway مانند یک دروازه ورودی برای تمام درخواست‌های کاربر به سیستم عمل می‌کند. تمام درخواست‌های ورودی ابتدا به این نقطه می‌رسند و سپس به سرویس مناسب هدایت می‌شوند. API Gateway می‌تواند کارهایی مثل احراز هویت، محدودیت نرخ (rate limiting)، لاگ‌گیری و تبدیل فرمت داده را انجام دهد. ابزارهایی مثل Kong، NGINX و AWS API Gateway مثال‌هایی از این مفهوم هستند.

اما درون سیستم، وقتی سرویس‌ها با یکدیگر ارتباط برقرار می‌کنند، نیاز به مدیریت دقیق‌تری دارند. اینجاست که Service Mesh وارد می‌شود. این معماری یک لایه جداگانه روی شبکه ارتباطی سرویس‌ها اضافه می‌کند تا مواردی مانند ترافیک، رصد، امنیت و تکرار خطا (retry) به‌صورت خودکار مدیریت شود. معروف‌ترین ابزار در این حوزه Istio است که معمولاً همراه با Kubernetes استفاده می‌شود.

پس API Gateway بیشتر روی ورودی‌ها و تعاملات خارجی تمرکز دارد، در حالی که Service Mesh ارتباطات داخلی سرویس‌ها را مدیریت می‌کند.

3. CQRS (Command Query Responsibility Segregation)

در معماری‌های سنتی، معمولاً یک مدل داده و یک مسیر برای خواندن و نوشتن اطلاعات وجود دارد. اما در برخی سیستم‌ها که خواندن و نوشتن رفتارهای متفاوت و پیچیده‌ای دارند، این ساختار ناکارآمد می‌شود. در اینجاست که الگوی CQRS (جداسازی مسئولیت فرمان و پرس‌وجو) مطرح می‌شود.

در CQRS، عملیات نوشتن (Commands) و خواندن (Queries) به‌صورت دو مسیر جداگانه طراحی می‌شوند. این تفکیک باعث می‌شود بتوان برای هر مسیر بهینه‌سازی‌های خاصی انجام داد. مثلاً ممکن است برای نوشتن از یک مدل دامنه پیچیده استفاده شود ولی برای خواندن، داده‌ها به شکل ساده و سریع آماده باشند. این جداسازی در پروژه‌های بزرگ، بهبود مقیاس‌پذیری و کارایی را به همراه دارد.

از مزایای دیگر CQRS، هماهنگی بهتر با الگوی Event Sourcing است. در این مدل، به‌جای ذخیره وضعیت فعلی سیستم، تمام رویدادهایی که باعث تغییر شده‌اند ثبت می‌شوند. CQRS و Event Sourcing با هم می‌توانند سیستمی قابل ردگیری، منعطف و بسیار مقیاس‌پذیر ایجاد کنند. البته CQRS پیچیدگی‌هایی هم دارد، از جمله همگام‌سازی داده‌ها و افزایش سطح دانش موردنیاز تیم توسعه. پس استفاده از آن باید با توجه به نیازهای واقعی پروژه باشد.

4. معماری رویدادمحور (Event-Driven Architecture)

معماری رویدادمحور الگوی طراحی نرم‌افزاری است که در آن رویدادها (Events) محرک فرایندهای سیستم هستند. در این مدل، بخش‌های مختلف نرم‌افزار (یا سرویس‌ها) به‌صورت ناهمگام رویدادها را منتشر و دریافت می‌کنند.یعنی به‌محض وقوع یک «رویداد» (مثلاً ثبت سفارش یا تغییر وضعیت موجودی)، اطلاعات مربوطه بلافاصله به سیستم‌ها یا کاربران نیازمند ارسال می‌شود تا واکنش لازم انجام شود. این رویکرد با استفاده از یک گذرگاه رویدادی (Event Broker) باعث ایجاد اتصال ضعیف (Loose Coupling) بین اجزای نرم‌افزار می‌شود؛ به‌طوری که فرستنده و گیرنده رویداد نیازی به شناخت یکدیگر ندارند. این معماری امکان مقیاس‌پذیری بالا و افزودن ساده سرویس‌های جدید را فراهم می‌کند، زیرا کافی است سرویس جدید در رویدادهای مرتبط مشترک شود و بدون تغییر در سرویس‌های موجود کار کند. اطلاعات مربوط به هر رویداد فوراً به همه اجزا و افراد نیازمند ارسال می‌شود. همچنین با استفاده از Event Broker ها، سرویس‌ها بدون وابستگی مستقیم با هم کار می‌کنند و افزودن سرویس جدید با اشتراک در رویدادهای موجود صورت می‌گیرد و بر سرویس‌های قبلی تأثیری ندارد. موارد کاربرد آن هم هر جایی است که واکنش سریع به تغییرات مهم باشد مثلا بانکداری آنلاین، بازی‌های چندنفره و سیستم‌های IoT

5. معماری بدون سرور (Serverless Architecture)

معماری بدون سرور روشی از طراحی نرم‌افزار است که در آن توسعه‌دهندگان بدون مدیریت مستقیم سرورها، خدمات و برنامه‌ها را ایجاد و اجرا می‌کنند. در این مدل، ارائه‌دهندهٔ فضای ابری (مثل AWS، Google Cloud یا Azure) زیرساخت را خودکاراً در اختیار می‌گذارد؛ یعنی توسعه‌دهنده صرفاً کد خود را می‌نویسد و اجرا می‌کند، و مسئولیت تأمین سرور، مقیاس‌دهی، به‌روزرسانی و امنیت بر عهدهٔ ارائه‌دهنده است. یکی از شکل‌های رایج سرورلس، «تابع به عنوان سرویس» (FaaS) است که در آن کد برنامه به تابع‌های کوچک و رویداد-محور تقسیم می‌شود. هر تابع تنها در زمان وقوع رویداد مرتبط (مثلاً دریافت یک درخواست HTTP یا پیام صف) اجرا شده و پس از اتمام کار، به صورت خودکار متوقف می‌شود. این رویکرد باعث صرفه‌جویی در هزینه (پرداخت بر مبنای میزان استفاده) و افزایش سرعت توسعه می‌شود، زیرا تیم‌ها می‌توانند روی نوشتن منطق کسب‌وکار تمرکز کنند و از مدیریت پیچیدگی‌های زیرساختی رها شوند. همچنین بدون نگرانی از سرور، ارائه‌دهنده ابری کارهای سخت‌افزاری، به‌روزرسانی‌ها و مقیاس‌دهی را مدیریت می‌کند. هر تابع به صورت خودکار روی منابع در حال‌ اجرا یا در صورت نیاز روی سرور جدید اجرا می‌شود تا تعداد درخواست‌ها را پاسخ دهد.

  • اجرای تابعی (FaaS): کد برنامه به مجموعه‌ای از تابع‌های مستقل تقسیم می‌شود که با وقوع رویداد خاصی فعال شده و اجرا می‌گردند.
  • پرداخت به ازای مصرف: هزینه‌ها تنها برای زمانی که توابع در حال اجرا هستند اعمال می‌شود؛ در حالت بیکاری کارمزدی دریافت نمی‌شود.
  • مثال‌ها: AWS Lambda و سرویس‌های مشابه Google Cloud Functions و Azure Functions از معروف‌ترین پلتفرم‌های سرورلس هستند.

6. رویکرد API-اول (API-first Approach)

در رویکرد API-اول، رابط‌های برنامه‌نویسی (API) در صدر طراحی نرم‌افزار قرار می‌گیرند. به عبارت دیگر، توسعه پروژه با تعریف دقیق API آغاز می‌شود و تمامی اجزای دیگر سیستم حول این قرارداد API طراحی و پیاده‌سازی می‌شوند. در این روش ابتدا از روش‌های استانداردی مانند OpenAPI برای ایجاد قرارداد API استفاده می‌شود و تمام تیم‌های توسعه (فرانت‌اند، بک‌اند، موبایل، …) بر اساس آن کار می‌کنند. به عنوان مثال، شرکت‌های پیشرو ابتدا APIها را همراه با ذی‌نفعان کسب‌وکار طراحی می‌کنند و سپس با اطمینان از سازگاری، سرویس‌ها را توسعه می‌دهند. این رویکرد مزایای زیادی دارد: API-اول امکان کار موازی تیم‌ها را فراهم می‌کند، چون قرارداد مشخص است؛ باعث هماهنگی در تجربه کاربری روی پلتفرم‌های مختلف می‌شود؛ و با تاکید بر کیفیت و یکپارچگی API، استفاده و نگهداری از سیستم را ساده‌تر می‌کند. طراحی API با زبان توصیف مشخص (مانند OpenAPI) قبل از نوشتن کد صورت می‌گیرد. پس از مشخص‌شدن API، تیم‌های مختلف به طور مستقل روی سرویس‌ها و کلاینت‌ها کار می‌کنند. یک API مشترک می‌تواند توسط اپلیکیشن‌های موبایل، وب، دسکتاپ یا دستگاه‌های دیگر استفاده شود، بدون اینکه نیاز به توسعه مجزا برای هر پلتفرم باشد. API-اول سازگار با سبک میکروسرویس است و اضافه کردن سرویس جدید یا تغییر در API را آسان می‌سازد. همچنین تمرکز بر کیفیت API باعث می‌شود توسعه‌دهندگان و سرویس‌های خارجی راحت‌تر بتوانند از API استفاده کنند.

7.طراحی مبتنی بر دامنه (Domain-Driven Design – DDD)

طراحی مبتنی بر دامنه یک رویکرد توسعه نرم‌افزار است که توجه اصلی آن بر «دامنه» (زمینه) کسب‌وکار و مدل‌سازی آن قرار دارد. به عبارت دیگر، در DDD ابتدا به‌خوبی حوزه و فرآیندهای کسب‌وکار شناخته شده و مفاهیم اصلی آن (مانند موجودیت‌ها و قوانین تجاری) مدل می‌شوند، سپس نرم‌افزار بر اساس این مدل طراحی می‌شود. نکتهٔ کلیدی در DDD استفاده از زبان مشترک (Ubiquitous Language) بین توسعه‌دهندگان و کارشناسان کسب‌وکار است؛ به‌گونه‌ای که مفاهیم دامنه با همان واژه‌ها در مستندات و کد نرم‌افزار ظاهر شوند. این کار هماهنگی بیشتری بین نیازهای کسب‌وکار و پیاده‌سازی فنی ایجاد می‌کند و پیچیدگی حوزه‌های بزرگ را کنترل می‌کند. همچنین در این روش دامنهٔ کلی به بخش‌های کوچکتر (Bounded Context) تقسیم می‌شود تا هر بخش مدل مستقل خود را داشته باشد. در مجموع، DDD کمک می‌کند که نرم‌افزار منعکس‌کنندهٔ دقیق منطق کسب‌وکار باشد و تغییرات حوزه به‌خوبی در آن منعکس شود.تمرکز اصلی، مدل‌سازی دقیق مفاهیم و قوانین حوزه‌ی اصلی کسب‌وکار برای درک بهتر سیستم.

  • زبان مشترک دامنه: استفاده از واژگان یکسان توسط توسعه‌دهندگان و کارشناسان کسب‌وکار برای جلوگیری از سوء‌تفاهم.
  • مدل‌محوری: ساخت یک مدل مفهومی شامل موجودیت‌ها (Entities)، اشیای مقداری (Value Objects) و سایر الگوها که ساختار کسب‌وکار را نشان می‌دهد.
  • محدودسازی زمینه‌ها: تقسیم‌کردن دامنه به کانتکست‌های مجزا (مثلاً بخش فروش، حسابداری و غیره) که هر کدام مدل و زبان خاص خود را دارند.
  • توسعه افزایشی: همکاری مستمر با کارشناسان کسب‌وکار و تکامل تدریجی مدل دامنه در طول زمان.

.معماری شش ضلعی (Hexagonal Architecture)

اینجا Hexagonal Architecture که گاهی با نام معماری پورت‌ها و آداپتورها(Ports and Adapters) نیز شناخته می‌شود، یک الگوی طراحی نرم‌افزار است که توسط آلستر کوبورن معرفی شد. هدف اصلی این معماری جداسازی منطق کسب‌وکار از جزئیات زیرساختی و تکنولوژی‌های خارجی است. این ساختار باعث می‌شود که تغییرات در لایه‌های خارجی (مانند پایگاه داده، رابط کاربری یا API ها) به هسته اصلی برنامه تأثیری نداشته باشد. در این مدل، هسته برنامه در مرکز قرار دارد و تنها از طریق پورت‌ها با دنیای بیرون در ارتباط است. آداپتورها(Adapters) وظیفه ترجمه داده‌ها و درخواست‌ها به فرمت مناسب برای هسته را دارند. این معماری باعث بهبود تست‌پذیری، انعطاف‌پذیری و کاهش وابستگی‌های سخت‌افزاری می‌شود. این رویکرد به ویژه در سیستم‌های پیچیده، میکروسرویس‌ها و پروژه‌های بزرگ با نیازهای متغیر بسیار مفید است.

ویژگی‌ها:

· جدا کردن منطق کسب‌وکار از زیرساخت

· افزایش تست‌پذیری

· کاهش وابستگی‌های سخت‌افزاری

· مقیاس‌پذیری و انعطاف‌پذیری بالا

9. منبع‌دهی رویدادی یا Event Sourcing

«منبع‌دهی رویدادی» یک الگوی طراحی در معماری نرم‌افزار است که به جای ذخیره مستقیم وضعیت کنونی یک سیستم، تمامی تغییرات (رویدادها) در طول زمان ذخیره می‌شوند. این رویدادها می‌توانند هر تغییری در وضعیت سیستم را ثبت کنند. در نتیجه، وضعیت فعلی سیستم از بازپخش این رویدادها به دست می‌آید. این روش مزایای زیادی دارد؛ از جمله قابلیت بازیابی کامل تاریخچه سیستم، حفظ سازگاری داده‌ها و امکان تحلیل دقیق‌تر رفتار کاربر. همچنین با ایجاد یک منبع معتبر و غیرقابل تغییر از رویدادها، قابلیت ردگیری هر تغییر را فراهم می‌کند. این روش در سیستم‌های توزیع‌شده، برنامه‌های مالی و سیستم‌های مبتنی بر میکروسرویس‌ها بسیار کاربردی است. از مزایای آن می توان به بازیابی تاریخچه کامل داده‌ها، امکان تحلیل رفتار کاربر، بهبود سازگاری داده‌ها و ردگیری دقیق تغییرات اشاره کرد.

10. پلتفرم های Low-code/No-code

پلتفرم‌های Low-code/No-code پلتفرم هایی هستند که به توسعه‌دهندگان اجازه می‌دهند بدون نیاز به نوشتن کد زیاد (یا حتی بدون کدنویسی)، اپلیکیشن‌ها و نرم‌افزارهای پیچیده بسازند. این پلتفرم‌ها با ارائه رابط‌های کاربری بصری، قالب‌های آماده و ماژول‌های از پیش‌ساخته‌شده، فرآیند توسعه را تسریع می‌کنند. هدف اصلی این رویکرد کاهش زمان توسعه، کاهش هزینه‌ها و افزایش سرعت پیاده‌سازی است. پلتفرم‌های معروف در این حوزه شاملOutSystems، Microsoft Power Apps ، Appian و ورد پرس هستند. با وجود سادگی، این پلتفرم‌ها می‌توانند محدودیت‌هایی نیز داشته باشند؛ از جمله کمبود انعطاف‌پذیری برای پروژه‌های پیچیده و نیاز به یکپارچگی دقیق با سیستم‌های موجود.

ویژگی‌ها:

· توسعه سریع بدون نیاز به کدنویسی عمیق

· کاهش هزینه‌ها و زمان توسعه

· قابلیت توسعه توسط افراد غیرتخصصی

· محدودیت در سفارشی‌سازی پیچیده

11. سیستم‌های مدیریت فرآیندهای کسب‌وکار (Business Process Management Systems)

سیستم‌های مدیریت فرآیندهای کسب‌وکار یا BPMS، نرم‌افزارهایی هستند که به سازمان‌ها کمک می‌کنند فرآیندهای کسب‌وکار خود را مدل‌سازی، خودکارسازی، نظارت و بهینه‌سازی کنند. هدف اصلی BPMSایجاد شفافیت، افزایش بهره‌وری و بهبود همکاری میان تیم‌ها است. این سیستم‌ها معمولاً شامل ابزارهای طراحی فرآیند (Process Modeling), اجرای فرآیند (Process Execution), پایش (Monitoring) و بهینه‌سازی(Optimization) هستند. مثلا، استفاده ازBPMS در یک شرکت تولیدی می‌تواند فرآیند سفارش تا تحویل را خودکار کرده و بهینه‌سازی کند تا زمان و هزینه‌ها کاهش یابند.

12. ابزار Message Queue (such as Kafka and RabbitMQ)

ابزارهایی هستند که به سیستم‌ها اجازه می‌دهند پیام‌ها را به صورت ناهمزمان بین اجزای مختلف ارسال و دریافت کنند. این رویکرد به طور چشمگیری عملکرد و مقیاس‌پذیری سیستم‌ها را افزایش می‌دهد. برای مثال، Apache Kafka وRabbitMQ دو مورد محبوب هستند که هر کدام ویژگی‌های خاص خود را دارند. Kafka برای حجم‌های بزرگ داده و پردازش جریان (Stream Processing) بهینه شده، در حالی که RabbitMQبیشتر در سیستم‌های توزیع‌شده با پیام‌های کوچک و نیاز به تأخیر کم استفاده می‌شود. استفاده از این ابزارها به تفکیک منطقی وظایف در سیستم‌های نرم‌افزاری کمک می‌کند و امکان توسعه انعطاف‌پذیرتر را فراهم می‌سازد.

13. هماهنگی کانتینرها (such as Kubernetes) Container Orchestration

به معنای مدیریت خودکار چرخه حیات کانتینرها است. Kubernetes یکی از شناخته‌شده‌ترین ابزارهای این حوزه است که به توسعه‌دهندگان و مدیران سیستم‌ها کمک می‌کند تا به سادگی برنامه‌های مبتنی بر کانتینر را در مقیاس بزرگ مستقر، مقیاس‌بندی و نگهداری کنند. Kubernetes ویژگی‌هایی مانند خودبهبودی (Self-Healing), مدیریت بار (Load Balancing), و استقرار خودکار (Automated Rollouts) را فراهم می‌کند که به بهبود دسترس‌پذیری و کارایی سرویس‌ها کمک می‌کند.

14. معماری چندمستاجری (Multi-Tenancy Architecture)

معماری چند مستأجری (Multi-Tenancy) به نرم‌افزارها اجازه می‌دهد به طور همزمان به چندین مشتری (tenant) خدمات ارائه دهند، به گونه‌ای که داده‌ها و تنظیمات هر مشتری به صورت مجزا مدیریت شوند. این رویکرد به ارائه‌دهندگان خدمات ابری کمک می‌کند تا منابع را بهینه‌تر استفاده کرده و هزینه‌ها را کاهش دهند. به عنوان مثال، در یک پلتفرم SaaS (Software as a Service)مانند Salesforce، هر مشتری از نرم‌افزار مشترک استفاده می‌کند اما داده‌ها و پیکربندی‌ها کاملاً از یکدیگر جدا هستند.

15.الگوهای یکپارچه‌سازی سازمانی (Enterprise Integration Patterns)

الگوهای یکپارچه‌سازی سازمانی مجموعه‌ای از روش‌ها و الگوهایی هستند که به توسعه‌دهندگان کمک می‌کنند اجزای نرم‌افزاری مختلف را به شکل هماهنگ و کارآمد به یکدیگر متصل کنند. این الگوها شامل مواردی مانند Messaging, Routing, Transformation, و Aggregation هستند که هر یک نقش خاصی در انتقال داده‌ها بین سیستم‌های مختلف دارند. به عنوان مثال، استفاده از یک الگوی پیام‌رسانی (Message Channel) می‌تواند ارتباط بین سیستم‌های توزیع‌شده را ساده‌تر و قابل اعتمادتر کند.


مراجع:

    • developer.hashicorp.com/terraform
    • aws.amazon.com/cloudformation
    • en.wikipedia.org/wiki/Infrastructure_as_code
    • istio.io
    • www.nginx.com/learn/api-gateway/
    • martinfowler.com/bliki/CQRS.html
    • www.rabbitmq.com/docs
    • kafka.apache.org/documentation/#gettingStarted
api gatewaydddfaas
کارشناسی ارشد معماری سازمانی
شاید از این پست‌ها خوشتان بیاید