1. مقدمه و مرور کلی
این محتوا برگرفته از یک قسمت از پادکست رادیو مهندسی نرمافزار (قسمت ۲۱۳) است که شامل گفتوگویی بین یوهانس تونز و جیمز لوئیس در مورد موضوع میکروسرویسها میباشد. این گفتوگو به بررسی تعریف، انگیزهها و ملاحظات عملی پیرامون این سبک معماری میپردازد که در اوایل سال ۲۰۱۵ به عنوان پاسخی به چالشهای نگهداری برنامههای یکپارچه و بزرگ، در حال جلب توجه قابل توجهی بود.
2. تعریف میکروسرویسها
یک میکروسرویس به عنوان یک مؤلفه کوچک و متمرکز برنامه در نظر گرفته میشود.
2.1 ویژگیهای اصلی
بر اساس این گفتوگو، یک میکروسرویس دارای چندین ویژگی کلیدی است:
- استقرار مستقل: میتواند بدون نیاز به ایجاد تغییر در سایر سرویسها مستقر شود.
- مقیاسپذیری مستقل: میتواند بر اساس بار کاری خاص خود به صورت افقی یا عمودی مقیاسپذیر شود.
- آزمونپذیری مستقل: میتواند به صورت مجزا اعتبارسنجی شود.
- مسئولیت واحد: یک دلیل اصلی برای تغییر یا جایگزینی دارد. یک وظیفه منسجم را انجام میدهد و به راحتی قابل درک است.
2.2 نمونههایی از مسئولیت واحد
«کار واحد»ای که یک میکروسرویس انجام میدهد میتواند عملکردی یا فراعملکردی (غیرعملکردی) باشد:
- عملکردی: ارائه یک منبع دامنه خاص (مانند سرویس کاربر، سرویس مقاله، سرویس محاسبه ریسک در بیمه).
- فراعملکردی: یک پردازنده صف که یک پیام را میخواند، منطق کسبوکار را اعمال میکند و آن را منتقل میکند. مسئولیت یک نیازمندی غیرعملکردی خاص مانند کش یا ثبت رویداد.
3. ظهور میکروسرویسها
3.1 محرکهای محبوبیت
محبوبیت میکروسرویسها به یک نقطه درد صنعتی گسترده نسبت داده میشود: برنامه یکپارچه غیرقابل مدیریت. سازمانها با برنامههایی مواجه هستند که طی ۵ تا ۱۰ سال رشد کردهاند و تغییر، استقرار به عنوان SaaS یا مقیاسپذیری مؤثر در ابر برای آنها بسیار دشوار شده است.
3.2 رسیدگی به بدهی فنی
میکروسرویسها به عنوان راهحلی برای تقسیم این برنامههای یکپارچه به مؤلفههای کوچکتر و همکاریکننده که خارج از فرآیند اجرا میشوند، ظهور کردند. این رویکرد که توسط شرکتهایی مانند نتفلیکس در مقیاس بزرگ نشان داده شده است، امکان نگهداری، مقیاسپذیری و جایگزینی مستقل را فراهم میکند. محرک اصلی، نیاز به تحویل سریعتر نرمافزار و بهرهگیری از روشهایی مانند تحویل مستمر است که توسط معماریهای یکپارچه مختل میشوند.
4. الگوهای پذیرش و پیادهسازی
4.1 پروژه جدید در مقابل پروژه موجود
یک سؤال کلیدی این است که آیا یک پروژه جدید را با میکروسرویسها شروع کنیم (پروژه جدید) یا یک برنامه یکپارچه موجود را به آنها بازسازی کنیم (پروژه موجود). این گفتوگو خاطرنشان میکند که به طور تجربی، اکثر سازمانها با یک برنامه یکپارچه شروع میکنند و بعداً آن را بازسازی میکنند و با چالش شناسایی زمینههای محدود و درزها در پایگاه کد موجود مواجه میشوند.
4.2 پیچیدگی عملیاتی
بخش پادکست اشاره میکند که محدودیت فضا مانع از بحث کامل در مورد پیچیدگی عملیاتی و تأثیر آن بر DevOps شد. این بدان معناست که در حالی که میکروسرویسها مشکلات توسعه و مقیاسپذیری را حل میکنند، چالشهای جدیدی در نظارت، هماهنگی استقرار و قابلیت اطمینان شبکه ایجاد میکنند.
5. بینشهای کلیدی و تحلیل
بینش اصلی
میکروسرویسها یک فناوری جادویی و قطعی نیستند؛ آنها پاسخی سازمانی و اقتصادی به گلوگاه توسعه یکپارچه هستند. ارزش واقعی پیشنهادی، همانطور که مثال نتفلیکس اشاره میکند، امکانپذیر ساختن جریانهای موازی و مستقل تحویل ارزش است. این معماری مستقیماً هزینههای هماهنگی و اصطکاک استقرار را هدف قرار میدهد که تیمهای بزرگ کار بر روی یک پایگاه کد واحد را آزار میدهد، مشکلی که توسط گفته ملوین کانوی صورتبندی شده است که «سازمانهایی که سیستمها را طراحی میکنند... محدود به تولید طرحهایی هستند که کپیهایی از ساختارهای ارتباطی این سازمانها هستند.» میکروسرویسها با طراحی سیستمهایی که ساختارهای ارتباطی مطلوب را تحمیل میکنند، سعی در معکوس کردن این امر دارند.
جریان منطقی
روایت از یک زنجیره علت و معلول قانعکننده پیروی میکند: (۱) برنامههای یکپارچه بدهی فنی را انباشته میکنند و از تغییر فلج میشوند. (۲) کسبوکار تقاضای مقیاسپذیری ابری و تحویل مستمر دارد. (۳) معماری یکپارچه به دلیل پیوندگی ذاتی آن، اساساً با این اهداف ناسازگار است. (۴) راهحل، شکستن برنامه یکپارچه در امتداد زمینههای محدود و ایجاد واحدهای مستقرپذیر مستقل است. این منطق درست است اما از پیچیدگی عظیم میانی — «چگونگی» شکست — چشمپوشی میکند.
نقاط قوت و ضعف
نقاط قوت: تمرکز بر قابلیت استقرار مستقل به عنوان ویژگی اصلی، کاملاً درست است. این اهرمی است که خودمختاری تیم و چرخههای انتشار سریعتر را باز میکند. ارتباط با قانون کانوی و CQRS (که به عنوان موضوعات حذف شده ذکر شدهاند) نشاندهنده آگاهی از الگوهای عمیقتر فنی-اجتماعی در حال بازی است.
نقاط ضعف: دیدگاه سال ۲۰۱۵ به طور محسوسی در مورد سهولت تعریف «مسئولیت واحد» خوشبینانه است. تجربه بعدی صنعت نشان داده است که این سختترین بخش است — نفرین مرزهای سرویس بدتعریف شده که منجر به یکپارچههای توزیعشده میشود. متن همچنین به طور خطرناکی سربار عملیاتی را کماهمیت جلوه میدهد. همانطور که مقاله بنیادی فاولر بعداً توضیح داد، شما پیچیدگی توسعه را با پیچیدگی عملیات معامله میکنید. اشاره به داکر به عنوان «یک قطعه محبوب» یک تصویر تاریخی است؛ اکوسیستم کانتینری، عامل عملیاتی گمشدهای بود که میکروسرویسها را در مقیاس بزرگ به صورت عملی امکانپذیر کرد.
بینشهای عملی
برای رهبران: به دلیل مد بودن، با میکروسرویسها شروع نکنید. با اندازهگیری زمان تأخیر برای تغییرات و فرکانس استقرار خود شروع کنید. اگر به دلیل هماهنگی پایگاه کد ضعیف هستند، میکروسرویسها را در نظر بگیرید. برای معماران: ابزار طراحی اصلی، یک چکلیست فناوری نیست، بلکه یک نقشه زمینه طراحی مبتنی بر دامنه (DDD) است. مرزها را بر اساس قابلیتهای کسبوکار، نه لایههای فنی، تعریف کنید. برای تیمها: از ابتدا در مهندسی پلتفرم سرمایهگذاری کنید — استقرار خودکار، کشف سرویس و قابلیت مشاهده، پساندیش نیستند؛ آنها پایه و اساس هستند. مسیر پیشنهادی — بازسازی از یک برنامه یکپارچه — هنوز عاقلانهترین است. از الگوی انجیر خفهکن برای جایگزینی تدریجی بخشهایی از برنامه یکپارچه با سرویسها استفاده کنید، زیرا این امر ریسک را مدیریت میکند و امکان یادگیری را فراهم میکند.
6. چارچوب فنی و مدلهای ریاضی
در حالی که پادکست گفتوگویی است، اصول زیربنایی را میتوان صوری کرد. یک مدل کلیدی، رابطه بین اندازه تیم (N)، مسیرهای ارتباطی و پیوندگی معماری است.
در یک معماری یکپارچه با N تیم، مسیرهای ارتباطی بالقوه با $O(N^2)$ مقیاس مییابند، زیرا تغییرات در یک ماژول میتواند بر بسیاری دیگر تأثیر بگذارد. این امر سربار هماهنگی ایجاد میکند. میکروسرویسها با اعمال زمینههای محدود و APIها هدف کاهش این امر را دارند. هدف این است که هزینه ارتباط بین سرویسها، $C_{comm}$، از طریق فراخوانیهای شبکه به صراحت بالا برود، در نتیجه مدولاریتی قوی درون یک سرویس تشویق شود که هزینه تغییر، $C_{internal}$، در آن پایین است.
یک مدل ساده شده برای احتمال انتشار تغییر ($P_{prop}$) میتواند به این صورت باشد:
$P_{prop} \approx \frac{C_{comm}}{C_{comm} + C_{internal}}$
جایی که یک معماری میکروسرویس خوب طراحی شده، $P_{prop}$ را برای تغییرات نامرتبط با تبدیل کردن $C_{comm}$ (تأخیر شبکه، نسخهبندی API) به عامل غالب برای تغییرات فرامرزی، به حداقل میرساند.
7. نتایج تجربی و مطالعات موردی
پادکست نتفلیکس را به عنوان یک مطالعه موردی اولیه ذکر میکند. تا سال ۲۰۱۵، نتفلیکس به طور مشهوری بکاند یکپارچه خود را به صدها میکروسرویس تجزیه کرده بود که امکان موارد زیر را فراهم میکرد:
- مقیاسپذیری مستقل: سرویسهایی مانند توصیه فیلم یا صورتحساب میتوانستند در زمان اوج بار به طور مستقل مقیاسپذیر شوند.
- نوآوری سریع: تیمها میتوانستند سرویسهای خود را چندین بار در روز بدون هماهنگی کامل استک مستقر کنند.
- ناهمگونی فناوری: سرویسهای مختلف میتوانستند به زبانی نوشته شوند که بهترین تناسب را با وظیفه آنها دارد (مانند جاوا، Node.js).
توضیح نمودار (فرضی): یک نمودار میلهای که یک برنامه یکپارچه را با یک معماری میکروسرویس در دو محور مقایسه میکند: (۱) فرکانس استقرار (استقرار/روز): برنامه یکپارچه یک میله پایین نشان میدهد (مثلاً ۰.۱)، میکروسرویسها یک میله بالا نشان میدهند (مثلاً ۵۰+). (۲) میانگین زمان بازیابی (MTTR) از یک خرابی: برنامه یکپارچه یک میله بالا نشان میدهد (مثلاً ۴ ساعت)، میکروسرویسها یک میله پایینتر نشان میدهند (مثلاً ۳۰ دقیقه)، زیرا خرابیها میتوانند به سرویسهای خاصی محدود شوند.
مطالعات بعدی، مانند آنهایی که در گزارشهای وضعیت DevOps ارجاع داده شدهاند، به طور آماری معماریهای مبتنی بر سرویس با پیوندگی ضعیف را با عملکرد تحویل نرمافزار بالاتر مرتبط دانستهاند.
8. چارچوب تحلیل: یک مثال عملی
سناریو: یک برنامه یکپارچه تجارت الکترونیک با بهروزرسانیها دست و پنجه نرم میکند. تغییرات ویژگی «پرداخت» نیاز به آزمون رگرسیون کامل دارد و با بهروزرسانیهای «کاتالوگ محصول» در تضاد است.
کاربرد چارچوب:
- شناسایی زمینههای محدود: با استفاده از طراحی مبتنی بر دامنه، دامنههای اصلی را شناسایی کنید: سفارشدهی، کاتالوگ، موجودی، مدیریت کاربر، پرداخت.
- تعریف مرزهای سرویس: برای هر زمینه یک میکروسرویس ایجاد کنید. سرویس سفارش مالک منطق پرداخت و دادههای سفارش است.
- ایجاد قراردادها: APIهای واضح تعریف کنید. سرویس سفارش، API
processPayment(orderId, amount)سرویس پرداخت و APIreserveStock(itemId, quantity)سرویس موجودی را فراخوانی خواهد کرد. - مالکیت داده: هر سرویس مالک پایگاه داده خود است. سرویس سفارش جدول «سفارشات» خود را دارد؛ به طور مستقیم از پایگاه داده موجودی پرس و جو نمیکند.
- استقرار و قابلیت مشاهده: هر سرویس کانتینریزه شده، به طور مستقل مستقر میشود و معیارها (تأخیر، نرخ خطا) را به یک داشبورد مرکزی ارسال میکند.
نتیجه: تیم پرداخت اکنون میتواند بهروزرسانیهای سرویس سفارش را بدون درگیر کردن تیمهای کاتالوگ یا موجودی مستقر کند که به طور قابل توجهی سربار هماهنگی را کاهش میدهد و فرکانس استقرار را افزایش میدهد.
9. کاربردهای آینده و جهتهای پژوهشی
تکامل میکروسرویسها فراتر از دیدگاه سال ۲۰۱۵ ادامه دارد:
- مشهای سرویس: فناوریهایی مانند Istio و Linkerd برای رسیدگی به نگرانیهای فرامرزی (امنیت، قابلیت مشاهده، مدیریت ترافیک) در لایه زیرساخت ظهور کردهاند که بار کد بر سرویسهای فردی را کاهش میدهند.
- سرورلس و FaaS: سرویسهای تابعمحور (مانند AWS Lambda) نمایانگر شکل افراطی میکروسرویسها هستند که پیچیدگی عملیاتی را کاملاً به ارائهدهنده ابر منتقل میکنند و امکان مقیاسپذیری حتی ریزدانهتر را فراهم میکنند.
- ادغام هوش مصنوعی/یادگیری ماشین: میکروسرویسها در حال تبدیل شدن به الگوی پذیرفته شده برای استقرار مدلهای ML به عنوان سرویسهای پیشبینی مستقل هستند که امکان آزمون A/B و تکرار سریع الگوریتمها را فراهم میکنند.
- رایانش لبه: استقرار میکروسرویسهای سبکوزن روی دستگاههای لبه برای پردازش کمتأخیر در سناریوهای اینترنت اشیا و تحلیلهای بلادرنگ.
- تمرکز پژوهشی: پژوهشهای آینده در ابزارهای تجزیه خودکار سرویس، پیشبینی هوشمند خطا در سیستمهای توزیعشده و تأیید صوری تعاملات در رقصهای سرویس مورد نیاز است.
10. منابع
- Lewis, J., & Fowler, M. (2014). Microservices. MartinFowler.com. Retrieved from https://martinfowler.com/articles/microservices.html
- Newman, S. (2015). Building Microservices. O'Reilly Media.
- Forsgren, N., Humble, J., & Kim, G. (2018). Accelerate: The Science of Lean Software and DevOps. IT Revolution Press.
- Conway, M. E. (1968). How Do Committees Invent? Datamation, 14(5), 28-31.
- Google Cloud. (2019). The 2019 Accelerate State of DevOps Report. DORA.
- Netflix Technology Blog. (Various). https://netflixtechblog.com/