مدتی است که در خصوص معماری میکروسرویس ها، ضمن انجام پروژه ها و کارهای مربوطه، سعی می کنم که بیشتر عمیق شوم و به مفاهیم مربوطه نیز بیشتر توجه کنم، از این رو یک موضوع در این خصوص را برای این نوشته در نظر گرفتم.
معماری میکروسرویس ها به دلیل انعطاف پذیری و مقیاس پذیری که به ارمغان می آورد، شهرت زیادی پیدا کرده است. یکی از اصول اساسی در این رویکرد، استقلال سرویسها است - یعنی هر میکروسرویس بتواند داده های خود را مدیریت کرده و بدون وابستگی به سرویسهای دیگر فعالیت کند. هر چند این اصل ساده به نظر می رسد، پیاده سازی آن نیاز به برنامه ریزی دقیقی دارد، به ویژه در زمینه اشتراک گذاری دادهها و تعاملات سرویسها.
یکی از اصول کلیدی در میکروسرویس ها، استقلال سرویس ها است.
دراین نوشته به چالش ها و راه حل هایی برای دستیابی به استقلال سرویسها می پردازیم و بر تعادل بین سازگاری (Consistency) و مقیاس پذیری (Scalability) در محیط میکروسرویسها تمرکز می کنیم.
موضوع اصلی، تعادل بین سازگاری دادهها (Consistency) و مقیاسپذیری (Scalability) است که در میکروسرویسها اهمیت بسیار زیادی دارد.
داشتن پایگاه داده مجزا برای هر سرویس در معماری میکروسرویس ها مزایایی چون حفظ حریم داده ها، کاهش وابستگی و افزایش تاب آوری سیستم را به همراه دارد.
کاهش وابستگی یکی از ویژگی های کلیدی معماری میکرو سرویس هاست، به همین دلیل، هر میکروسرویس باید اطلاعات خود را در پایگاه داده مخصوص به خود ذخیره و از آن بازیابی کند.
این الگو انعطاف پذیری لازم برای انتخاب پایگاه داده مناسب، اعم از پایگاه داده های رابطه یی یا غیر رابطه یی، متناسب با نیازهای کاربردی و تجاری شما را فراهم می کند.
بر اساس این الگو، میکروسرویس ها پایگاه داده مشترک ندارند و تغییرات در پایگاه داده اختصاصی یک سرویس، تاثیری بر سایر میکروسرویس ها ندارد. داده های ذخیه شده توسط یک میکروسرویس به طور مستقیم توسط سایر میکروسرویس ها قابل دسترسی نیست و تنها از طریق APIها می توان به آن دسترسی داشت.
داشتن پایگاه داده اختصاصی برای هر سرویس، تاب آوری، امنیت و حریم خصوصی برنامه شما را بهبود می بخشد. همچنین این الگو احتمال وجود نقطه شکست واحد (Single Point of Failure) را از بین می برد.
در زیر مروری به سرفصل های زیر خواهیم داشت:
در معماری مناسب میکروسرویسها، هر سرویس تنها مالک دادههای خود است و مسئولیت مدیریت آن را به صورت مستقل بر عهده دارد. به این معنا که هیچ دو سرویسی نباید از یک پایگاه داده مشترک استفاده کنند. در عوض، هر سرویس باید پایگاه داده یا راهکار ذخیرهسازی داده مختص خود را داشته باشد تا بتواند به صورت مستقل و بدون تاثیر بر سایر سرویسها تکامل یابد.
نکات کلیدی:
اگرچه داشتن مالکیت مستقل داده ایدهآل است، بسیاری از سرویسها همچنان به اطلاعات دیگر سرویسها نیاز دارند. به عنوان مثال، سرویس سفرها (Trips) ممکن است به اطلاعات مسافران از سرویس مسافران (Passenger) یا اطلاعات رانندگان از سرویس رانندگان (Driver) نیاز داشته باشد.
گاهی ممکن است تمایل به استفاده از پایگاه داده مشترک یا درخواستهای همزمان برای دسترسی لحظهای به دادهها وجود داشته باشد. اما اشتراکگذاری یک منبع داده بهطور مشترک معمولاً وابستگیهایی ایجاد میکند که به پیچیدگی و کاهش مقیاسپذیری سیستم منجر میشود. در عوض، باید تفاوت بین اشتراکگذاری منبع داده و اشتراکگذاری دادهها را در نظر بگیریم.
راهحل: پیادهسازی مکانیزمهای تکرار داده و ذخیرهسازی محلی (Local Caching) تا هر سرویس بتواند یک کپی مستقل و بهروز از دادههای مورد نیاز خود را نگهداری کند.
درخواستهای همزمان (مثل APIهای RESTful) معمولاً برای بازیابی داده از سایر سرویسها استفاده میشوند، اما در یک محیط مقیاسپذیر، این روش چالشهای بسیاری دارد:
راهحل: به جای درخواستهای همزمان، از ارتباطات غیرهمزمان (Asynchronous Communication) و معماریهای رویداد محور (Event-Driven Architecture) استفاده کنید تا این ریسکها کاهش یابند.
برای حل مشکلات درخواستهای همزمان، بسیاری از سیستمهای میکروسرویسها از سازگاری نهایی (Eventual Consistency) استفاده میکنند. در این رویکرد، هر سرویس یک کپی محلی از دادههای مورد نیاز خود را نگهداری میکند و این دادهها را از طریق رویدادها بهروزرسانی میکند.
مزایای سازگاری نهایی:
مثال: سرویس Leaderboard میتواند یک نسخه کش شده از نام و آواتار هر کاربر را ذخیره کند و به صورت دورهای از طریق رویدادها آن را بهروزرسانی کند. هرچند این دادهها ممکن است کمی قدیمی باشند، اما این تاخیر معمولاً برای دادههای غیرحیاتی قابل قبول است.
هر میکروسرویس ممکن است به سازگاری خاص خود نیاز داشته باشد، بسته به نقش و حساسیت دادههایی که استفاده میکند. در اینجا چند مثال آورده شده است:
با تنظیم استراتژیهای سازگاری بر اساس نیازهای هر سرویس، میتوان تعادل خوبی بین استقلال و دقت دادهها برقرار کرد.
برای دستیابی به استقلال سرویس در معماری میکروسرویسها، باید ترکیبی از انتخابهای معماری و شیوههای عملی را به کار گرفت:
استقلال سرویسها در معماری میکروسرویسها برای دستیابی به یک سیستم مقیاسپذیر، مقاوم و قابل نگهداری حیاتی است. با مدیریت مناسب اشتراکگذاری دادهها، استفاده از ارتباطات غیرهمزمان و پیادهسازی سازگاری نهایی، میتوان میکروسرویسهایی مستقل و کارآمد ایجاد کرد.
با پذیرش این اصول، تیمها میتوانند از مزایای واقعی میکروسرویسها بهرهمند شوند: مقیاسپذیری مستقل، استقرار سریعتر و تحمل بالا در برابر خطاها.