قسمت دوم سری «مایکروسرویس و DDD برای تیم‌های کوچیک؟»

قسمت دوم سری «مایکروسرویس و DDD برای تیم‌های کوچیک؟»

✅ خواستگاه‌ و قصه‌ی شکل‌گیری مایکروسرویس (بخش ۱)


مثل دو قسمت قبل، هدفم اینه که خواستگاه مایکروسرویس رو مرور کنم، تا بدونیم آیا «مسئله‌ی مشترک» باهاش داریم یا نه!


خلق و ترویج مایکروسرویس رو نمی‌شه به یک نفر خاص نسبت داد، بلکه یه «جریان صنعتی» بود که با ایده‌ها و نوشته‌های فالر و جیمز لوئیس پررنگ شد، بعدتر با تجربه‌های نتفلیکس و آمازون عملی شد، و سم نیومن اون رو با «راهنمای مهاجرت» همراه کرد. حوالی ۲۰۱۳–۲۰۱۶، هم‌زمان با بلوغ DevOps، کانتینرها و CI/CD تبدیل به تب داغ صنعت شد و خواستگاهش هم عمدتا شرکت‌های بزرگی بود که پلتفرم دیجیتال‌ بومی‌ای داشتن که توسط تیم‌های چندمهارته توسعه داده می‌شد و نیاز به تغییرات مداوم، مقیاس‌پذیری و تاب‌آوری بالا هم بینشون خصیصه مشترک بود.


یعنی شرکت‌های بزرگ تکنولوژی مثل آمازون، نتفلیکس و گوگل توی مسیر رشد سریع و بزرگ‌شدن تیم‌های مهندسی‌شون، با مشکلات مشابهی در معماری Monolith مواجه بودن و به راه‌حل‌های مشابهی رسیدن.

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


❓مسئله‌ی اصلی چی بود؟

🔤 استقلال تیمی برای تحویل سریع‌تر (کاهش وابستگی‌های سفت‌وسخت بین تیم‌ها).

🔤 مقیاس‌پذیری ناهمگن.

🔤 تاب‌آوری و تحمل خطا (خرابی یک بخش، کل سیستم رو نخوابونه).

🔤 پیچیدگی سازمانی (ده‌ها/صدها تیم، دامنه‌های متعدد، خطوط توسعه موازی).


به بیان ساده‌تر، مسئله‌ی اصلی، تنگناهای معماری Monolith در مقیاس بزرگ؛ یعنی کندی توسعه، سختی در اعمال تکنولوژی‌های جدید، ریسک بالای Deployment و مشکلات مقیاس‌پذیری (Scalability) بود.


💡 پاسخ مایکروسرویس چی بود؟ شکستن اپلیکیشن یکپارچه به مجموعه‌ای از سرویس‌های کوچیک، مستقل، و با ارتباطات سبک؛ با مفاهیمی مثل:


➖استقلال در استقرار: هر سرویس یک واحد مستقل محسوب می‌شه که می‌تونه بدون نیاز به هماهنگی با سایر سرویس‌ها، توسعه داده بشه، تست و نهایتا منتشر بشه. این ویزگی برای سازمانی با ده‌ها یا صدها تیم که هرکدوم می‌خوان با سرعت حرکت کنن، نعمته. دیگر لازم نیست تیم «پرداخت» منتظر تیم «انبارداری» بمونه تا با هم محصول رو منتشر کنن.


➖سازماندهی حول قابلیت‌های کسب‌وکار: این خیلی شبیه به مفهوم Bounded Context در DDD است که توی پست قبل اشاره کردم. هر سرویس مسئول یک قابلیت کامل بیزنسیه (مثلا مدیریت کاربرها، سیستم پیشنهاددهی، یا پردازش پرداخت). این یعنی تیم‌ها مالکیت کامل یک بخش از بیزنس رو عهده می‌گیرن.


➖حاکمیت و داده‌های غیرمتمرکز: هر تیم می‌تونه تکنولوژی (زبان برنامه‌نویسی، دیتابیس و...) مناسب برای سرویس خودش رو انتخاب کنه. سرویس «جستجو» می‌تونه از Elasticsearch استفاده کنه در حالی که سرویس «مالی» از PostgreSQL استفاده کنه. این انعطاف، به تیم‌ها اجازه می‌ده بهترین ابزار رو برای حل مسئله‌‌شون به کار بگیرن، اما در عین حال پیچیدگی نگهداری و هماهنگی رو «به شدت» بالا می‌بره.


➖اتوماسیون زیرساخت: مایکروسرویس بدون فرهنگ DevOps و ابزارهای CI/CD تقریبا غیرممکنه. وقتی به جای یک اپلیکیشن، ده‌ها یا صدها سرویس برای مدیریت، مانیتورینگ و استقرار دارید، تنها راه نجات، اتوماسیون کامل فرآیندهاست.


🔤 «یک سرویس = یک قابلیتِ واضح + تیمِ مالک + داده/قراردادِ مستقل + چرخه‌ی انتشارِ مستقل»


♻️ پیش‌فرض‌های محیطی (زمین بازی)

مایکروسرویس نه صرفاً معماریِ کُد، که طراحی سازمانیه (قانون کانوی). بدون این پیش‌فرض‌ها، نتیجه معمولاً «مونولیتِ توزیع‌شده» است:

*️⃣زیرساختِ خودکار: IaC، محیط‌های چندگانه، انتشار بی‌درد (Blue/Green, Canary).

*️⃣پایپ‌لاین‌های CI/CD بالغ: تست خودکار، کیفیت پایدار، Rollback ساده.

*️⃣قابلیت Observability: لاگ همبسته، تریس توزیع‌شده، متریک، آلارم.

*️⃣قراردادهای پایدار: نسخه‌بندی API/اسکیما، سازگاری تدریجی، Consumer-Driven Contracts.

*️⃣مالکیت داده: تا حد امکان دیتابیسِ اختصاصی/طرح تجمیع رویدادها؛ پرهیز از «Shared DB».

*️⃣نضباط توزیعی: مدیریت شکست شبکه، Retry/Timeout/Idempotency، Backpressure.

*️⃣فرهنگ تیمی: تیم‌های کوچکِ end-to-end با ریشه‌ی DevOps.


ادامه دارد...