مایکرو سرویس چیست و چه کاربردی دارد؟
معماری مایکرو سرویس (Microservice Architecture) یا میکروسرویس در حال حاضر یکی از محبوبترین سیستمهای نرمافزاری است به طور مفصل و کلی به پلتفرمهایی گفته میشود که نرمافزار بهصورت مستقل و با امکان توسعه جداگانه یا بخشبخش (جزیرهای) طراحی میگردد. به زبان ساده یعنی چند سرویس برای ایجاد یک سرویس اصلی یا همان پروژههای کوچک و در نهایت یک پروژه کامل و بزرگ. با مرور وبسایتهای مختلف حوزه تکنولوژی متوجه این موضوع شدیم که معماری Microservice توسط آنها به اشکال مختلف و از هم متفاوتی ترجمه شده است و در نهایت بیانی که از این تکنولوژی داریم این است که میتوان از آن بهعنوان یک روش متمایز و خاص برای ساخت ماژولهای تک عملکردی استفاده کرد.
رابطها و عملیاتها در این سیستم تعریف میشوند و سپس سبب میگردد که یک پروژه بزرگ، بدون این که کدنویسیهای نامرتب، سخت و درهمریخته داشته باشد طراحی شده و امکان رفع باگ و مشکلات نرمافزاری آن نیز وجود داشته باشد. این روند مورداستفاده در سالهای اخیر مدتی است که به محبوبیت زیادی دستیافته و شرکتهای بزرگ مانند فیسبوک، اوبر، آمازون و… نیز از آن استفاده میکنند. در خصوص ارتباط معماری میکروسرویس در توسعه نرمافزاری و بخصوص حوزه وب در ادامه بیشتر توضیح خواهیم داد. در اصل منظور در این معماری تقسیم کردن وظایف مجزا برای بخشهای مختلف یک نرمافزار است. هر بخش وظیفه منحصر به خودش را انجام میدهد و در نهایت هدف کل بخشها اجرای صحیح نرمافزار است.
بزرگترین استفادهکنندگان معماری مایکرو سرویس
از قدیم میگویند وقتی میخواهید یک ابزار و تکنولوژی جدید را به مردم معرفی کنید، به بزرگانی اشاره کنید که به سمت آن آمدهاند. این مسئله در مورد نرمافزار و توسعه اپلیکیشن نیز صدق میکنند. وقتی برای اولینبار از کاتلین برای طراحی اپلیکیشن اندروید استفاده شد. مردم نسبت به آن بیاعتماد بودند. اما پس از این که مشخص گردید شرکت گوگل بهصورت مستقیم آن را حمایت میکند، این سیستم بهمرور حتی در ایران نیز به محبوبیت زیادی دستیافت.
معماری مایکرو سرویس در حال حاضر توسط شرکتهای بزرگ eBay، نتفلیکس، پی پال، توییتر، آمازون، فیسبوک و سایر شرکتهای بزرگ و ترند حوزه فناوری استفاده میشود. برخلاف سیستمهای قدیمی که وقتی شما قسمتی از کد توسعه یک نرمافزار را تغییر میدادید، حالا با استفاده از معماری مایکرو سرویس میتوانید بهراحتی کدها را مقیاسپذیر کنید. مثل خانهای که قصد ساخت آن را دارید و وقتی شروع به کار میکنید باقی بخشهای آن نیز ممکن است تحتتأثیر قرار بگیرند و بلااستفاده شوند، در واقع این معماری سبب میشود که با ایجاد تغییرات نرمافزار شما دچار مشکلات جدی نشود. کل سیستم تحتتأثیر قرار نمیگیرد و نرمافزارها به پکت های کوچک تقسیم میشوند که در نهایت عملکرد یکسانی را ارائه میدهند. این بحث در واقع همان تقسیمبندیکردن نرمافزار به سرویسهای کوچکتر، سبکتر، مستقلتر و قابل مدیریت از هم است.
مزایای استفاده از معماری مایکرو سرویس
تصور کنید که یک بخش در سایت خود تحت عنوان آپلود سنتر ایجاد میکنید. برخلاف معماریهای قدیمی مانند مونولیتیک شما میتوانید بهراحتی یک اپلیکیشن را با اجزای جدا از هم طراحی کنید. در واقع MVC در طراحی و توسعه نرمافزار ما مورداستفاده قرار نمیگیرد. بلکه شما میتوانید همین آپلود سنتر را به قسمتهای: پایگاهداده، سیستم ورود و ثبتنام، آپلود با عضویت و… تقسیم کنید. در نهایت اگر در پروژه دیگری نیازی به این بخش داشتید آن را کپی و راحت در پروژه بعدی استفاده کنید. اینطور نیست که صرفاً این آپلود سنتر در همین پروژه اجرا شود و با استفاده از آن در یک بخش مجزا از کار بیفتد و یا شما نتوانید بههرحال آن را جدا کنید.
استفاده از چند زبان توسعه
مزیت بعدی که در مورد معماری مایکرو سرویس وجود دارد این است که شما میتوانید در هر بخش از پروژه از یک زبان برنامهنویسی و فناوری توسعه استفاده کنید. اجازه دهید این مورد را نیز با مثال به شما توضیح دهیم، به طبع پایتون زبان قدرتمند و چند سکویی است که میتوان با استفاده از آن بخشهای مختلف یک پروژه را طراحی کرد، در توسعه وب، اپلیکیشن، علم و… مورداستفاده قرار میگیرد و کاربرد دارد. اما در تمامی شرایط و در یک پروژه گسترده نمیتواند گزینه فوقالعادهای باشد. تصور کنید که قصد طراحی یک موتور جستجو را دارید. مطمئن باشید که در این مورد شما صرفاً نمیتوانید با پایتون تمام کارها را انجام دهید. به زبانهایی مانند C++ و… نیز نیاز خواهید داشت.
امکان توسعه یا Scalable
معماری Microservice قابل توسعه خواهد بود. تصور کنید که یک وبسایت با استفاده از این معماری نرمافزاری راهاندازی کردهاید. پس از مدتی متوجه میشوید که نیاز به یک پایگاهداده سریعتر، بهینهتر، بزرگتر و قدرتمندتر دارید. درصورتیکه توسعه آن را آموخته باشید میتوانید بهراحتی سرور، دیتابیس و هر بخشی که نیاز است را ارتقاء دهید و نرمافزار خود را قدرتمندتر کنید. این مزیت بازمیگردد به همان ساختار جزیرهای و مستقل از هم که توسعه یک بخش سبب ازکارافتادن کل پروژه نمیشود.
مزیتهای کلیدی دیگر میکروسرویسها
بهطورکلی ترجیح دادیم بهصورت تیتروار در خصوص مزیتها و ویژگیهای مثبت میکروسرویسها نیز نکاتی را به شما شرح دهیم:
- معماری مایکرو سرویس به شما اجازه میدهد که بدون وابستگی به بخشهای مختلف نرمافزار آنها را تغییر دهید. چیزی شبیه به مفهوم تابع در برنامهنویسی است.
- میتوانید بخشهای مختلف یک پروژه سایت یا هر چیز دیگر مانند پرداخت، ورود به سیستم، ثبتنام و… را از هم جدا کنید تا در صورت نیاز به ارتقاءآن ها را از هم متمایز کنید.
- درک سادهتری دارد و توسعه دهندگان بعدی پروژه میتوانند آن را بفهمند.
- زمانی که بخش خاصی از پروژه و کد شما از کار افتاد، میتوانید آن را ایزولهسازی کنید و کل پروژه شما اصطلاحاً داون نشود.
- بدون این که خطری برای پروژه شما ایجاد شود، آن را تغییر دهید، توسعه دهید و پیشرفت کنید! معماری Microservice منعطف است.
ارتباط بین میکروسرویسها و پروژههای بزرگ
در ادامه در خصوص ارتباط بین میکروسرویسها و دلیل استفاده از آن در پروژههای بزرگ توضیح خواهیم داد. تمامی نرمافزارها و بخشهایی که در معماری مایکرو سرویس مورداستفاده قرار میگیرند بهصورت مستقل قابلاجرا هستند. میتوان روی آنها از تکنیکهای ذخیرهسازی متفاوتی استفاده کرد. ضمن این که شما میتوانید سیستمهایی طراحی کنید که توسعهپذیر و منعطف هستند. نیازی به تغییرات پویا دارند و در نهایت معماری مایکرو سرویس از طریق APIها عمل میکند.
RESTful نیز یک ساختار مهم و قابلاعتماد در توسعه نرمافزار است که میتوان از آن در اکوسیستم معماری Microservice استفاده کرد. ضمن این که با استفاده از APIها شما میتوانید بهراحتی درخواستهای کاربر را از طریق سرور پاسخ دهید و اعتبارسنجی جریان دادهها را نیز از طریق میکروسرویس به دست آورید.
همینطور در زمینه برنامهنویسی و توسعه نرم افزاری بخوانید: پردرآمد ترین زبانهای برنامه نویسی 2022 کدامند؟
شش ویژگی معماری مایکرو سرویس
در ادامه در خصوص ویژگیهای مایکرو سرویس صحبت میکنیم. بهطورکلی هیچ تعریف رسمی و دقیقی در مورد مایکرو سرویس وجود ندارد. نمیتوانیم بگوییم که یک مفهوم در ادامه به شما شرح میدهیم و پس از آن با حفظ کردن آن میتوانید در مواقعی که از شما سؤال میشود مایکرو سرویس چیست، به آن پاسخ دهید. هیچ مدل استانداردی نیز باری آن وجود ندارد و در هر سیستم، معماری و محیط ممکن است به یکشکل استفاده شود. اما میتوان انتظار داشت که تمام ویژگیهایی که در ادامه به آنها اشاره میکنیم در نهایت در یک پروژه مبتنی بر معماری مایکرو سرویس وجود دارد.
اجزای چندگانه – Multiple Components
یکی از مهمترین ویژگیهای مایکرو سرویس مربوط به اجزای چندگانه است. شما میتوانید بهراحتی برنامه خود را به چند سرویس جز به جز تقسیم کنید. بهطوریکه هرکدام از این سرویسها بهصورت مستقر اجرا، بهینهسازی و در نهایت بدون مشکل برای یکپارچگی برنامه، آن را مجدداً اجرا کنند. در نتیجه ممکن است شما مجبور باشید بخشی از برنامه خود را تغییر دهید. البته این مسئله معایبی نیز دارد. باعث میشود که مشکل در توزیع تسکها در مؤلفههای برنامه خود را داشته باشید.
ساخته شده برای تجارتها
از جمله ویژگیهای مایکرو سرویس، موضوع ساختهشدن برای تجارتها و بیزینسهای بزرگ است. سبک مایکرو سرویس به این صورت است که میتوان روی آن تیمهای متمرکز را برای توسعه یک نرمافزار استخدام کرد. میتوان رابط کاربری، پایگاهداده، لایههای فناوری، سمت سرور و… را به چند تیم محول کرد تا آنها پروژه را جداگانه بنویسند و در نهایت به همپیوند بزنند. همانطور که مدیرعامل آمازون در مورد این پروژهها گفته است. شما میتوانید از هم جدا آن را بسازید و در نهایت در یک واحد آن را اجرا کنید. مثل پازلی که هر تیم مسئول ساخت یک بخش آن است. در نهایت تکههای بزرگ پازل که مشخص هستند کنار هم قرار میگیرند و پروژه تکمیل میشود.
امکان مسیریابی آسان
معماری مایکرو سرویس یک مزیت بزرگ و کلیدی دیگر هم دارد. بهراحتی میتوان در مسیریابی با سرعت بالا عملکرد. برخلاف روشهای دیگر توسعه و بخصوص معماری MVC اینگونه پروژهها پیچیدگی توسعه ندارند. همه چیز بر پایه قانون طراحی شده است و در نهایت میتوان آن را با ایستگاه اتوبوسی مقایسه کرد که مسیر مشخص دارد و از خط خودش عبور میکند در مقایسه با اتوبوسهایی که در یک مسیر نامعین هستند و ممکن است گاهی از مسیر خود منحرف شوند. برای بررسی بهتر این مسئله اتوبوسهای واحد تهران را با اتوبوسهای مستقل دیگر مقایسه کنید که در نهایت مجبور هستند در ترافیک بمانند.
معماری مایکرو سرویس غیرمتمرکز است
حاکمیت و مدیریت غیرمتمرکز از جمله اصلیترین ویژگیهای مایکرو سرویس است. در واقع بر پایه آن شما میتوانید بهراحتی پایگاه داد خود را پس از مدتی عوض کنید. بخشی از آن را از پروژه جدا کرده و بهینه کنید. دستور دهی به دیتابیس را در هر بخش متمرکز کنید. اگر یک وب اپلیکیشن طراحی کردهاید، آن را از دیتابیس سایت متمایز سازید. بدون این که نیاز باشد کل پروژه شما از اول نوشته شود و یا این که دستور دهی و دریافت داده از پایگاهداده را عوض کنید. مثل یک نرمافزار که رو فلش مموری اجرا میشود و نیازی نیست با هر بار جداکردن انتظار ازدستدادن برنامه را داشته باشید و یا این که بخواهید آن را بازهم نصب کنید. ساختار معماری Microservice سبب رفع مشکل بههمریختگی پروژه در صورت کارکردن چند تیم روی آن میشود.
مقاوم در برابر خطا
از جمله ویژگیهای مایکرو سرویس در پروژههای بزرگ این است که شما میتوانید برای پاسخدادن به یک کاربر، از چند سرور استفاده کنید. تصور کنید که سرور اول قادر به پاسخگویی نیست. مشکلی که امروزه بسیاری از سایتهای پربازدید با آن روبرو هستند. در نهایت شما میتوانید تأمینکننده داده دیگری را رزرو کنید تا در صورت بروز هرگونه مشکل بهآسانی مقادیر موردنیاز را به کاربر بازگرداند.
تکاملپذیر بودن
این موضوع نیز در معماری Microservice وجود دارد که میتوان آن را یک ساختار تکاملپذیر معرفی نمود. تصور کنید پروژهای ایجاد کردهاید که به هر دلیل هنوز علم توسعه آن را ندارید، وقتش را ندارید و یا این که نمیخواهید به هر دلیل دیگر آن را انجام دهید. میتوانید از مسئله تکاملپذیر بودن استفاده کنید. به این صورت که پروژه شما مثل یکخانه که طبقه دوم آن ساخته نشده است باقیمانده و در نهایت هر زمان که نیاز داشتید، مجدداً میتوانید بر اساس معماری Microservice آن را کامل کنید.
مثالی از معماری Microservice در کدنویسی
در ادامه در خصوص معماری Microservice و نحوه تأثیر آن روی مسئله یکپارچهسازی کدها صحبت میکنیم. در این مورد شما میتوانید بهراحتی و بدون حذف کد از برنامه، به طور مؤثر آن را ساختاردهی کنید. برای انجام این کار لازم است که نخست اقداماتی را انجام دهید و دادههای ورودی و خروجی را متمایز کنید. کد زیر دقیقاً این مفهوم را در زبان ساده و محبوب روبی به شما توضیح میدهد. صرفاً بهتر است به ورودی و خروجیهای دریافتی و نحوه ساختاردهی کدها دقت کنید.
کدهای روبی:
# A class to model a core transaction and execute it
class Job
def initialize
@status = 'Queued'
end
def do_useful_work
....
@status = 'Finished'
end
def finished?
return @status == 'Finished'
end
def ready?
return @status == 'Queued'
end
end
اگر بخواهیم آن را بر مبنای مایکرو بنویسیم اینگونه خواهد شد:
# Service to do useful work and modify a status
class JobService
def do_useful_work(job_status)
....
job_status.finish!
return job_status
end
end
# A model of our Job's status
class JobStatus
def initialize
@status = 'Queued'
end
def finished?
return @status == 'Finished'
end
def ready?
return @status == 'Queued'
end
def finish!
@status = 'Finished'
end
end
میبینید که ما در طراحی دو کلاس را از هم متمایز کردهایم. یکی از آنها دادهها را مدلسازی میکند و دیگری عملیات را انجام میدهد. مثل مهم این است که کلاس JobService در پروژه ما استفاده کمی دارد یا اصلاً وجود ندارد. استفاده از این ساختار به شما اجازه میدهد که از روش جایگزینی در برنامهنویسی استفاده کنید و کد موجود را مقیاسپذیر کنید. البته در این مورد بهتر است که مطالعه بیشتری در خصوص معماری Microservice داشته باشید.
در تصویر زیر شما یک ششضلعی را مشاهده میکنید که در آن هسته نرمافزار در دسترس است و برای هرکدام از وظایف خود از یکی از ریز برنامهها یا ساختارهای مستقل استفاده میکند. مثلاً برای نمایش UI و لایه آن یک درخواست به یکتکه کوچک از برنامه میدهد. هر زمان که نیاز باشد، شما میتوانید بهراحتی این لایه را تغییر دهید. بدون این که لازم باشد کل پروژه خود را دچار دگرگون کنید. مثلاً اگر از رابط کاربری سایتتان خوشتان نمیآید، لازم نیست که همه چیز را به هم بریزید و ساختمان داده را از پی خراب کنید. صرفاً وارد باکس لایه رابط کاربری شوید و یا آن را به توسعهدهنده بسپارید.
چه زمانی از معماری مایکرو سرویس استفاده کنیم؟
معمولاً برنامهنویسها، مدیران پروژهها و توسعه دهندگان این سؤال در ذهنشان مطرح میشود که چه زمانی باید از Microservice Architecture استفاده کنند. در این مورد ابتدا باید چند موضوع مهم را در نظر داشته باشید که ما به آنها اشاره خواهیم کرد.
- زمانی که توسعه روی پروژه شما توسط چند برنامهنویس انجام میشود و آنها نمیتوانند در یکزمان و یک مکان واحد روی پروژه کار کنند. در واقع اگر دولوپرهای یک شرکت بهصورت دورکار یک پروژه نسبتاً بزرگ را انجام دهند در معماریهای دیگر مشکلات ناهماهنگی به وجود میآید. شما میتوانید بعداً این کدها را به هم متصل کنید و پروژه خود را بهراحتی اجرا کنید.
- Microservice Architecture مناسب برای پروژههایی است که نیاز به توسعه بهصورت جزئی دارند. قطعاً در دیگر معماریها شما باید کل پروژه را تغییر دهید و این هزینه زیادی را برای شما به بار مینشاند. در این حالت و استفاده از این معماری اصلاً نیازی به ارتقاء کل پروژه نیست.
- اگر سورس کد شما آنقدر بزرگ و پیچیده است که اجرای آن روی IDE و محیط توسعه سخت است، میتوانید از معماری مایکرو سرویس استفاده کنید. گاهی ایمپورت کردن پروژهها به نرمافزارهای طراحی ممکن است بیش از یک ربع به طول بیانجامد که میتوانید از این حالت استفاده کرده و صرفاً یک بخش از کد خود را فراخوانی کنید. بیلد کردن در برخی از پروژهها خود زمان بر است و این نمیتواند سبب شود عکسالعمل شما سریعتر انجام گردد.
مثالی ملموس از Microservice
تصور کنید که شما یک شبکه اجتماعی بزرگ ایجاد کردهاید. این شبکه دارای بخشهایی مانند سیستم مبادله بانکی، احراز هویت، ایجاد زیرساخت و همینطور اپلیکیشن تحت وب و نرمافزار موبایل است. زمانی که کاربر تصمیم میگیرد رمز عبور خود را در یکی از این سیستمها عوض کند. اگر این پروژه بهصورت MVC طراحی شده باشد قطعاً شما با دردسر بزرگی بهعنوان توسعهدهنده روبرو میشوید.
در نتیجه لازم است که سرویسها با هم ارتباط غیرمتمرکز داشته باشند، یعنی هر زمان کاربر در نرمافزار موبایل رمز عبور خود را تغییر داد، این رمز در کل سیستم عوض شود و نیازی به اجرای مجدد دستورات اضافه و فشار به سرور نیز وجود نداشته باشد. مسئله همان سینک کردن یا بهاصطلاح پارسی سینک کردن در معماری مایکرو سرویس است که شاید کمتر در وب فارسی به آن اشاره شده و ما لازم دانستیم در مورد این مزیت کلیدی صحبت کنیم. به طبع سایتهای فروشگاهی، سیستمهای پرداخت، شرکتهای هواپیمایی و… به این سیستم نیاز دارند. هر چه پروژه بزرگتر، پیچیدهتر و گستردهتر باشد قطعاً لازم است که از این ویژگی در کل ساختار خود استفاده کند تا پس از مدتی معماری آن به هر دلیل دچار مشکل نشود.
منبع: smartbear.com