ویرگول
ورودثبت نام
محمد صادقی
محمد صادقی
محمد صادقی
محمد صادقی
خواندن ۱۹ دقیقه·۹ ساعت پیش

مرور برخی مفاهیم مهم در نرم افزار

درین پست قصد داریم درباره هریک از موضوعات موجود در لیست زیر توضیحی مختصر، مفید و کم عمق جهت آشنایی اولیه ای با هرکدام از این مفاهیم داشته باشیم. موضوعات مورد بحث:

1.Chaos Engineering
2.Backend for Frontend
3.AI4SE
4.SE4AI
5.MLOps
6.Infrastructure as Code (IaC)
7.API Gateway & Service Mesh
8.CQRS (Command Query Responsibility Segregation)
9.Event-Driven Architecture (EDA)
10.Serverless Architecture
11.API-first Approach
12.Domain Driven Design
13.Hexagonal architecture
14.Event Sourcing
15.Low-code/No-code platforms
16.Business Process Management Systems (BPMS)
17.Message Queue (such as Kafka and RabbitMQ)
18.Containers (eg., Docker) and Container orchestration (e.g.,  Kubernetes)
19.Multi-Tenancy Architecture
20.Data Migration

در ادامه این مقاله به ترتیب به شرح کوتاهی از هر موضوع خواهیم پرداخت.

Chaos Engineering

مهندسی آشوب نوعی سازوکار است که بصورت عمدی و کنترل شده، خرابی هایی را در سیستم ایجاد می کنند تا بتوانند در آینده، در صورت وقوع خرابی، مقدار آسیبی که به سیستم می رسد را کمینه کنند. به عبارت دیگر این سازوکار به شناخت و اندازه گیری آسیب ها و خرابی‌های احتمالی سیستم بصورت پیشگیرانه و proactive می پردازد و تیم توسعه قبل از وقوع خرابی آن را پیش بینی و راهکارهایی برای آن در نظر می گیرد. تکنیک های مختلفی برای این کار وجود دارد:

۱)تزریق تاخیر: تیم دوآپس سناریوهایی را که ارتباط شبکه ضعیف یا قطع شود را شبیه سازی میکنند.
۲)تزریق خطا: ایجاد عمدی باگ و خطا در یک سرویس، برای بررسی اینکه سیستم های وابسته به این سرویس دچار خطا میشوند یا خیر.
۳)تولید بار: فرستادن ترافیک با حجم بالا به سمت سیستم برای تشخیص گلوگاه ها، که رفع کردن آنها منجر به افزایش مقیاس پذیری سیستم خواهد شد.
۴)تست قناری: یک ویژگی یا کارکرد جدید سیستم را فقط برای درصدی از کاربران در دسترس قرار می دهیم تا در صورت وجود ایراد، باقی کاربران سیستم اثر آن را مشاهده نکنند.

جهت مطالعه بیشتر به [1] و [2] در بخش منابع مراجعه کنید.

Backend For Frontend

این مفهوم که در صنعت بیشتر با BFF از آن یاد میشود، یک الگوست که به جداسازی سرویس های بکند و پیاده سازی های سمت فرانت اند در سامانه می پردازد. در واقع می گوید نباید در یک سازمان، برای رابط های کاربری مختلف، بکند های سفارشی سازی شده طراحی و ساخته شود. داشتن یک سرویس بکند و چندین نوع رابط کاربری مشکلاتی را از قبیل تزاحم و race condition می تواند بوجود بیاورد. شکل زیر ساختاری را نشان میدهد که هر رابط مستقیما با سرویس بکند ارتباط دارد و چون هر رابط کاربری قابلیت ها و نیازهای متفاوتی را دارد، لذا مشکلاتی که قبل تر ذکر شد ناگزیر اتفاق میافتند:

برای حل این مشکل از الگوی BFF استفاده می کنند که ایده اش اضافه کردن یک لایه بین سرویس بکند و لایه ی رابط کاربری است که این لایه تنها نیازمندی های رابط کاربری متناظر خودش را مدیریت میکند. مزیت این کار این است که تیم های توسعه فرانت هر رابط کاربری، بصورت مجزا توسعه میدهند بی آنکه نگران تاثیر کار خود بر روی رابط های دیگر باشند. شکل زیر ساختار جدید سیستم بعد از اعمال این الگو را نمایش می دهد:

جهت مطالعه بیشتر به [3] در بخش منابع رجوع شود.

AI4SE

هوش مصنوعی برای مهندسی نرم افزار کانسپتی نسبتا جدید درین حوزه است که با ظهور مدل های زبانی همه گیر شده است. این حوزه به کاربرد فناوری های موجود در هوش مصنوعی جهت بهبود فرایند طراحی، توسعه و نگهداشت سیستم های نرم افزاری است. این فرایند شامل مراحلی مثل تحلیل نیازمندی های سیستم، مدل های پیش بینی و تصمیم گیری و همچنین شبیه سازی هستند. هدف اصلی این رویکرد استفاده از نتایج بدست آمده از تحلیل های داده محور است تا بتوانند عملکرد سیستم را بهبود داده، زمان توسعه را کم کرده و همچنین کلیت فرایند مهندسی سیستم نرم افزاری را با کارایی بهتری انجام دهند.

SE4AI

با افزایش چشمگیر استفاده از هوش مصنوعی، سیستم های پیچیده نیازمند این هستند تا این فناوری در آنها ادغام شود. فریم ورک Software Engineering for AI بوجود آمده تا با استفاده از اصول مهندسی سیستم - که بر روی طراحی، یکپارچه سازی و مدیریت سیستم های پیچیده تمرکز دارد - بتواند فناوری های هوش مصنوعی را با اینگونه سیستم ها ادغام کند. این فریم ورک در واقع از اعمال practice های مهندسی سیستم در فرایندهای طراحی، توسعه و استقرار سیستم های قدرت گرفته با AI استفاده میکند. بعضی مراحلی که ادغام فناوری های هوش مصنوعی در آنها توسط این practice ها انجام میشوند میتوان به تعریف نیازمندی ها، طراحی معماری سیستم، آزمون و اعتبارسنجی سامانه اشاره کرد. این فریم ورک در واقع از ادغام کارای فناوری های هوش مصنوعی در سامانه های پیچیده اطمینان حاصل میکند در حالی که ویژگی های کیفی مانند قابلیت اطمینان و دسترس پذیری را هم تضمین میکنند.

جهت مطالعه بیشتر درباره دو موضوع بالا به [4] و [5] در منابع مراجعه کنید.

MLOps

ترکیبی از یادگیری ماشین (ML) و عملیات (Operations) است که به ساده سازی و بهینه کردن فرایند استقرار، پایش و مدیریت مدل های یادگیری ماشین در محیط تولید خودکار می پردازد. در واقع این روش همکاری بین متخصصین داده و مهندسان دوآپس است تا بتوانند در مقیاس بزرگ و بصورت پیوسته تحویل و نگهداری مدل های یادگیری ماشین را در مقیاس بزرگ انجام دهند. تقریبا شبیه devops است با این فرق که آنجا ما مرحله بین توسعه فنی و استقرار را خودکار میکنیم اما درینجا تغییرات و بروزرسانی ها روی الگوریتم های یادگیری یا هر آپدیتی روی مدل زبانی بصورت خودکار و پیوسته باید روی مدل مستقر شود. کلا تمرکز دوآپس فقط روی چرخه توسعه محصول است اما در MLOps کل چرخه حیات مدل از جمع آوری داده تا توسعه و آزمون و استقرار مد نظر است. این مفهوم در سالهای اخیر بنام MLOps ظهور کرده و ترند شده است.

برای مطالعه بیشتر و آشنایی با مراحل این فرایند به [6] در بخش منابع رجوع کنید.

Infrastructure As Code

زیرساخت بعنوان کد یا همان IaC همانطور که از نامش پیداست تهیه و آماده سازی شرح و جزییات زیرساخت های سیستم نرم افزار در غالب کد است. زیرساخت های نرم افزاری شامل مولفه هایی مثل سیستم عامل، اتصال پایگاه داده و یا حافظه میباشد. در IaC تمرکز روی این است تا بجای اینکه تیم های توسعه وقت و انرژی زیادی را صرف آماده سازی و تهیه دستی محیط توسعه یا همان زیرساخت های نرم افزاری کنند، فایل های پیکربندی را - که محتوای آنها کدی است که جزییات دقیقی از محیط توسعه و زیرساخت های لازم را شرح میدهد - آماده می کنند که هم راحت تر تغییر را می پذیرند هم به توسعه دهندگان اجازه میدهد وقت خود را روی توسعه فنی صرف کنند. برای تولید فایل های پیکربندی در قالب کد دو رویکرد وجود دارد:

1) صریح: بصورت شفاف منابع و زیرساخت های مورد نیاز در کد ذکر میشود.
2)ضمنی: کد شامل دستوراتی است که اجرای به ترتیب آنها برای دستیابی به محیط مناسب ضروری است.

برای مطالعه عمیق تر درین حوزه به [7] و [8] در منابع مراجعه کنید.

API Gateway and Service Mesh

هردو عبارت ذکر شده در تیتر این بخش ابزار هایی هستند جهت تسهیل و مدیریت هرچه بهتر ارتباطات در معماری های میکروسرویس که درین معماری چندین سیستم و سرویس مختلف با هم تعامل میکنند تا یک سامانه بزرگ اصلی بتواند کار کند. در ادامه مختصرا هریک را توضیح می دهیم:
1)api gateway: یک هاب مرکزی است که وظیفه تعامل های خارجی با سیستم میکروسرویس شما را دارد. این هاب درخواست هایی را که از طرف کلاینت ها به سیستم ارسال میشود را بر اساس یک سری ضوابط، به سرور های بکند مناسب ارجاع میدهد و همچنین بحث دسترسی و احراز کاربران را نیز به عهده دارد. یکی از کارهای مهم این هاب جمع آوری پاسخ از سرورهای بکند مختلف و تجمیع آنها در یک فرمت استاندارد مناسب برای کاربر درخواست دهنده است.
2)service mesh: این یک معماری است که درون هر سرویس بصورت جداگانه یک پروکسی قرار میگیرد و برعکس رویکرد اول غیر متمرکز است. در واقع شبکه توزیع شده ای از پروکسی ها روی تمام سرویس های سامانه بصورت جداگانه است. هر پروکسی وظیفه رهگیری ارتباطات سرویس به سرویس را دارد که این رویکرد هم بار حجم ارتباطات را می کاهد و هم از نظر امنیتی بهتر است.

شکل زیر به تشریح تفاوت بین دو رویکرد را خلاصه سازی کرده است:

جهت مطالعه بیشتر به [9] و [10] در بخش منابع رجوع کنید.

CQRS

جداسازی مسوولیت های کوئری و دستورات یکی از الگوهای معماری معرفی شده توسط Greg Young است. این الگو می گوید برای برزورسانی داده ها و خواندن آنها از دو مدل مجزا استفاده کنید که آقای مارتین فالر معتقد است برای اکثر سیستم ها این الگو پیچیدگی پر ریسکی به همراه دارد. در معماری های سنتی مثل MVC معمولا یک مدل واحد هم برای خواندن و هم برای نوشتن داده ها استفاده میشود که اگر بنابه نیازمندی های سیستم حجم یکی ازین دو نوع عملیات بیش از دیگری باشد، این معماری خیلی منطقی نیست. شکل زیر نمای کلی این معماری را نشان میدهد:

اما در جایی که میخواهیم از مدل های خواندن و نوشتن متفاوت استفاده کنیم و یا مستقلا نیاز به مقیاس پذیر بودن این دو نوع عملیات داریم به سراغ الگوی CQRS می رویم. درین الگو از دو مدل مجزا بهره میبریم:
1- بخش کامند: مسئولیت ایجاد، به‌روزرسانی یا حذف داده‌ها را بر عهده دارد. این بخش معمولا از مدل‌های تحلیلی یا عملیاتی پیروی می‌کند که پیچیده‌تر بوده و قوانین تجاری زیادی هم دارد.
2- بخش کوئری: مسئولیت خواندن و نمایش داده‌ها را بر عهده دارد. این بخش از مدل‌های خوانش مثل Projection استفاده می‌کند که برای پرس‌وجوهای خاص بهینه‌سازی شده‌ و ممکن است ساختار متفاوتی با مدل نوشتن داشته باشد. شکل زیر نمای کلی معماری را نمایش میدهد:

برای جزییات بیشتر به [11] در منابع رجوع کنید.

Event-Driven Architecture

معماری مبتنی بر رویداد یک نوع معماری برای تعامل سرویس های مختلف در برنامه های مدرن مبتنی بر میکروسرویس است. یک رویداد، تغییر در استیت برنامه یا آپدیتی است که اتفاق می افتد. اضافه یا کم شدن یک محصول از سبد خرید کاربر در سایتی مثل آمازون یا دیجیکالا مثالی از رویداد است. این معماری 3 رکن دارد. تولید کننده رویداد، روتر یا هدایت کننده آن و در نهایت مصرف کننده آن رویداد رکن های این معماری هستند. رویداد می تواند حاوی خود استیت باشد مانند اطلاعات محصول اضافه شده، آدرس و قیمت آن. در عین حال می تواند یک شناسه معمولی باشد مثل اینکه یک سفارش ارسال شد یا تحویل گرفته شد. روتر رویداد وظیفه فیلتر کردن و فرستادن این رویداد به سمت مصرف کننده را دارد. سرویس های مربوط به تولید و مصرف کننده رویداد کاملا مجزا از هم هستند تا قابلیت توسعه و نگهداشت آنها بصورت مستقل امکان پذیر باشد.

جهت مطالعه بیشتر به [12] در منابع مراجعه کنید.

Serverless Architecture

معماری بدون سرور (Serverless Architecture) یک الگوی توسعه نرم‌افزار است که در آن مدیریت زیرساخت، سرورها و مقیاس‌پذیری به‌عهده ارائه‌دهنده خدمات ابری قرار می‌گیرد و توسعه‌دهندگان تنها روی نوشتن منطق برنامه تمرکز می‌کنند. در این معماری کدها معمولا به‌صورت توابع مستقل اجرا می‌شوند و فقط هنگام دریافت درخواست فعال می‌شوند. بنابراین هزینه‌ها بر اساس میزان استفاده واقعی محاسبه می‌شود. معماری بدون سرور باعث افزایش سرعت توسعه، مقیاس‌پذیری خودکار و کاهش هزینه‌های نگهداری می‌شود. اما در مقابل ممکن است چالش‌هایی مانند تأخیر در شروع اولیه، وابستگی به ارائه‌دهنده سرویس و محدودیت در کنترل زیرساخت را نیز به همراه داشته باشد. تصویر زیر این معماری را نشان میدهد:

اجزای داخل این معماری به اختصار در ادامه آمده اند:

1) Web App: رابط کاربری که کاربران از طریق آن با سیستم تعامل می‌کنند.
2) API Gateway: درگاه مرکزی دریافت و هدایت درخواست‌ها به سرویس‌های مختلف
3) Authorizer: مسئول احراز هویت و بررسی مجوز دسترسی کاربران
4) Content Service: سرویسی برای مدیریت و پردازش محتوای برنامه
5) User Service: سرویس مربوط به اطلاعات، حساب و عملیات کاربران
6) External APIs: سرویس‌ها و API های خارجی که سیستم از آن‌ها داده یا امکانات دریافت می‌کند
7) External Database: پایگاه‌داده خارجی برای ذخیره و بازیابی اطلاعات سیستم

برای مطالعه بیشتر به [13] و [14] در منابع مراجعه شود.

API-first Approach

رویکرد API-First یعنی قبل از ساخت برنامه، ابتدا APIها طراحی شوند و بقیه بخش‌های سیستم بر اساس آن توسعه پیدا کنند. در این روش API هسته اصلی ارتباط بین سرویس‌ها، اپلیکیشن‌ها و دستگاه‌های مختلف است. درین رویکرد معمولا ابتدا یک قرارداد برای رفتار API تعریف می‌شود تا همه تیم‌ها بدانند هر سرویس چگونه کار می‌کند. این کار باعث می‌شود توسعه‌دهندگان بتوانند همزمان روی بخش‌های مختلف پروژه کار کنند و منتظر تکمیل سایر قسمت‌ها نمانند. این رویکرد همچنین در معماری میکروسرویس کاربرد زیادی دارد چون سرویس‌ها به شکل مستقل طراحی شده و از طریق API با هم ارتباط دارند.

از مهم‌ترین مزایای API-First می‌توان به کاهش هزینه توسعه، استفاده مجدد از کدها و افزایش سرعت تولید محصول اشاره کرد. بسیاری از ابزارها نیز می‌توانند مستندات، نمونه API و فایل‌های موردنیاز را به‌صورت خودکار تولید کنند که زمان توسعه را کمتر می‌کند. این رویکرد تجربه بهتری برای برنامه‌نویسان ایجاد می‌کند چون APIهای استاندارد و مستند یادگیری و استفاده آسان‌تری دارند. علاوه بر این ریسک خطا و شکست پروژه کم می شود زیرا مشکلات طراحی اغلب قبل از پیاده‌سازی اصلی شناسایی می‌شوند.

برای مطالعه بیشتر به [15] در منابع مراجعه شود.

Domain Driven Design

طراحی دامنه‌محور یا DDD یک رویکرد در توسعه نرم‌افزار است که تمرکز اصلی اش روی درک دقیق نیازها، قوانین و فرایندهای کسب‌وکار است. در این روش قبل از پیاده‌سازی فنی تلاش می‌شود مفاهیم واقعی دامنه مسئله به‌درستی شناسایی و مدل‌سازی شوند تا نرم‌افزار بتواند رفتار واقعی سیستم را بازتاب دهد. DDD بیشتر در پروژه‌های پیچیده استفاده می‌شود، جایی که منطق کسب‌وکار گسترده و تغییرپذیر است.

در طراحی دامنه‌محور، توسعه‌دهندگان و متخصصان کسب‌وکار از یک زبان مشترک استفاده می‌کنند تا همه اعضای تیم برداشت یکسانی از مفاهیم سیستم داشته باشند. همچنین سیستم به بخش‌های کوچک‌تر و مستقل تقسیم می‌شود تا مدیریت و توسعه آن ساده‌تر باشد. این رویکرد باعث می‌شود نرم‌افزار ساختار منظم‌تر، قابلیت نگهداری بالاتر و انعطاف بیشتری در برابر تغییرات آینده داشته باشد.

جهت مطالعه بیشتر به [16] و [17] در منابع مراجعه شود.

Hexagonal architecture

معماری شش‌ضلعی یا Ports and Adapters یک الگوی معماری نرم‌افزار است که هدفش جدا کردن منطق اصلی سیستم از بخش‌های خارجی مثل پایگاه‌داده، رابط کاربری و APIها است. در این معماری هسته اصلی برنامه فقط شامل منطق کسب‌وکار است و ارتباط آن با بخش‌های بیرونی از طریق Port و Adapter انجام می‌شود. این ساختار باعث می‌شود وابستگی مستقیم بین منطق سیستم و فناوری‌های خارجی کاهش پیدا کرده و تغییر یا جایگزینی بخش‌های مختلف آسان‌تر شود. شکل زیر نمای کلی این معماری را نمایش می دهد:

در معماری شش‌ضلعی Adapterها وظیفه اتصال سیستم به دنیای بیرون را دارند. برای مثال API، دیتابیس یا رابط کاربری می‌توانند به‌عنوان Adapter عمل کنند. در طرف دیگر Portها نیز قراردادهای ارتباطی بین هسته سیستم و این Adapterها هستند. این رویکرد باعث افزایش آزمون پذیری، انعطاف‌پذیری و قابلیت نگهداری نرم‌افزار شده و در پروژه‌هایی که نیاز به توسعه بلندمدت و معماری تمیز دارند کاربرد زیادی دارد.

مطالعه بیشتر در [18] و [19] بخش منابع انجام شود.

Event Sourcing

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

در تصویر، ابتدا برنامه عملیات مختلف را در Event Store ذخیره می‌کند. Event Store نقش مخزن اصلی رویدادها را دارد و تمام تغییرات سیستم در آن نگهداری می‌شود. سپس بخش Event Store Consumer این رویدادها را مصرف کرده و بر اساس آن‌ها وضعیت فعلی سیستم را در Current State DB ذخیره میکند. همچنین بخشی به نام Replay Processor وجود دارد که می‌تواند رویدادهای قبلی را دوباره اجرا کند تا وضعیت سیستم در یک زمان خاص بازسازی شود. در پایین تصویر نیز Point in Time DB دیده می‌شود که برای نگهداری وضعیت سیستم در زمان‌های مشخص استفاده می‌شود. این معماری باعث می‌شود سیستم همواره قابل بازسازی و ردیابی باشد.

جهت بررسی بیشتر این معماری به [20] در منابع رجوع شود.

Low-code/No-code platforms

پلتفرم‌های Low-code و No-code ابزارهایی هستند که امکان توسعه نرم‌افزار و ساخت برنامه را با کمترین میزان کدنویسی فراهم می‌کنند. در No-code کاربران معمولا بدون نوشتن کد و فقط با رابط‌های گرافیکی، Drag & Drop و تنظیمات آماده برنامه می‌سازند. اما در Low-code امکان افزودن کد سفارشی هم وجود دارد تا توسعه‌دهندگان فنی بتوانند قابلیت‌های پیشرفته‌تری ایجاد کنند. این پلتفرم‌ها باعث می‌شوند توسعه نرم‌افزار سریع‌تر، ارزان‌تر و ساده‌تر انجام شود و افراد غیرمتخصص هم بتوانند اپلیکیشن‌های کاربردی طراحی کنند.

این رویکرد بیشتر برای ساخت سیستم‌های سازمانی، فرم‌ها، داشبوردها و اپلیکیشن‌های وب و موبایل استفاده می‌شود. همچنین به شرکت‌ها کمک می‌کند محصولات را سریع‌تر وارد بازار کنند و وابستگی کمتری به تیم‌های بزرگ برنامه‌نویسی داشته باشند. البته در پروژه‌های بسیار پیچیده ممکن است محدودیت‌هایی در شخصی‌سازی، مقیاس‌پذیری و کنترل کامل روی سیستم وجود داشته باشد.

نمونه‌هایی از این پلتفرم ها:

n8n : پلتفرمی برای اتوماسیون فرایندها و اتصال سرویس‌ها با رابط گرافیکی
Cursor : محیط توسعه مبتنی بر هوش مصنوعی که تولید و ویرایش کد را ساده‌تر می‌کند.
Bubble : ابزار ساخت اپلیکیشن وب بدون نیاز به کدنویسی
Zapier : سرویس اتصال و خودکارسازی بین برنامه‌های مختلف
Webflow : پلتفرم طراحی و توسعه وب‌سایت بدون کدنویسی

جهت آشنایی بیشتر با این پلتفرم ها به [21] در منابع رجوع شود.

Business Process Management Systems

نرم‌افزار مدیریت فرآیند کسب‌وکار (BPMS) ابزاری است که به شرکت‌ها کمک می‌کند فرآیندهای دستی و زمان‌بر را خودکار کرده و آنها را به جریان‌های کاری سازمان‌یافته تبدیل کنند. با استفاده از BPMS می‌توان وظایف مختلفی مثل بررسی و تأیید مدارک، مدیریت اسناد، فرآیندهای استخدام و پاسخ به درخواست‌های کارکنان را ساده و سریع‌تر انجام داد. نسخه‌های پیشرفته‌تر به نام iBPMS با اضافه کردن هوش مصنوعی و تحلیل داده‌های بزرگ و امکانات ابری، امکان خودکارسازی پیچیده‌تر و سرعت بالاتر در طراحی جریان‌ها و هماهنگی بهتر فرآیندها را فراهم کرده اند. این نرم‌افزار ها باعث افزایش بهره‌وری، کاهش کارهای تکراری و بهبود همکاری بین تیم‌ها می‌شوند. همچنین تجربه مشتری را با پاسخ‌دهی منظم و شخصی‌سازی شده بهبود می‌بخشند. BPMS امروز طوری طراحی شده که نیاز چندانی به پشتیبانی توسعه‌دهندگان و تیم IT ندارد و افراد مختلف در سازمان می‌توانند با استفاده از ابزارهای ساده‌ای مثل کشیدن و رها کردن، فرآیندهای خودکار ایجاد کنند. انتخاب نرم‌افزار مناسب بستگی به نیاز کسب‌وکار، نوع فرآیندها، سطح پشتیبانی و بودجه دارد. در کل BPMS ابزاری مهم برای تسهیل کارها، سرعت بخشیدن به عملیات و بهبود هماهنگی و پاسخ‌دهی در سازمان است.

مطالعه بیشتر درباره این ابزار در منابع [22] انجام شود.

Message Queue

صف پیام یک سازوکار است که امکان تعامل بخش های مختلف سامانه را بصورت آسنکرون و غیر همزمان می دهد. در رویکرد های سنکرون یا همزمان، فرستنده بلاک میشود تا از رسیدن پیامش مطمئن شود اما در معماری آسنکرون مثل صف پیام اینگونه نیست و تولید کننده پیام آن را داخل صف گذاشته و به کار خودش ادامه می دهد. این معماری شامل 3 نقش اصلی است:

1-تولید کننده پیام
2-مصرف کننده پیام
3-صف نگهدارنده پیام ها
تصویر زیر معماری این ابزارها را نمایش می دهد:

خود ساختار پیام معمولا شامل دو بخش هدر و بادی است. بخش هدر شامل متادیتا هایی مانند نوع پیام، تاریخ پیام و آدرس فرستنده و گیرنده است. محتوای بادی نیز شامل اطلاعات اصلی پیام است که در فرمت های مختلفی مانند متن معمولی یا JSON فرستاده میشود. انواع متنوعی از صف های پیام داریم. نوع اول صف نقطه به نقطه است. یعنی به محض مصرف پیام توسط یک مصرف کننده آن پیام حذف میشود. نوع دوم انتشار - اشتراک است که در آن تولید کنندگان صف مخصوص خود را دارند و هر مصرف کننده می تواند پیام های چند تولیدکننده را با مشترک شدن به صف آنها دریافت کند.

جهت مطالعه بیشتر این معماری به [23] در منابع رجوع شود.

Containers and Container orchestration

دو مفهوم کانتینر و ارکستریشن با ظهور محاسبات و فضاهای ابری بسیار ترند و حائز اهمیت شده اند. Container ها روشی برای بسته‌بندی و اجرای نرم‌افزار هستند که همه وابستگی‌های لازم برنامه مثل کتابخانه‌ها و تنظیمات را در یک محیط ایزوله قرار می‌دهند. به کمک این روش، برنامه روی هر سیستم یا سروری بدون مشکل اجرا می‌شود و تفاوت محیط‌ها باعث خطا نخواهد شد. ابزارهایی مثل Docker باعث شدند استفاده از Containerها در توسعه نرم‌افزار بسیار رایج شود چون فرآیند توسعه، تست و استقرار را سریع‌تر و ساده‌تر می‌کنند.

وقتی تعداد Containerها زیاد می‌شود، مدیریت آن‌ها به‌صورت دستی دشوار میشود. اینجاست که Container Orchestration اهمیت پیدا می‌کند. سیستم‌های ارکستریشن وظیفه مدیریت، مقیاس‌پذیری، توزیع و مانیتورینگ Containerها را بر عهده دارند. برای مثال اگر یکی از سرویس‌ها از کار بیفتد، سیستم به‌صورت خودکار آن را دوباره اجرا می‌کند یا در زمان افزایش کاربران، تعداد نمونه‌های سرویس را بیشتر می‌کند. معروف‌ترین ابزار این حوزه Kubernetes است که در بسیاری از زیرساخت‌های ابری و سامانه‌های بزرگ استفاده می‌شود. این فناوری‌ها باعث شده‌اند توسعه و نگهداری سیستم‌های مدرن مخصوصا معماری‌های مبتنی بر میکروسرویس بسیار انعطاف‌پذیرتر و قابل اطمینان‌تر شوند.

برای مطالعه بیشتر به [24] و [25] در منابع رجوع شود.

Multi-Tenancy Architecture

معماری Multi-Tenancy روشی در طراحی نرم‌افزار است که در آن یک نسخه از برنامه به‌صورت هم‌زمان به چندین کاربر یا سازمان مختلف سرویس می‌دهد. در این معماری هر سازمان که به آن Tenant گفته می‌شود، داده‌ها و تنظیمات مخصوص به خود را دارد اما همه از یک زیرساخت و برنامه مشترک استفاده می‌کنند. این معماری بیشتر در سرویس‌های ابری و نرم‌افزارهای SaaS کاربرد دارد چون هزینه نگهداری و توسعه را کاهش می‌دهد و مدیریت سیستم را ساده‌تر می‌کند. شکل زیر نمایی از این معماری را نمایش می دهد:

در معماری Multi-Tenancy، جداسازی اطلاعات کاربران اهمیت زیادی دارد تا داده‌های هر Tenant امن و مستقل باقی بماند. این جداسازی می‌تواند در سطح پایگاه داده، جداول یا حتی منطق برنامه انجام شود. یکی از مزیت‌های اصلی این معماری مقیاس‌پذیری بالا و امکان به‌روزرسانی سریع سیستم برای همه کاربران است. با این حال طراحی آن نیازمند توجه دقیق به امنیت، مدیریت منابع و عملکرد سیستم است تا استفاده هم‌زمان چندین Tenant باعث کاهش کیفیت سرویس نشود.

جهت بررسی بیشتر و آشنایی با انواع مختلف این معماری به [26] در منابع مراجعه کنید.

Data Migration

مهاجرت به فرآیند انتقال داده‌ها از یک سیستم، پایگاه داده یا زیرساخت به محیطی جدید گفته می‌شود. این کار معمولا زمانی انجام می‌شود که یک سازمان بخواهد نرم‌افزار قدیمی خود را ارتقا دهد، به فضای ابری مهاجرت کند یا سیستم‌های مختلف را با هم یکپارچه کند. در این فرآیند داده‌ها باید بدون از دست رفتن اطلاعات و با حفظ صحت و ساختار اصلی منتقل شوند.

مهاجرت داده فقط کپی کردن اطلاعات نیست. معمولاً شامل پاک‌سازی، تبدیل فرمت‌ها و هماهنگ‌سازی داده‌ها با ساختار سیستم جدید نیز می‌شود. اگر این فرآیند به‌درستی انجام نشود، ممکن است باعث ناسازگاری داده‌ها، اختلال در سرویس یا حتی از دست رفتن اطلاعات مهم شود. به همین دلیل قبل از اجرای Data Migration معمولا نسخه پشتیبان تهیه می‌شود و مراحل انتقال در چند مرحله آزمایشی بررسی می شود. امروزه بسیاری از سازمان‌ها هنگام مهاجرت به سیستم‌های ابری یا معماری‌های مدرن از ابزارهای خودکار Data Migration برای کاهش خطا و افزایش سرعت استفاده می‌کنند.

برای مطالعه بیشتر درین مورد به [27] و [28] در منابع رجوع کنید.

References

[1] https://www.ibm.com/think/topics/chaos-engineering
[2] https://principlesofchaos.org/
[3] https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends
[4] https://www.linkedin.com/pulse/what-se4ai-ai4se-cmde-brijendra-singh-rawat/
[5] https://computingintelligenceblog.wordpress.com/2023/08/21/what-is-se4ai-and-ai4se/
[6] https://liara.ir/blog/mlops-%DA%86%DB%8C%D8%B3%D8%AA/
[7] https://aws.amazon.com/what-is/iac/
[8] https://www.redhat.com/en/topics/automation/what-is-infrastructure-as-code-iac
[9] https://www.geeksforgeeks.org/blogs/api-gateway-vs-service-mesh/
[10] https://www.akamai.com/glossary/api-gateway-vs-service-mesh
[11] https://martinfowler.com/bliki/CQRS.html
[12] https://aws.amazon.com/event-driven-architecture/
[13] https://medium.com/@dave-patten/serverless-architecture-pros-cons-and-use-cases-4a0769744ca2
[14] https://www.geeksforgeeks.org/system-design/serverless-architectures/
[15] https://swagger.io/resources/articles/adopting-an-api-first-approach/
[16] https://www.geeksforgeeks.org/system-design/domain-driven-design-ddd/
[17] https://martinfowler.com/bliki/DomainDrivenDesign.html
[18] https://docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/hexagonal-architecture.html
[19] https://scalastic.io/en/hexagonal-architecture/
[20] https://www.geeksforgeeks.org/system-design/event-sourcing-pattern/
[21] https://www.techtarget.com/searchsoftwarequality/definition/low-code-no-code-development-platform
[22] https://www.microsoft.com/en-us/power-platform/products/power-automate/topics/business-process/bpms-business-process-management-software
[23] https://www.geeksforgeeks.org/system-design/message-queues-system-design/
[24] https://dev.to/ezinne_anne/containers-what-is-containerization-and-container-orchestration-38pe
[25] https://www.stackscale.com/blog/containerization-containers-orchestration/
[26] https://www.geeksforgeeks.org/system-design/multi-tenancy-architecture-system-design/
[27] https://www.zuar.com/blog/database-data-migration-considerations/
[28] https://www.ibm.com/think/topics/data-migration

نرم افزارهوش مصنوعیمعماری نرم افزاردواپس
۰
۰
محمد صادقی
محمد صادقی
شاید از این پست‌ها خوشتان بیاید