در قسمت
قبل با مفهوم مایکرو سرویسها آشنا شدیم. سرویسهای کوچک و مجزایی که بصورت مستقل، قابلیت توسعه و استقرار دارند و در راستای انجام یک قابلیت کسب و کار در اختیار دیگران قرار میگیرند.
ویژگیهای یک مایکرو سرویس چیست؟
بعد از آشنایی با معماری مایکرو سرویسها میخواهیم با ویژگیهای آن آشنا شویم. البته باید به این نکته توجه داشت که همهی معماریهای مایکروسرویسها این ویژگیها را ندارند؛ ولی میتوان انتظار داشت اکثر آنها این ویژگیها را از خود به نمایش بگذارند.
Componentization via Services
تعریف ما از component، واحدی از نرم افزار میباشد که به تنهایی قابل جایگزینی و بهروز رسانی میباشد.
همانطور که گفته شد، مایکرو سرویسها یک نرم افزار را به سرویسهای (business component) کوچکتری تقسیم میکنند که به تنهایی قابل توسعه و استقرار میباشند. ما کتابخانهها را به عنوان component در نظر میگیریم که به نرم افزار ما پیوند خوردهاند و به وسیله فراخوانی توابع در پروسه نرم افزار قابل استفاده میباشند. در حالیکه سرویسها componentهایی هستند که خارج از پروسه نرم افزار ما میباشند و به وسیله مکانیزمهای ارتباطی مانند Web Service Request و Remote Procedure Call قابل دسترسی هستند.
در سیستم های یکپارچه که از چندین component تشکیل شدهاند و این componentها در جریان یک پروسه با هم در ارتباط هستند، اگر بخواهیم در یک component تغییر ایجاد کنیم، این تغییر نیازمند استقرار مجدد کل سیستم میباشد. در حالیکه در معماری مایکرسرویس، کافی است شما component (سرویس) ای را که تغییر کردهاست، دوباره مستقر کنید و سایر بخشهای سیستم از این تغییر تاثیر نمیپذیرند.
Technology Heterogeneity
یک سیستم را در نظر بگیرید که از همکاری چندین سرویس تشکیل شدهاست. ما میتوانیم تصمیم بگیریم که برای هر کدام از سرویسها از تکنولوژی متفاوتی استفاده کنیم. این امر به ما اجازه میدهد برای حل هر مشکل، از بهترین ابزار و تکنولوژی استفاده کنیم. این امر بر خلاف سیستمهایی که تنها باید از تکنولوژی بکار رفته در سیستم استفاده کنند، انعطاف پذیری سیستم را بسیار بالا میبرد.
برای روشن شدن موضوع فرض کنید میخواهیم در بخشی از سیستم، performance را افزایش دهیم. برای این امر میتوانیم از هر تکنولوژی که به ما کمک میکند، استفاده کنیم. برای نمونه در یک سیستم شبکه اجتماعی، میتوانیم اطلاعات مربوط به کاربران و ارتباطات آنها را در یک دیتابیس مبتنی بر گراف و اطلاعات مربوط به پستها و نظرات کاربران را در یک دیتابیس سندگرا ذخیره کنیم. به این ترتیب مشاهده میکنیم که وابستهی به تکنولوژی خاصی نمیباشیم و میتوانیم بر اساس نیاز خود، از تکنولوژی مورد نظر بهره ببریم.
مایکرو سرویسها به ما این اجازه را میدهند تا در انتخاب تکنولوژیها نهایت دقت را انجام دهیم و متوجه شویم که تکنولوژیهای جدید چگونه میتوانند به ما کمک کنند.
یکی از بزرگترین موانع در استفاده و انتخاب یک تکنولوژی جدید، ایجاد وابستگی سیستم به آن میباشد. در یک سیستم یکپارچه چنانچه قصد تغییر زبان مورد استفاده یا دیتابیس یا فریمورک مورد استفاده را داشته باشیم، سیستم هزینهی سنگینی را متحمل میشود. در حالیکه در مایکرو سرویسها میتوانیم این تغییرات را با کمترین هزینه انجام دهیم. البته باید توجه داشت که استفاده از تکنولوژی جدید چالشها و سربارهای خودش را دارد و انتخاب یک تکنولوژی جدید نیازمند بررسی کارشناسانه و دقیق میباشد.
Resilience
چنانچه یکی ازسرویسها دچار اشکال شود و این مسئله بصورت زنجیروار برای تمام سرویسها رخ ندهد، با جدا شدن آن سرویس، درروند کار سیستم خللی بوجود نمیآید و سیستم بدون کمترین مشکلی به ادامه کار خود میپردازد. یعنی محدوده یک سرویس، دیوار حائلی میشود تا سایر بخشها تاثیر نپذیرند. در سیستمهای یکپارچه چنانچه یک سرویس دچار اشکال شود، سایر بخشهای سیستم نیز غیر قابل استفاده میشوند. البته میتوان با نصب نسخههای متفاوتی بر روی ماشینهای متفاوت (Scale out)، تاثیر اینگونه اختلالات را تا حدودی کاهش داد. اما بوسیله مایکرو سرویسها میتوانیم سیستمهایی را بسازیم که قادرند با خطاهای بوجود آمده در سرویسها بهدرستی رفتار کنند؛ تا خللی در کار سیستم ایجاد نشود.
Scaling
فرض کنید در بخشی ازیک سیستم، دغدغه Performance بوجود میآید. چنانچه ما یک معماری یکپارچه را داشته باشیم، مجبوریم کل آن را scale کنیم. درحالیکه این مشکل تنها در بخش کوچکی از نرم افزار ایجاد شدهاست. اما اگرمعماری ما مایکرو سرویس باشد، فقط همان سرویس مربوطه را که بر روی آن دغدغه داریم، scale میکنیم و سایر بخشهای نرم افزار بدون نیاز به تغییر و بزرگ شدن، به کار خود ادامه میدهند.
Gilt یک خرده فروش آنلاین در صنعت مد میباشد که بخاطر مسائل Performance به معماری مایکروسرویسها روی آورد. آنها در سال 2007 با یک نرم افزار یکپارچه شروع به کار کردند. اما بعد از دوسال سیستم آنها قادر به مقابله با ترافیک سایت نبود. آنها با تقسیم بندی قسمتهای اصلی سیستم خود به مایکرو سرویسها، توانستند خیلی بهتر و موثرتر با ترافیک رسیده مقابله کنند و قابلیت دسترسی پذیری سیستم را افزایش دهند. در حال حاضر سیستم آنها از حدود 450 مایکرو سرویس تشکیل شده که هر کدام روی چندین ماشین مختلف در حال اجرا میباشند.
Ease of Deployment
تغییر حتی یک خط کد، در برنامهای که از چندین میلیون خط تشکیل شده است، ما را ملزم به استقرار مجدد کل سیستم و انتشار نسخه جدید میکند. این استقرار میتواند تاثیر و ریسک بالایی را داشته باشد و ما را مجبور به تغییرات بیشتر و انتشار نسخههای دیگر کند که این حجم زیاد تغییرات ممکن است به محصول ما ضربه بزند.
اما در مایکرو سرویسها یک تغییر کوچک، تمام سیستم را تحت تاثیر قرار نمیدهد. بلکه تنها تغییرات مربوط به سرویس مورد نظر میباشد که به صورت مستقل قابلیت استقرار را دارد و چنانچه سیستم دچار مشکل شود، منشاء تغییرات کاملا مشخصی میباشد و میتوان سریعتر سیستم را به وضعیت قابل اطمینان بازگرداند. این ویژگی یکی از مهمترین دلایلی میباشد که شرکتهایی مانند Netflix و Amazon به پیاده سازی این معماری روی آوردهاند.
Organizational Alignment
بسیاری از ما مشکلات مربوط به پروژههای بزرگ و تیمهای بزرگ را تجربه کردهایم و این مشکلات زمانیکه اعضای تیم بهصورت متمرکز در کنار هم نباشند، افزایش پیدا میکند. ما میدانیم که اگر یک تیم کوچک، بر روی قطعه کد کوچکتری کار کند، میتواند بسیار موثرتر باشد تا زمانیکه یک تیم بزرگ، درگیر یک کد بزرگ شود.
مایکرو سرویسها این امکان را به ما میدهند تا معماری خود را با ساختار سازمانی خود هم راستا کنیم و به ما کمک میکنند تا با تقسیم ساختار نرم افزار به بخشهای کوچکتر وایجاد تیمهای کوچکتر مختص هر بخش، بازدهی و تاثیر تیمها را در سازمان، افزایش دهیم.
Composability
یکی از ویژگیهای کلیدی که در سیستمهای توزیع شده و سرویس گرا به آن وعده داده میشود، قابلیت استفاده مجدد از functionalityهای سیستم میباشد. مایکرو سرویسها این امکان را برای ما فراهم میکنند تا functionality های سیستم، به روشهای مختلف و با اهداف گوناگونی مورد استفاده قرار گیرند. اینکه استفاده کنندگان نرمافزار ما چگونه از آن استفاده میکنند، برای ما مهم است. در حال حاضر ما باید درباره راههای مختلفی که میتوانند قابلیتهای سیستم را باهم ترکیب کنند تا در برنامههای وب، موبایل و یا ابزارهای پوشیدنی مورد استفاده قرار گیرند، فکر کنیم. در مایکرو سرویس تفکر ما این است که بخشهای مختلف سیستم خود را از هم جدا کنیم و این بخشها توسط استفاده کنندههای بیرونی قابل دسترسی باشند و با تغییر شرایط بتوانیم بخشهای گوناگونی را بسازیم.
Optimizing for Replaceability
اگر شما در یک سازمان متوسط و یا بزرگ، مشغول به کار باشید، ممکن است با یک سیستم بزرگ و قدیمی مواجه شده باشید که در گوشهای از سازمان در حال استفاده میباشد و هیچ کسی رغبت نزدیک شدن به آن و دست بردن در آن را ندارد و اگر کسی از شما بپرسد «چرا نمیتوان آن را تغییر داد؟» خواهید گفت این کار، بسیار پرریسک و پردردسر است.
با استفاده از معماری مایکروسرویس، هزینه این تغییرات به مراتب کمتر و تغییرات با ضریب اطمینان بالاتری انجام میشوند.