تفاوت SOA و Microservices

آیا میکروسرویس نسل جدید SOA هست؟ و آیا هنوز هم از SOA استفاده میشه؟

توی این مقاله میخایم تفاوت بین معماری های Monolithic و SOA و Microservice رو باهم بررسی میکنیم.


در پست قبلی در رابطه با میکروسرویس ها یه مقداری میکروسرویس آشنا شدیم و فهمیدیم به کمک ما میاد که معماری رو تجزیه و توزیع کنیم و مزایای بیشتری نسبت به معماری یکپارچه داره. حالا توی این مقاله میخایم معماری layered-based رو توضیح بدیم و ببینیم تفاوت SOA و Microservice چیه؟

قبل از اینکه بریم ببینیم تفاوت این دوتا چیه بهتره تفاوت های اساسی معماری monolithic و SOA و Microservice رو ببینیم.

معماری یکپارچه - Monolithic

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


معماری سرویس گرا - SOA

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

معماری میکروسرویس - Microservice

یه سبک خاص معماریه که با استفاده از اون یه برنامه کاربردی رو به مجموعه ای از سرویس های مستقل تقسیم میکنیم که حول یه بیزنس دامین قرار میگیرن!


تفاوت MicroService و SOA

همونطوری که اسم این دو معماری مشخصه هر دوتاشون حول سرویس ها میچرخن و کار میکنن، یعنی هر دو سرویس گرا هستن اما تفاوت اصلی این دوتا توی ویژگی ها و خصوصیات سرویس ها هستش.

معماری سرویس گرا - SOA: با توجه به چیزی که توی شکل زیر میبینیم این معماری سرویس هاش رو به ۴ دسته اصلی تقسیم میکنه:

سرویس های عملکرد(سرویس های تجاری) - Functional Services:

  • سرویس هایی که درشت دانه تر هستن و هسته اصلی کار رو تشکیل میدن
  • به وسیله XML، زبان اجرای فرایند کسب و کار(BPEL) و... نمایش داده میشن
  • در نهایت افرادی که تو حوزه کسب و کارتون هستن توی این لایه قرار میگیرن

سرویس های سازمانی - Enterprise Services:

  • عملکردهای تعریف شده توسط سرویس های تجاری رو پیاده سازی میکنن (یعنی عملکرد هایی که توی لایه بالاتر بهش نیاز داریم رو پیاده سازی میکنن)
  • عمدتاً برای تحقق درخواست های business به سرویس های برنامه و سرویس های زیربنایی متکی هستن (پس لایه واسط ما ایجاس)

سرویس های برنامه - Application Services:

  • سرویس های ریز دانه ای که محدود به یه برنامه کاربردی خاص هستن
  • توی این لایه برنامه هامون توسعه داده میشه
  • برای استفاده از این سرویس ها باید رابط کاربری اختصاصی تهیه بشه

سرویس های زیربنایی - Infrastructure Services:

  • وظایف غیر کاربردی مثل تایید اعتبار، حسابرسی کاربران، امنیت و ورود به سیستم رو انجام میدن
  • میشه از طریق سایر برنامه ها و سرویس ها فراخوانی بشن


در مقابل میکروسرویس ها طبقه بندی محدود تری دارن، با توجه به شکلی که پایین میتونید ببینید فقط ۲ نوع سرویس توی این معماری وجود داره:

سرویس های عملکرد - Functional Services:

  • عملکرد های کسب و کار رو پیاده سازی میکنن
  • دسترسی به این سرویس ها از بیرون انجام میشه و با بقیه سرویس ها به اشتراک گذاشته نمیشن

سرویس های سازمانی - Enterprise Services:

  • مثل معماری SOA، وظایف غیر کاربردی مثل تایید اعتبار، حسابرسی کاربران، امنیت و ورود به سیستم رو انجام میدن
  • هیچ دسترسی ای به این سرویس ها از بیرون وجود نداره


تفاوت های اساسی SOA و MSA

  • معماری SOA سعی داره تا جایی که ممکنه همه چیز رو به اشتراک بزاره، در مقابل توی MSA سعی میشه حد اقل اشتراک گذاری داده ها و منابع رو داشته باشه
  • معماری SOA هدف استفاده مجدد از عملکرد های سیستم هستش، در مقابل MSA تمرکزش رو روی مفهوم bounded-context گذاشته
  • معماری SOA همه سرویس هاش بر اساس استاندارد های رایج هست، در مقابل MSA تمرکزش رو روی توسعه دهنده ها، همکاری بین اونها، آزادی انتخاب ها و گزینه های دیگه گذاشته
  • معماری SOA برای ارتباط بین سرویس ها از ESB (بیاید بهش بگیم اتوبوس خدمات سازمان) استفاده میکنه، در مقابل MSA از یک messaging-system ساده استفاده میکنه
  • معماری SOA از چندین پروتکل های پیام استفاده میکنه، در مقابل MSA از پروتکل های ساده مثل HTTP/REST استفاده میکنه
  • معماری SOA به صورت چند نخی و با سربار I/O کمتر کار میکند، در مقابل MSA به صورت تک نخی و معمولا با استفاده از EventLoop(جهت جلوگیری از بلاک شدن I/O) پیاده سازی میشه
  • معماری SOA قابلیت استفاده مجدد از سرویس های برنامه رو به حداکثر میرسونه، در مقابل MSA کل تمرکزش رو گذاشته روی جداسازی سرویس ها
  • معماری SOA بیشتر از دیتابیس های رابطه ای مروسوم استفاده میکنه، در مقابل MSA غالبا دیتابیس های جدید با هر ساختاری رو پشتیبانی میکنه
  • معماری SOA اگر نیاز به یک تغییر سیستماتیک داشته باشه نیازه که تغییرات یکپارچه ای روی سرویس هاش بدیم، در مقابل توی MSA با اضافه کردن یه سرویس جدید میشه مشکل رو حل کرد
  • معماری SOA سعی میکنه از DevOps و CI/CD استفاده کنه اما هنوز خیلی باهاشون هماهنگ نیست، در مقابل MSA به شدت با DevOps و CI/CD دوسته و ازشون استفاده میکنه


تشریح تفاوت های اساسی SOA و MSA

ریز دانگی - Service Granularity: هر سرویس در معماری MSA به طور کلی یک کار رو انجام میده ولی همین یه کار رو به بهترین شکل انجام میده. اما در SOA هر سرویس میتونه به اندازه یه پروژه کوچیک، متوسط یا بزرگ وسعت داشته باشه. درواقع سرویس هایی که توی SOA ایجاد میشن غالبا به در قالب یه محصول بزرگ یا به صورت زیرسیستم از یه سیستم بزرگ ارائه میشن.

اشتراک گذاری اجزاء - Component Sharing: یکی از اصول پایه معماری SOA اشتراک گذاری اجزای سیستمه، در واقع هدف اصلی سرویس های سازمانی به اشتراک گذاری اجزای سیستمه. معماری SOA این اشتراک گذاری رو تسهیل میکنه درحالی که MSA سعی داره با استفاده از مفهوم bounded-context این اشتراک گذاری را به حداقل برسونه.

مفهوم bounded-context یعنی اینکه هر جزء یا اجزای مرتبط رو با داده های مورد استفاده ش توی یه بسته بندی قرار بدیم جوری که دیگه هیچ وابستگی ای به سایر بخشها نداشته باشه. و چون SOA برای اینکه بتونه درخواست ها رو پاسخ بده به چندین سرویس متکی هست این باعث میشه از معماری MSA کند تر باشه.

استفاده از Middleware یا API Layer: الگوی معماری میکروسرویس از API Layer استفاده میکنه، ولی SOA در مقابل messaging-middleware رو داره. وجود messaging-middleware در SOA به ما یه سری قابلیت ها ارائه میده که توی MSA دیگه خبری ازشون نیست (قابلیت هایی مثل routing، meditation، message، message-enhancement، protocol-transformation و...) توی MSA یک واسط Api Layer داره که بین سرویس ها و service-consumer هاش میشینه.

سرویس های راه دور - remote services: معماری SOA براساس messaging هایی مثل AMQP و MSMQ کار میکنه و پروتکل اصلیش SOAP هستش. در مقابل MSA از پروتکل REST و simple-messaging هایی مثل JMS و MSMQ استفاده میکنه و اینکه پروتکل انتخاب شده باید بین سرویس ها مشابه باشه.

همکاری ناهمسان - Heterogeneous interoperability: معماری SOA مارو ترغیب میکنه که از چند پروتکل ناهمگون توی messaging-middlewareش استفاده کنیم. در مقابل MSA سعی میکنه با کم کردن تعداد راههای ارتباطی معماری ساده تری رو ارائه کنه. پس نتیجه میگیریم هرجا لازمه چنتا پروتکل ناهمسان داشته باشیم بهتره از SOA استفاده کنیم و در حالتی که یک پروتکل مشترک داریم MSA گزینه بهتریه.


درنهایت باید بگم که خیلی راحت نمیشه گفت کدوم معماری بهتر از اون یکیه. و این به شدت وابسته به هدف و شالوده برنامه ای هست که میخاید ایجاد کنید.

معماری SOA بیشتر مناسب کسب و کارهای پیچیده ای هست که نیازه برنامه های ناهمسان زیادی رو با هم ادغام کنیم؛ و اگر برنامه شما به اندازه کافی بزرگ نیست که نیاز به یک messaging-middleware داشته باشه بهتره سمت این معماری نرید.

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

در نهایت اول باید یه ۲ ۲ تا ۴ تا بکنید زیر و بم کسب و کارتون رو در بیارید ببینید کدوم معماری بیشتر به کارتون میاد.


ادامه دارد...