مدتی است که مدل و معماری تولید و توسعه سیستم های نرم افزاری دچار تغییراتی شده و با معماری جدیدی با نام مایکروسرویس Microservices مواجه هستیم. البته پرداختن به این موضوع برای متخصصین زیرساخت های شبکه و مجازی به اهمیت مهندسین نرم افزار و برنامه نویسان نیست ولی شناخت بستر و پلتفرم های کاربردی که میتوانند میزبان چنین سیستم هایی باشند برای ما مهم خواهد بود (ادمینهای زیرساخت مجازی و شبکه). از این رو به معرفی اولیه این معماری خواهیم پرداخت و در مقالات بعدی به سایر فناوری ها مانند کانتینر، سرویسها و ابزارهای خودکار سازی و توسعه نرم افزار CI/CD، و.. که با آن تلاقی مستقیم دارند خواهیم پرداخت.
مایکروسرویس که اخیرا بعنوان جدیدترین و مهمترین روش طراحی سیستم های نرم افزاری یاد می شود در مقابل معماری یکپارچه Monolithic مطرح می شود. بد نیست مقایسه ای بین این دو معماری داشته باشیم تا به مزایا و نقاط قوت معماری مایکروسرویس بیشتر پی ببریم.
معماری یکپارچه Monolithic
فرض کنید یک نرم افزار پرداخت انلاین، موبایل بانکینگ یا حتی فروشگاه آنلاین دارید. در معماری Monolithic کلیه بخش ها و توابع سیستم نرم افزاری شما بصورت یکپارچه نوشته و تولید می شود. درخواست ها به سمت سرور ارسال و پردازش های لازم سمت سرور انجام می شود و در نهایت خروجی برای کاربر ارسال می گردد. معمولا در سازمانها برای اجرا چنین نرم افزارهایی لازم است تا یک ماشین مجازی به اپلیکشن موردنظر تخصیص یابد تا در آن نصب، پیکربندی و راه اندازی نرم افزار صورت گیرد. حال فرض کنید در یک روز خاص با خجم انبوهی درخواست در سمت سرور مواجه هستید یا درخواستهای حجیم کاربران برای پرداخت به سمت سرور شما ارسال شده است. در زمانیکه ترافیک برنامه در سمت سرور افزایش پیدا می کند، جهت پاسخگویی می توانید یک ماشین مجازی ثانوی ایجاد و نسخه ای از اپلیکشن خود را بر روی آن مجددا راه اندازی کنید. در صورت افزایش ترافیک اینکار می تواند روی چندین ماشین مجازی دیگر تکرار شود. از این رو، لازم است با قراردادن و راه اندازی یک متعادل کننده بار یا Load Balancer درخواستها را بین سرورهای مجازی خود هدایت کنید. شاید مشکل اصلی ما از معماری یکپارچه Monolitihc در همین قسمت باشد.
با توجه به اینکه درخواست ها و ترافیک برای یک بخش خاصی از اپلیکشن افزایش یافته است، ولی ما مجبوریم کل نرم افزار را با تمام بخش ها و متعلقات آن در سرورهای مجازی دیگر راه اندازی کنیم. مشکل دیگر این معماری، عدم انعطاف در انتخاب تکنولوژی است. برای مثال کل این نرم افزار با زبان برنامه نویسی PHP نوشته شده است و شما قادر نیستید بخش هایی از آن مانند اعتبارسنجی یا حساب کارت مشترکین را با Java یا Go برنامه نویسی کنید. وابسته بودن بخش ها و یکپارچگی کل نرم افزار نیز در زمانیکه نیاز به توسعه و ارتقاء نرم افزار دارید مشکل دیگری است که در این مواقع نمایان خواهد شد. برای نمونه، ممکن است شما مجبور باشید یک تغییر کوچکی در یک بخش خاص از نرم افزار خود اعمال کنید. برای برای build کردن و توسعه نرم افزار مجبور هستید کل معماری برنامه را متاثرکنید و کل اپلیکشن مجدد کامپایل گردد که این امر منجر به خارج شدن سرویس نیز خواهد شد. مشکلات این چنینی که با بزرگ شدن نرم افزارها و اپلیکشن های حیاتی نمایان می شد، شرکت های بزرگ همچون آمازون، نت فلیکس، گوگل و … را به فکر استفاده از یک معماری جدید واداشت. اینجا بود که معماری جدید مایکروسرویس Microservice مطرح و پابه عرصه گذاشت.
معماری مایکروسرویس Microservices
معماری مایکروسرویس در حقیقت یک روش طراحی نرم افزار هست که با تقسیم کردن یک اپلیکشن بزرگ و یکپارچه به بخشها و سرویس های کوچک مزایا و سودمندی های بسیاری را ارائه کرده است. در حقیقت، تبدیل یک سیستم یکپارچه به چندین زیرسیستم و ماژول جداگانه، مستقل و سبک که بتوانند با یکدیگر بصورت جداگانه ارتباط داشته باشند اصل معماری مایکروسرویس می باشد.
همان مثال قبلی را فرض کنید. یک اپلیکشن موبایل به چندین زیرسیستم مختلف از جمله سیستم اعتبارسنجی کاربران، سیستم گزارش دهی، سیستم بررسی موجودی، سیستم ارسال پیام کوتاه، سیستم تاریخچه تراکنش ها و … تقسیم می شود. در این معماری، هر سرویس یا ماژول وظیفه اجرای یک تابع و فعالیت خاص را بر عهده داشته و کاملا مستقل از زیرسیستم بعدی است. از این رو هرگونه تغییر در کد یا انجام تغییرات در آن بصورت مستقل و جداگانه انجام خواهد شد. حتی فرآیند مانیتور کردن زیرسیستم ها بصورت مجزا و پایش منابع مصرفی آنها از مزایای این معماری به شمار می رود چون براحتی قادر هستیم منابع مصرفی هر سیستم و تابع را مجزا بررسی کنیم. در صورت بالا رفتن ترافیک یک سرویس، کافی است به فکر ارتقاء و scale نمودن همان سرویس باشید و نگران مقیاس پذیری کل اپلیکشن نباشید.
اما سوال مهم این است که با تفکیک کردن یک اپلیکشن به ده ها یا صدها ساب ماژول یا سرویس کوچک و مستقل، چگونه بایکدیگر ارتباط برقرار می کنند. در پاسخ به این سوال بایستی اشاره کنیم که تمام این سرویس ها با درخواستهای مبتنی بر Http و بواسطه متد Restful API با یکدیگر صحبت خواهند کرد.