مقدمه ای بر مایکرو سرویس
در سال های اخیر مایکروسرویس به عنوان جدیدترین ، مهمترین و محبوبترین روش طراحی معماری سیستم های نرم افزارها شناخته شده است. در این مدت بحث ها, مقالات و صحبت های بسیار بسیار زیادی در مورد این موضوع طرح شده, و شرکتهای بزرگی مانند Amazon , SoundCloud , Netflix و ... بصورت بسیار گسترده از آن استفاده کرده اند.
برای شناخت معماری Micro services ، ابتدا بایستی با معماری Monolithic آشنا شویم.
معماری Monolithic چیست؟
در معماری Monolithic بخشهای مختلف برنامه سمت سرور مثل پردازش پرداخت آنلاین، مدیریت حسابها، اعلانها ، ارتباط با پایگاه داده و انجام سایر الگوریتمها و ... همگی در یک واحد جمع و اجرا میشوند. در این نوع معماری زمانیکه ترافیک برنامه در سمت سرور افزایش پیدا میکند، باید برای پاسخگویی، اندازه را افزایش داد. یعنی باید برنامه تحت وب خود را بر روی سرورهای مختلف مجددا اجرا نمود. بخشی به نام Load Balancer، وظیفه توزیع درخواستها را به سرورهای مختلف که بر روی هر یک، یک نسخه از برنامه در حال اجرا است، به عهده دارد. بر اساس توضیحی که از این معماری ارایه شد، در هر یک از این اجراها، کل برنامه با تمام متعلقاتی که دارد، فارغ از اینکه به همه آنها نیاز است یا نه، از منابع سرور استفاده میکند. همچنین در معماری Monolithic برنامهها بر اساس یک زبان برنامهنویسی مشخص، برای یک فریم ورک مشخص نوشته میشوند. این برنامهها اصطلاحا چند سکویی نیستند و کامپوننتهای نوشته شده برای آنها فقط در فریم ورک جاری قابل استفاده مجدد هستند. ممکن است برای هر تغییر ریز و درشت در برنامههای این معماری، نیاز به Build و Deploy مجدد کل برنامه باشد که احتمال از دسترس خارج شدن برنامه هم وجود دارد. اگر بخشی از برنامه از کار بیافتد، ممکن است باعث از کار افتادن کل برنامه یا بخشهایی از آن شود.
اینجا است که پای میکروسرویسها به میان میآید و کمپانیهای بزرگی همچون آمازون یا نتفلیکس به استفاده از میکروسرویسها روی آوردهاند.
معماری Micro service چیست؟
میکروسرویس روشی به منظور تقسیمبندی کردن یک اپلیکیشن (در اینجا منظور اپ موبایل نیست بلکه هر نوع نرمافزاری را شامل میگردد) به بخشها یا سرویسهای کوچک، سبک، مستقل و قابل مدیریت است. به عبارت دیگر، میکروسرویس یک معماری توسعهٔ نرمافزار Distributed (پخششده) است.
در معماری Micro services، برنامه سمت سرور به سرویسهای مختلفی تقسیم میشود و هر سرویس یک فرآیند پردازشی مستقل است که به عنوان یکی از قابلیتهای خاص برنامه سمت سرور به حساب میآید. این نوع سرویسها صرفاً به منظور هندل کردن یک تَسک خاص طراحی میشوند؛ به طور مثال، یک سرویس صرفاً وظیفهٔ مدیریت کاربران را دارا است و سرویس دیگر فقط و فقط برای بخش جستجوی سایت کاربرد دارد.
برنامههای نوشته شده با این معماری اجباری برای اجرا شدن در سرورهای جداگانه را ندارند، مگر اینکه یک سرویس، شرایط خاصی از جمله مصرف بالای RAM یا نیاز به پردازش ویژه و زیاد در CPU را داشته باشد. در اینصورت بهتر است که سرویس از یک سرور مجزا اجرا شود. لازم است که سرویسها در بستر شبکه با یکدیگر در ارتباط باشند. همچنین باتوجه به اینکه میکروسرویسها مجزا و مستقل از یکدیگر هستند، به راحتی قادر خواهیم بود تا آنها را با زبانهای برنامهنویسی مختلفی نوشته و برای ذخیرهسازی دادههای مرتبط با آنها، از سیستمهای مدیریت دیتابیس مختلفی استفاده کنیم. به عنوان مثال ، جاهایی که نیاز به ذخیرهسازی سنتی دادهها داریم میتوانیم از MySQL استفاده کنیم و جاهایی دیگر هم به خاطر ساختار غیرقابل پیشبینی دیتای خود، میتوانیم از دیتابیسهای به اصطلاح NoSQL استفاده کنیم.
در اینجا ممکن است این سؤال پیش بیاید که سرویسهای مختلف یک اپلیکیشن با معماری میکروسرویسی چگونه با یکدیگر ارتباط برقرار میکنند؟ در پاسخ به این سؤال باید گفت که با استفاده از ریکوئستهایی از جنس HTTP و APIهای به اصطلاح RESTful این ارتباط برقرار خواهد شد.
فلسفه معماری Micro services
فلسفه معماری مبتنی بر میکروسرویسها همانند فلسفه Unix است که تلاش میکند «یک چیز را انجام دهد و فقط آن را به خوبی انجام دهد». در Micro services :
- سرویسها کوچکند و به اندازهٔ کافی ریزدانه هستند (fine grained) ولی نه ریزتر به گونهای که یک هدف تجاری و کاربردی خاص را انجام میدهند.
- فرهنگ سازمان باید خودکار سازی deployment و تست نرمافزار را مشتاقانه بپذیرد زیرا که در این معماری نیاز به چنین رویکردی وجود دارد. به این ترتیب بار از روی مدیریت، مدیران سیستمی و اجرائیات برداشته میشود.
- فرهنگ و الگوهای طراحی باید فرهنگ حل شکست و خطا داشته باشند و پیوسته در راستای بهبود سرویسها تلاش کنند.
- سرویسها باید منعطف، واکنشگر، با قابلیت ترکیب شدن با بقیهٔ سرویسها، و در انجام تک وظیفهای که دارند کامل باشند.
ارزش های معماری Micro services
- از آنجایی که سرویسها از طریق زبان مشترک شبکه با یکدیگر در ارتباط هستند، میشود آنها را با زبانهای برنامهنویسی مختلف و بر روی فریمفرکهای متفاوت نوشت.
- بدیهی است که با این معماری، هر سرویس را میشود به صورت جداگانه ایجاد کرد و تغییر داد که باعث سرعت در به روزرسانی و فرآیند گسترش برنامه میشود.
- مانیتور کردن سرویسها سادهتر خواهد بود. از آنجایی که هر سرویس به صورت یک پردازش جداگانه اجرا خواهد شد، تعیین اینکه هر سرویس از چه منابعی و به چه اندازهای استفاده میکند، آسانتر خواهد بود.
- از آنجایی که این سرویسها از طریق شبکه در تبادل هستند، میشود از آنها در سایر برنامهها مجدداً استفاده کرد.
مشکلات معماری Micro services
- از آنجایی که برنامههای سمت سرور نوشته شده با این معماری به سرویسهای مختلفی تقسیم میشوند، گسترش و تنظیمات آنها میتواند کاری وقت گیر و طاقت فرسایی باشد.
- از آنجایی که ارتباط بین سرویسها در بستر شبکه انجام میشود، انتظار کندی عملکرد سرویسها دور از ذهن نیست.
- به دلیل ارتباطات شبکهای، احتمال آسیب پذیریهای امنیتی در این نوع برنامهها بیشتر است.
- نوشتن سرویسهایی که در بستر شبکه با سایر سرویسها در ارتباط هستند سختی و مشکلات خود را دارد. برنامهنویس در این شرایط، درگیر برقراری ارتباط، رمزگذاری دادهها در صورت نیاز و تبدیل آنها میشود.
- به دلیل مجزا بودن بخشهای مختلف برنامه، مانیتور کردن و ردیابی عملکرد سرویسها، یکی از کارهای اصلی توسعه دهنده یا استفاده کننده از برنامه است.
- در مجموع سرعت برنامههای نوشته شده با معماری Micro services کندتر از برنامههای نوشته شده با معماری Monolithic است. دلیل آن محیط اجرایی برنامهها است. برنامههایی با معماری Monolithic بر روی حافظه سرور پردازش میشوند.
چه زمانی از معماری Micro services استفاده کنیم؟
در واقع قاعده مشخصی برای انتخاب بین این دو معماری وجود ندارد. شاید بهترین دلیل برای استفاده از این معماری زمانی است که تیم توسعه دهنده به این نتیجه برسد که خصوصیات معماری Monolithic برای آنها مشکل به حساب میآید.
اگر تیم توسعه دهنده تصمیم بگیرد که از معماری Monolithic به نوع Micro services تغییر مسیر دهد، نیازی به نوشتن کل برنامه از ابتدا نیست. در این شرایط میتوان فقط کامپوننتهایی را که دردسر ساز شدهاند، به نوع سرویسی آن تبدیل کرد. به این نوع برنامههای سمت سروری که بخش اصلی برنامه به صورت Monolithic ولی برخی از عملکردهای خاص آن به صورت سرویسی نوشته شده باشد، اصطلاحا معماری Micro services با هسته Monolithic گفته میشود.