چندین روش مختلف برای تقسیم کردن برنامهها و سرویسها به میکروسرویسها وجود داره. شاید راحتترین روش «میلی» باشه به طوری که شما بدون هدف و از روی غریزه یک سری میکروسرویس معرفی میکنید. واضحه که این روش اصلا مناسب نیست و ممکنه حتی باعث دردسر بشه. خب باید چیکار کرد؟ چند راهکار مختلف هست که تجربه به من یادشون داده:
تقسیم بندی بر اساس تیمها
وقتی Gerstner ریاست IBM رو برعهده گرفت حرف جالبی زد «با نگاه کردن داخل یکی از کامپیوترهای IBM شما میتونید تیمهای ما رو ببینید» این حرف که در واقع نقدی بر طراحی قبلی بود میتونه به شما کمک کنه. اگر تیمهای زیادی همزمان با هم به توسعه محصول شما میپردازن تقسیم کردن سرویسها با توجه به تیمها میتونه بهتون کمک کنه تا کمترین تداخل رو داشته باشید. اینطوری هر تیم روی پروژه کوچکی کار میکنه که بر اساس یک schema بزرگتر که طراح سیستم (شما!) با بقیه اجزای سیستم کار میکند.
تقسیم بندی بر اساس کاربرد
در این روش شما ابتدا تمامی اعمال کاربر رو لیست میکنید. اعمالی مثل «لاگین/ریجستر/ایجاد پست جدید/لایک کردن پست دیگران/ایجاد کامنت/ آپلود عکس» رو مشخص میکنید سپس یکی از دو روش زیر رو در نظر میگیرید:
۱- با استدلال اعمال بالا رو دسته بندی کنید. مثلا به نظر میرسه افراد بعد از ریجستر کردن اقدام به آپلود عکس کنن. پس باید این دو عمل در یک سرویس قرار بگیرن تا وقتی تعداد زیادی کاربر ثبتنام میکنند شما تنها با scale کردن این سرویس مشکل رو حل کنید.
۲- ابتدا یک سرویس کلی بنویسید که همه چیز را لاگ میکند (توصیه میکنم از ELK استفاده کنید!) و سپس با تحلیل لاگها بین اعمال بالا ارتباط پیدا کنید و آن بخشها را جدا کنید. این روش به خصوص وقتی به کار میآید که شما برنامه فعلیتان به صورت مونولتیک توسعه داده شده است و میخواهید به میکروسرویسها سوییچ کنید. ممکن است مثلا با تحلیل لاگها به این نتیجه برسید که ریجستر کردن و ایجاد کامنت ارتباط نزدیکتری دارند تا ریجستر کردن و آپلود عکس!
تقسیم بندی بر اساس پیشنیازها
روش دیگه تقسیم بندی بر اساس نیازهای هر سیستم هست. مثلا سرویس لاگین و ریجستر هر دو به دیتابیس یوزرها نیاز دارند اما سرویس آپلود عکس نیاز به دسترسی به ftp server شما دارد.
نتیجه گیری
اساسا این که سرویسهاتون رو چطور تقسیم بندی کنید بستگی به این داره که چرا میخواهید از میکروسرویس ها استفاده کنید. احتمالا روش نهایی شما ترکیبی از همه روشهای بالاست!