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

تفاوت معماری با دیزاین پترن و سیستم دیزاین

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

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

سبک معماریایده اصلیمزیتمحدودیت
Monolithicیک برنامه یکپارچه و یک واحد استقرارشروع سریع، دیباگ ساده‌تررشد کد و تغییرات تیمی در مقیاس بزرگ
Modular Monolithیک استقرار با ماژول‌های مرزبندی‌شدهحفظ سادگی عملیات و جداسازی دامنهنیاز به کنترل وابستگی میان ماژول‌ها
Layered / N-Tierتفکیک لایه ارائه، منطق و دادهساختار آشنا، مرز نقش‌هاوابستگی‌های لایه‌ای و عبورهای زیاد
Clean Architectureاستقلال هسته کسب‌وکار از فریم‌ورک و دیتابیستست‌پذیری و تغییرپذیریهزینه انتزاع و افزایش ساختار
Hexagonal / Ports & Adaptersپورت قراردادها را تعریف می‌کند و آداپتر به ابزارها متصل می‌شودتست مستقل و تعویض اتصال‌هاتعداد پورت و آداپتر زیاد
Microservicesسرویس‌های مستقل با مرز دامنه و استقرار جدامقیاس و استقرار جداگانهخطاهای شبکه و سازگاری توزیع‌شده
Event-Drivenاجزا با انتشار و مصرف رویداد واکنش نشان می‌دهندکاهش اتصال مستقیم بین خدماتردیابی جریان و تکرار پیام
SOAسرویس‌های سازمانی با قراردادهای مشخصاشتراک قابلیت‌ها بین سیستم‌هاپیچیدگی حاکمیت و واسط‌ها
Microkernel / Pluginهسته ثابت همراه افزونه‌های جداافزودن قابلیت بدون تغییر هستهمدیریت نسخه و وابستگی افزونه‌ها
Serverless / FaaSکد بر اساس رویداد با زیرساخت مدیریت‌شده اجرا می‌شودپرداخت متناسب با مصرفCold Start، محدودیت اجرا و Vendor Lock-in
CQRSمدل‌های خواندن و نوشتن را تفکیک می‌کندبهینه‌سازی مستقل دو مسیرهمگام‌سازی و سازگاری نهایی
Pipe-and-Filterداده از مراحل پردازش مستقل می‌گذردمناسب پردازش فایل و ETLسربار انتقال و مدیریت خطا

مثال معماری یک فروشگاه اینترنتی

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

shop/
  modules/
    catalog/       # products and prices
    orders/        # order lifecycle
    payments/      # payment contracts and integration
    inventory/     # stock reservations
  shared/
    observability/
    authentication/
  infrastructure/
    database/
    messaging/

یک جریان رویدادمحور چه شکلی است؟

OrderService -> OrderPlaced event -> Message Broker
                                      |-> Inventory reserves stock
                                      |-> Notification sends receipt
                                      |-> Analytics updates reports

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

با چه معیارهایی معماری را انتخاب کنیم؟

کیفیت مورد انتظارسوال عملی
Performanceدر زمان اوج خرید چه میزان تاخیر قابل قبول است؟
Availabilityقطع یک سرویس تا چه زمانی قابل تحمل است؟
Scalabilityکدام بخش باید مستقل مقیاس بگیرد؟
Securityداده پرداخت و اطلاعات کاربران چگونه محافظت می‌شوند؟
Maintainabilityتغییر قانون تخفیف چه بخش‌هایی را درگیر می‌کند؟
Deployabilityچند بار در هفته نسخه منتشر می‌شود؟
Observabilityخرابی یک سفارش چگونه از ابتدا تا انتها ردیابی می‌شود؟

مقایسه انتخاب‌های معمول

در مونولیت، مرز تراکنش دیتابیس اغلب ساده‌تر است. در میکروسرویس، هر سرویس می‌تواند مستقل مقیاس بگیرد، ولی ارتباط شبکه، نسخه‌بندی API، مانیتورینگ و سازگاری داده هزینه دارند. Clean Architecture و Hexagonal لزوماً جایگزین این دو نیستند. می‌توان یک مونولیت یا یک میکروسرویس را هم با اصول کلین یا هگزاگونال طراحی کرد.

هیچ معماری بهترین گزینه برای همه پروژه‌ها نیست

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

اصطلاحات فنی: سیستم دیزاین، نیازمندی فانکشنال، نیازمندی نان‌فانکشنال، معماری تمیز، معماری شش‌ضلعی، معماری مونولیتیک، میکروسرویس، معماری رویدادمحور.