نیک آموز > وبلاگ > مهندسی نرم افزار > میکروسرویس چیست؟
میکروسرویس چیست؟

میکروسرویس چیست؟

نوشته شده توسط: علیرضا ارومند
تاریخ انتشار: ۰۵ مرداد ۱۳۹۸
آخرین بروزرسانی: 29 بهمن 1404
زمان مطالعه: 20 دقیقه
۴.۲
(۱۱)

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

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

فهرست محتوایی

تاریخچه میکروسرویس: دنیا قبل از میکروسرویس به چه صورت بود؟

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

ریشه‌ها

در دهه ۲۰۰۰، معماری SOA (Service-Oriented Architecture) مطرح شد که سیستم‌ها را به سرویس‌های مستقل تقسیم می‌کرد. با این حال، این سرویس‌ها اغلب بزرگ و پیچیده بودند و انعطاف‌پذیری لازم برای توسعه سریع را فراهم نمی‌کردند.

شکل‌گیری میکرو سرویس

اوایل دهه ۲۰۱۰، شرکت‌هایی مانند Netflix و Amazon برای حل مشکلات مقیاس‌پذیری و توسعه سریع، سیستم‌های یکپارچه خود را به مجموعه‌ای از سرویس‌های کوچک، مستقل و قابل استقرار جداگانه تقسیم کردند. در سال ۲۰۱۴، Martin Fowler و James Lewis با انتشار مقاله‌ای رسمی، اصطلاح «میکرو سرویس» را تثبیت و چارچوب فکری آن را توضیح دادند.

دلیل فراگیری

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

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

قسمت اول: میکروسرویس چیست؟

 

چالش‌ها و محدودیت‌های میکروسرویس

از قدیم گفتند: “هیچ ارزانی بی حکمت نیست” اگر بخواهیم به زبان برنامه نویسی ترجمه کنیم می‌شود “هیچ سادگی بدون محدودیت نیست.” هر نرم افزار و پروژه‌ای در صورتی که موفق بشود قطعا تمایل به رشد دارد و موفقیت بیشتر پروژه موجب رشد بیشتر پروژه خواهد شد. در نهایت بعد از مدتی پروژه کوچک و ساده ما تبدیل به هیولایی بزرگ و وحشتناک خواهد شد.

اما ممکن است به این فکر کنید که زیاد شدن حجم کدها در طول دوران توسعه نرم افزار و تغییرات آن چه مشکلی می‌تواند داشته باشد؟ در ادامه به چند مورد از این مشکلات خواهیم پرداخت.

مشکل اول: یچیدگی بیش از حد این برنامه‌ها 

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

در نتیجه این عدم توانایی شناخت درست و صحیح باعث می‌شود رفع خطاهای موجود یا اضافه کردن یک ویژگی جدید هم بسیار سخت و هم بسیار پیچیده باشد. نکته اصلی در این شرایط این است که با گذشت زمان این مشکل به شکل نمایی بیشتر و بیشتر می‌شود. هر چقدر فهم کد سخت‌تر بشود احتمال اشتباه بیشتر و احتمال پیدا کردن اشتباه‌ها کمتر و توان رفع آنها هم کمتر می‌شود، در نهایت به سورس کدی خواهیم رسید که اصطلاحا به اون big ball of mud می‌گوییم.

مشکل دوم: پایین آمدن سرعت توسعه نرم افزار

سورس کد حجیم می‌تواند باعث پایین آمدن سرعت توسعه نرم افزار بشود. هر وقت تصمیم به بازکردن پروژه بگیرید دقایق زیادی طول خواهد کشید تا IDE شما باز بشود و آماده به کار باشد. در کنار این شرایط احتمالا این سیستم عظیم بهره‌وری کل بستر شما رو هم پایین خواهد آورد.

مشکل سوم: عدم توانایی در انتشار بهبود‌ها و توسعه‌های کوچک

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

مشکل چهارم: عدم استفاده بهینه از منابع

عدم استفاده بهینه از منابع یکی دیگر از مشکلات اساسی توسعه نرم افزار به این شکل هست. در نرم افزارهای متفاوت نیاز‌های متفاوتی وجود دارد. ممکن است بخشی از برنامه مصرف RAM زیادی داشته باشه و بخشی دیگر هم مصرف CPU اما در این روش امکان تخصیص یک منبع خاص به بخش خاصی که نیاز به آن منبع دارد، وجود نخواهد داشت. در نتیجه هنگامی که بخشی با مصرف CPU زیاد ارتقا داده بشود این امکان در اختیار همه بخش‌ها قرار خواهد گرفت و برای همه قسمت ها امکان استفاده از این منبع، بی رویه و ناصحیح وجود خواهد داشت.

مشکل پنجم: انتشار مشکلات

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

مشکل ششم: عدم توانایی در به کارگیری ابزارها و تکنولوژی‌های جدید 

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

در حال حاضر در یکی از شرکت‌های بزرگ درگیر مشاوره در یک پروژه ERP هستم که سال‌ها پیش و با تکنولوژی سال ۲۰۰۵ توسعه داده شده است در این ابزار از ۰.Net Framework 2 استفاده شده و برای توسعه وب هم از ASP.NET Web Form استفاده شده است و اینقدر سیستم بزرگ و پیچیده شده که در طی این سال‌ها کسی جرات دست زدن به سیستم و تغییر تکنولوژی را نداشته است.

در صورتی که خودتان جای یکی از مدیران پروژه و شرکت بگذارید چقدر احتمال دارد قبول کنید که ثمره ۱۵ سال توسعه یک تیم برنامه نویسی دور ریخته بشود و یک پروژه جدید استارت زده شود؟ به نظرتان در این ۱۵ سال که یک تیم ۱۵-۲۰ نفره به طور میانگین درگیر این پروژه بوده است چقدر هزینه تولید همچین ابزاری شده است؟ آیا تغییر تکنولوژی با این شرایط امکان پذیر هست؟

خوب به نظر میرسه کم کم داریم به پایان دنیا نزدیک می‌شیم. اما واقعا راه حلی برای این مشکلات نیست؟

دوره آموزش معماری میکروسرویس نیک آموز

بهشت گمشده: میکروسرویس [Micro service] چیست؟

مزایای میکروسرویس‌

موضوع / ویژگی توضیح
فلسفه میکروسرویس مشابه روش تقسیم و غلبه، میکروسرویس‌ها برنامه‌های بزرگ (Monolith) را به مینی‌اپلیکیشن‌های کوچک با مدیریت و نگهداری ساده‌تر تقسیم می‌کنند. این کار فهم، توسعه و رفع مشکلات را ساده‌تر می‌کند.
انعطاف‌پذیری (Flexibility) هر میکروسرویس مسئولیت مشخصی دارد و مستقل توسعه می‌شود. شرکت‌ها می‌توانند از ابزارها و فریم‌ورک‌های مناسب هر سرویس استفاده کنند، مثل انتخاب گراف دیتابیس برای داده‌های گرافی و زبان برنامه‌نویسی خاص برای هر سرویس.
نصب و انتشار مستقل هر میکروسرویس به‌صورت مستقل قابل نصب و استقرار است؛ رفع باگ در یک سرویس نیازمند توقف کل سیستم نیست.
استفاده بهینه از منابع هر مینی‌اپلیکیشن منابع خود را دریافت می‌کند و در صورت نیاز، مقیاس‌پذیری عمودی یا افقی برای آن قابل اعمال است.
مقیاس‌پذیری (Scalability) سیستم می‌تواند منابع سرویس‌ها را افزایش یا کاهش دهد. مقیاس‌پذیری عمودی با افزایش سخت‌افزار و مقیاس‌پذیری افقی با اجرای چندین نسخه از میکروسرویس روی سرورهای مختلف حاصل می‌شود. ابزارهای مدیریت ترافیک مانند Kubernetes و Istio این فرآیند را ساده می‌کنند.
توسعه موازی (Parallel Development) تیم‌های مستقل می‌توانند همزمان روی میکروسرویس‌های مختلف کار کنند. این کار سرعت توسعه، مدیریت تغییرات و پاسخگویی به نیازهای کسب‌وکار را افزایش می‌دهد.
استقلال میکروسرویس‌ها هر سرویس دارای دیتابیس، منطق کسب‌وکار و تیم توسعه مستقل خود است. تغییرات و اصلاحات در یک سرویس تأثیر محدودی بر بقیه سیستم دارد.
مدیریت پیچیدگی سیستم قابل تجزیه است، هر میکروسرویس مسئولیت مشخص دارد و از تکنولوژی‌های متفاوت استفاده می‌کند. مدل‌های داده کوچک و مستقل، مدیریت و اصلاح سیستم را آسان می‌کنند.
مثال‌های کاربردی میکروسرویس مدیریت کاربران: تغییرات در حساب کاربری بدون تأثیر روی سایر سرویس‌ها. میکروسرویس پرداخت: اضافه کردن روش پرداخت یا بهبود امنیت تراکنش‌ها مستقل از سایر سرویس‌ها. میکروسرویس ارسال ایمیل: تغییر قالب یا متن ایمیل بدون تأثیر روی سایر بخش‌ها.
ارتباط بین سرویس‌ها مینی‌اپلیکیشن‌ها با استفاده از API با هم تعامل می‌کنند. مدیریت تعداد زیاد آدرس‌ها و ارتباطات بین سرویس‌ها با استفاده از API Gateway انجام می‌شود.

معایب میکروسرویس

معایب / چالش توضیح
تعیین مقیاس سرویس‌ها نام «میکروسرویس» روی کوچک بودن سرویس‌ها تاکید دارد، اما تعریف دقیق اندازه سرویس چالش‌برانگیز است. کوچک بودن سرویس وسیله‌ای برای رسیدن به هدف بزرگ است، نه هدف اصلی.
پیچیدگی ارتباط بین سرویس‌ها ارتباط بین میکروسرویس‌ها پیچیده‌تر از Monolith است. در Monolith می‌توان از کلاس‌ها و توابع داخلی استفاده کرد، اما در سیستم توزیع‌شده نیاز به API و پروتکل‌های شبکه است.
مدیریت توزیع و هماهنگی سرویس‌ها روی محیط‌ها و سرورهای مختلف اجرا می‌شوند و هماهنگی بین آن‌ها پیچیده است، به‌خصوص وقتی تغییرات بین سرویس‌ها یا نسخه‌های مختلف داده لازم باشد.
تست و عیب‌یابی تست سیستم توزیع‌شده دشوارتر از سیستم یکپارچه است. شبیه‌سازی تعامل بین سرویس‌ها و مدیریت خطاها پیچیده است.
هزینه زیرساخت هر سرویس منابع و دیتابیس مستقل دارد. مدیریت صدها سرویس می‌تواند هزینه عملیاتی و زیرساختی زیادی ایجاد کند.
تأخیر و هزینه ارتباط بین سرویس‌ها تعامل بین سرویس‌ها از طریق شبکه انجام می‌شود، بنابراین latency و مصرف پهنای باند افزایش می‌یابد.
پیچیدگی استقرار و نصب نصب و راه‌اندازی مستقل سرویس‌ها یک مزیت است، اما وقتی سیستم بیش از ۱۰۰ سرویس دارد، نصب، تنظیم ارتباطات و مدیریت نسخه‌ها زمان‌بر و پرخطا خواهد بود.
نیاز به تیم‌های متخصص مهارت در DevOps، مدیریت ترافیک، ابزارهای ابری و پایگاه‌های داده توزیع‌شده لازم است.
مدیریت داده و تراکنش‌ها هر سرویس دیتابیس اختصاصی دارد. مدیریت داده‌ها بین سرویس‌ها، تراکنش‌های توزیع‌شده و همگام‌سازی نسخه‌ها چالش‌برانگیز است.
پیچیدگی امنیتی هر سرویس ممکن است سطوح دسترسی و داده‌های خاص خود را داشته باشد؛ مدیریت احراز هویت و امنیت شبکه گسترده‌تر و پیچیده‌تر است.

هدف از معماری میکروسرویس چیست؟

معماری میکروسرویس به نوعی پاسخی به چالش‌ها و نیازهای جدید سازمان‌ها در دنیای دیجیتال است. این معماری با ارائه‌ی سرویس‌های کوچک و مستقل که با هم تعامل می‌کنند، سازمان‌ها را قادر می‌سازد تا به صورت موثر و مستقل توسعه و تغییر دهند.

تعامل و استقلال:

یکی از اصلی‌ترین اهداف میکروسرویس، ارائه‌ی سرویس‌هایی است که مستقل و قابل مدیریت هستند. این موضوع باعث می‌شود تیم‌های توسعه بتوانند با سرعت بیشتری واحدهای کد را توسعه، تست و انتشار دهند.

قابلیت اطمینان:

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

مقیاس‌پذیری:

سرویس‌ها می‌توانند به صورت مستقل از یکدیگر مقیاس‌بندی شوند، که این امکان را می‌دهد تا منابع را برای سرویس‌هایی که نیاز به بار بیشتری دارند، اختصاص داد.

آنچه میکروسرویس می‌خواهد ارائه دهد، سازمان‌هایی پویا، قابل تغییر و با قابلیت پاسخ‌گویی بالا به نیازهای مشتری است.

چه زمانی از معماری میکروسرویس استفاده کنیم؟

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

پیچیدگی سیستم:

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

نیاز به توسعه موازی:

در پروژه‌هایی که تیم‌های متعدد باید به صورت همزمان روی ویژگی‌های مختلف کار کنند، میکروسرویس‌ها می‌توانند فرآیند را ساده‌تر و سریع‌تر کنند.

زبان‌ها و فناوری‌های مختلف:

اگر نیاز به استفاده از زبان‌ها و فناوری‌های مختلف در یک پروژه دارید، میکروسرویس این امکان را می‌دهد که هر سرویس با زبان و فناوری مناسب خود نوشته شود.

تضمین عملکرد:

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

توزیع جغرافیایی:

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

نیاز به ارتقاء مستقل:

اگر می‌خواهید قسمت‌هایی از برنامه خود را بدون تأثیر گذاری بر سایر قسمت‌ها به‌روز کنید، معماری میکروسرویس این امکان را فراهم می‌کند.

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

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

  • Netflix: یکی از اولین و بزرگ‌ترین استفاده‌کنندگان معماری میکروسرویس، Netflix است. با توجه به میلیون‌ها کاربر در سراسر دنیا، این شرکت از میکروسرویس‌ها برای پشتیبانی از تقاضای روزانه خود استفاده می‌کند.
  • Amazon : Amazon با تجزیه سیستم‌های خود به میکروسرویس‌ها، توانمندی مدیریت ترافیک بالایی را کسب کرده و به کاربران خود خدمات مستمری ارائه می‌دهد.
  • Uber: با توجه به نیاز به سرعت و پاسخ‌گویی فوری، اوبر سیستم‌های خود را بر مبنای میکروسرویس طراحی کرده است.
  • Spotify: این شرکت موسیقی با استفاده از معماری میکروسرویس، توانمندی توسعه سریع و مقیاس‌پذیری خود را افزایش داده است.

این شرکت‌ها فقط نمونه‌هایی از بزرگ‌ترین‌ها هستند و بسیاری دیگر نیز در دنیا از معماری میکروسرویس بهره می‌برند. استفاده از این معماری به آن‌ها امکان داده تا به سرعت و با کیفیت به نیازهای کاربران خود پاسخ دهند.

فناوری‌ها و نرم‌افزارهای مورد نیاز برای پیاده‌سازی میکروسرویس‌ها

دسته فناوری / ابزار مثال‌ها و توضیح
زبان‌های برنامه‌نویسی Java, Python, Node.js, Go, .NET Core. انتخاب زبان وابسته به نیازها و تجربیات تیم توسعه است.
کانتینرها (Container) Docker برای اجرای میکروسرویس‌ها در محیط‌های جداگانه و یکسان.
مدیریت کانتینر Kubernetes برای مدیریت، مقیاس‌دهی و اجرای سرویس‌ها در محیط‌های کانتینری.
API Gateway نقطه ورود واحد برای درخواست‌های کاربر به میکروسرویس‌ها، مانند AWS API Gateway یا Kong.
Service Mesh Istio یا Linkerd برای مدیریت ترافیک بین سرویس‌ها، کشف خدمات و امنیت ارتباطات.
دیتابیس‌ها هر میکروسرویس می‌تواند از دیتابیس مخصوص خود استفاده کند، مانند PostgreSQL, MongoDB, Cassandra.
ابزارهای مانیتورینگ و لاگ Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana), Zipkin برای جمع‌آوری داده‌ها و آنالیز سیستم‌های میکروسرویسی.
CI/CD Jenkins, GitLab CI, Travis CI برای اتوماسیون فرآیندهای توسعه و تحویل میکروسرویس‌ها.

API Gateway چیست؟

API Gateway یک نقطه ورود واحد برای ارتباط Clientها با میکروسرویس‌ها است که تمام پیچیدگی‌های تعامل بین سرویس‌ها را پشت خود مخفی می‌کند. به جای ارسال چندین درخواست به سرویس‌های مختلف برای نمایش یک صفحه، مثل جزئیات محصول در یک فروشگاه آنلاین، Client تنها با یک API تعامل دارد و Gateway مسئول مسیریابی، ترکیب نتایج، مدیریت پروتکل‌ها و ارائه API اختصاصی برای هر Client است. این روش بهره‌وری و UX را افزایش می‌دهد، امکان Refactoring ساده‌تر سرویس‌ها را فراهم می‌کند و تعداد درخواست‌ها را کاهش می‌دهد، اما ایجاد و نگهداری Gateway نیازمند منابع، توسعه اختصاصی برای هر Client، مدیریت خطاها، یافتن آدرس سرویس‌ها و اطمینان از مقیاس‌پذیری و عملکرد بالا است. استفاده از مدل برنامه‌نویسی Reactive و پشتیبانی از روش‌های تعامل مختلف (Sync و Async) به بهینه‌سازی عملکرد Gateway کمک می‌کند و در مجموع، API Gateway راهکاری مؤثر .

.برای ساده‌سازی و یکپارچه‌سازی دسترسی به میکروسرویس‌هاست.

ارتباط بین سرویس ها

موضوع توضیح
نوع ارتباط Inter-Process Communication (IPC) بین سرویس‌ها به‌صورت یک‌به‌یک یا یک‌به‌چند و همزمان (Sync) یا ناهمزمان (Async)
روش‌ها Request/Response، Notification، Pub/Sub، Request/Async Response
اصول طراحی API تعریف دقیق APIها، رعایت API First و Robustness، مدیریت تغییرات به‌صورت backward compatible
تحمل خطا (Fault Tolerance) استفاده از Timeout، محدود کردن تعداد درخواست‌های بدون پاسخ، Circuit Breaker، Fallback
حفظ تجربه کاربری (UX) ارائه داده‌های کش شده یا جایگزین هنگام از دسترس خارج شدن سرویس‌ها

تکنولوژی‌های ارتباطی

در میکروسرویس‌ها برای برقراری ارتباط بین سرویس‌ها و کلاینت‌ها تکنولوژی‌های متنوعی وجود دارد که بسته به نوع تعامل Sync یا Async و یک‌به‌یک یا یک‌به‌چند انتخاب می‌شوند؛ روش‌های Async معمولاً از Messaging استفاده می‌کنند که شامل ارسال پیام با Header و بدنه پیام از طریق کانال‌های Point-to-Point یا Publish-Subscribe است و مزایایی مانند جداسازی کامل کلاینت از سرویس، عدم نیاز به همزمانی سرویس و کلاینت و نمایان شدن ماهیت IPC دارد، اما پیچیدگی‌های عملیاتی و پیاده‌سازی و نیاز به نگهداری زیرساخت را نیز به همراه دارد. در روش‌های Sync، Request/Response رایج است که با پروتکل‌هایی مانند REST یا Thrift پیاده‌سازی می‌شود؛ REST مبتنی بر Resourceها و HTTP است و مزایایی مثل سادگی، تست‌پذیری و سازگاری با زیرساخت‌ها دارد، اما محدودیت‌هایی چون نیاز به همزمانی کلاینت و سرویس، وابستگی به آدرس دقیق سرویس و پشتیبانی صرف از Request/Response دارد. انتخاب فرمت پیام‌ها نیز مهم است؛ قالب‌های متنی مانند JSON و XML خوانا اما کم‌بهره‌ور و قالب‌های باینری مثل Avro یا Protocol Buffer سریع و بهینه هستند، بنابراین بسته به نیازمندی‌های سیستم و شرایط عملیاتی باید فناوری و قالب مناسب ارتباط بین سرویس‌ها انتخاب شود.

آشنایی با Service Discovery

موضوع توضیح مثال/ابزار مزایا معایب
چالش آدرس‌دهی سرویس‌ها آدرس‌های استاتیک بی‌فایده‌اند؛ سرویس‌ها در cloud یا محیط توزیع‌شده دائم تغییر آدرس دارند. انعطاف‌پذیری لازم برای سیستم‌های مدرن نیاز به راهکار داینامیک برای یافتن آدرس‌ها
Service Registry دیتابیسی برای نگهداری آدرس تمام نمونه‌های سرویس‌ها به صورت داینامیک Netflix Eureka, Etcd, Consul, ZooKeeper ذخیره و مدیریت متمرکز آدرس سرویس‌ها، امکان کش کلاینت نیاز به در دسترس بودن دائم و به‌روزرسانی مداوم
Client-side Discovery کلاینت وظیفه query زدن به Service Registry و انتخاب نمونه سرویس با الگوریتم توزیع بار را دارد Netflix Eureka + Netflix Ribbon سادگی، امکان پیاده‌سازی الگوریتم توزیع بار اختصاصی وابستگی کامل کلاینت به Service Registry، نیاز به پیاده‌سازی برای هر کلاینت، پیچیدگی در مقیاس بزرگ
Server-side Discovery کلاینت درخواست را به مسیریاب (Proxy) می‌فرستد، مسیریاب Service Registry را query کرده و درخواست را به سرویس مناسب می‌فرستد AWS ELB, Kubernetes Proxy کلاینت ساده‌تر است، مدیریت توزیع بار متمرکز اضافه شدن لایه جدید (Proxy) به سیستم، وابستگی به سرور واسط
Heartbeat بررسی وضعیت سرویس‌ها در بازه‌های زمانی مشخص Netflix Eureka: هر ۳۰ ثانیه PUT اطمینان از زنده بودن سرویس‌ها، حذف خودکار سرویس‌های غیرفعال افزایش ترافیک ثبت وضعیت، نیاز به تنظیم مناسب بازه‌ها
Self-Registration سرویس خودش مسئول ثبت، حذف و ارسال heartbeat است Eureka Client سادگی، نیازی به ابزار خارجی نیست سرویس‌ها وظایف اضافی دارند، پیاده‌سازی تکراری برای هر زبان/فریم‌ورک
Third-Party Registration یک سرویس مرکزی (Service Registrar) مدیریت ثبت و حذف سرویس‌ها را انجام می‌دهد Registrator جداسازی سرویس‌ها از وظایف ثبت و مدیریت، خودکارسازی عملیات اضافه شدن سرویس جدید به سیستم، نیاز به نگهداری و مدیریت سرویس مرکزی

مدیریت داده‌ها در میکروسرویس

در میکروسرویس‌ها هر سرویس داده‌های خود را به صورت مستقل نگهداری می‌کند و دسترسی به داده‌های سرویس‌های دیگر تنها از طریق API امکان‌پذیر است، که مزایایی مثل استقلال، توزیع‌پذیری و استفاده از DB Engineهای مختلف (Polyglot Persistence) دارد اما چالش‌هایی مثل تراکنش‌های توزیع شده و همزمانی داده‌ها ایجاد می‌کند. برای حل این مشکلات معمولاً از Eventها استفاده می‌شود، به طوری که هر تغییر مهم در داده‌ها یک Event تولید می‌کند و سایر سرویس‌ها با دریافت آن داده‌های داخلی خود را به‌روزرسانی می‌کنند، روشی که eventual consistency، materialized view و تراکنش‌های چندمرحله‌ای را ممکن می‌کند اما پیچیدگی فنی، نیاز به rollback و احتمال دریافت دوباره Eventها از معایب آن است. برای حفظ atomicity می‌توان از جدول Event در تراکنش محلی، Transaction Log یا Event Sourcing استفاده کرد، به طوری که در Event Sourcing وقایع رخ‌داده روی Entityها ذخیره می‌شوند و وضعیت نهایی از روی این وقایع بازسازی می‌شود؛ این روش تاریخچه کامل داده‌ها را فراهم می‌کند اما پیچیدگی پیاده‌سازی، زمان‌بر بودن پردازش و دشواری جستجو از محدودیت‌های آن است و معمولاً با CQRS ترکیب می‌شود.

آشنایی با روش‌های انتشار در میکروسرویس‌ها

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

میکروسرویس را انتخاب کنم یا نه؟

سؤال «آیا میکروسرویس را انتخاب کنم یا نه؟» به‌طور مستقیم به نیاز و ظرفیت تیم توسعه بستگی دارد. این معماری که از سال ۲۰۱۰ با تکامل سیستم‌های توزیع شده شکل گرفت، مزایای قابل‌توجهی مانند مدولار بودن، مقیاس‌پذیری، توسعه مستقل و امکان ادغام تدریجی سرویس‌ها ارائه می‌دهد، اما همزمان چالش‌هایی مانند پیچیدگی ارتباطات بین سرویس‌ها، نیاز به منابع و زیرساخت‌های اضافی، مدیریت داده توزیع‌شده و آزمایش‌های پیچیده را نیز به همراه دارد. بنابراین انتخاب میکروسرویس نیازمند سنجش دقیق مزایا و محدودیت‌ها، توانایی تیم در مدیریت سیستم‌های توزیع‌شده و برنامه‌ریزی مناسب برای برش، مقیاس و طراحی معماری است.

 

جمع بندی 

در نهایت، معماری میکروسرویس نه یک معجزه است و نه یک مد زودگذر؛ یک انتخاب استراتژیک است که اگر بدون شناخت ظرفیت تیم، بلوغ فنی سازمان و پیچیدگی واقعی مسئله انجام شود، بیشتر دردسر می‌سازد تا ارزش. میکروسرویس زمانی معنا پیدا می‌کند که سیستم شما واقعاً به مقیاس‌پذیری مستقل، توسعه موازی، انعطاف فناوری و استقرار سریع نیاز داشته باشد؛ در غیر این صورت یک Monolith تمیز و خوش‌طراحی می‌تواند سال‌ها بدون بحران کار کند. انتخاب درست، نتیجه تحلیل دقیق است نه هیجان تکنولوژی. در نیک آموز تلاش کردیم تصویر کامل، واقع‌بینانه و بدون اغراق از این معماری ارائه دهیم تا تصمیم شما بر پایه منطق و نیاز واقعی باشد، نه صرفاً جذابیت نام «میکروسرویس».

 

چه رتبه ای می‌دهید؟

میانگین ۴.۲ / ۵. از مجموع ۱۱

اولین نفر باش

title sign
دانلود مقاله
میکروسرویس چیست؟
فرمت PDF
8 صفحه
حجم 2 مگابایت
دانلود مقاله
title sign
معرفی نویسنده
علیرضا ارومند
مقالات
17 مقاله توسط این نویسنده
محصولات
47 دوره توسط این نویسنده
علیرضا ارومند

علیرضا ارومند به عنوان Product Manager شرکت داتین (وابسته به فناپ) در حوزه پروژه‌های بانکی فعال است.او همچنین مدرس و Technical Manager پروژه‌های نیک آموز می باشد از دیگر تخصص های او میتوان به: تولید فریمورک برنامه نویسی فوق العاده حرفه‌ای با مدیریت بیش از 1 میلیون تراکنش در ثانیه، همکاری با تیم توسعه شرکت ارتباط فردا (بانک آینده)، مشاور فنی شرکت توسعه رفاه پردیس (بانک رفاه)، مدیر فنی خبرگزاری نسیم، سخنران تنها همایش مورد تایید مایکروسافت در خاورمیانه در حوزه ASP.NET Core، مدیر فنی خبرگزاری بین المللی پیام‌کوتاه نسیم (برنده جشنواره وب ایران)، مدرس دوره های Dot Net ، ASP.NET در نیک آموز، همکاری با تیم توسعه شرکت ارتباط فردا

title sign
دیدگاه کاربران

    • سلام وقت بخیر ، ممنون از مطلب مفیدی که به اشتراک گذاشتید
      نیک آموز ، آموزش ویدیویی در این زمینه داره ؟
      و هم اینکه پیش نیاز لازم داره؟

    • عالی بود ممنونم از توضیحاتون که ساده ، و در عین حال کاربردی بود.
      متشکرم

    • چه زمانی از معماری میکرو سرویس باید استفاد کنیم؟

    • سلام، همانطوری که در انتهای مقاله اشاره کردید، آیا به پروژه هایی که با میکرو سرویس شکست خورده اند، اشاره می فرمایید؟

    • با تشکر از مقاله خوبتان می خواستم بدانم آیا برای اجرای معماری میکرو سرویس آیا حتما لازم هست که هر بخش در یک سرور جداگانه نصب بشه و از طریق API باهم کار کند آیا امکان این را دارد که من سایتی با این معماری طراحی کنم ولی برای شروع بتوانم تمام بخش های پروژه را در یک سرور بدون تقسیم کردن مثل داکار راه اندازی کنم ولی با این معماری طراحی شود و در صورتی که تعداد کاربران افزایش پیدا کرد بعدا جدا سازی کنم. آیا این کار من شدنی و منطقی هست؟ من فعلا در حال آموزش این معماری هستم این سوال در گیر هستم. ممنونم پاسخ بدهید.

      • درود وقت بخیر
        جهت اطلاعات بیشتر شمارو ارجاع میدم به این مقاله. لطفا دقیق مطالعه و بررسی نمایید.
        https://nikamooz.com/release-method/
        سپاس از همراهی شما

    • بدون اغراق یکی از روانترین و بهترین مقاله هایی هست که برای آموزش یک تکنولوژی خوندم
      دمت گرم

      ۱
    • بدون اغراق یکی از روانترین و بهترین مقاله هایی هست که برای آموزش یک تکنولوژی خوندم
      دمت گرم

    • عالی بود ممنون

    • عالیه
      ممنون میشم اگر workshop را زودتر برنامه ریزی بفرمایید.

  • 1
  • 2