برنامههای بزرگ سمت سرور که با تعداد بسیار زیادی کاربر و داده سر و کار دارند، نباید فقط درگیر پاسخگویی سریع و فراهم کردن وب سرویسها برای پلتفرمهای مختلف باشند. این برنامهها باید بتوانند به سادگی رشد کرده، ارتقاء پیدا کنند و به روز شوند. برای ساخت و توسعه این نوع برنامهها، دو مدل معماری وجود دارد: یکی معماری Monolithic و دیگری معماری Microservices. برای شناخت معماری Microservices، ابتدا بایستی با معماری Monolithic آشنا شد.
معماری Monolithic چیست؟
در معماری Monolithic بخشهای مختلف برنامه سمت سرور از جمله پردازش پرداخت آنلاین، مدیریت حسابها، اعلانها و سایر بخشها همگی در یک واحد منفرد جمع شدهاند. به عبارتی اگر برنامه تحت وب که در سرور قرار دارد به صورت یک جا با تمام متعلقات خود برای پاسخ به درخواستهای سمت کلاینت، کار با پایگاه داده و انجام سایر الگوریتمها اجرا شود، این برنامه از معماری Monolithic استفاده میکند.
مشکلات معماری Monolithic
- در معماری Monolithic زمانیکه ترافیک برنامه در سمت سرور افزایش پیدا میکند، باید برای پاسخگویی، اندازه را افزایش داد. یعنی باید برنامه تحت وب خود را بر روی سرورهای مختلف مجددا اجرا نمود. بخشی به نام Load Balancer، وظیفه توزیع درخواستها را به سرورهای مختلف که بر روی هر یک، یک نسخه از برنامه در حال اجرا است، به عهده دارد. بر اساس توضیحی که از این معماری ارایه شد، در هر یک از این اجراها، کل برنامه با تمام متعلقاتی که دارد، فارغ از اینکه به همه آنها نیاز است یا نه، از منابع سرور استفاده میکند.
- در معماری Monolithic برنامهها بر اساس یک زبان برنامهنویسی مشخص، برای یک فریم ورک مشخص نوشته میشوند. این برنامهها اصطلاحا چند سکویی نیستند و کامپوننتهای نوشته شده برای آنها فقط در فریم ورک جاری قابل استفاده مجدد هستند.
- ممکن است برای هر تغییر ریز و درشت در برنامههای این معماری، نیاز به Build و Deploy مجدد کل برنامه باشد که احتمال از دسترس خارج شدن برنامه هم وجود دارد.
- اگر بخشی از برنامه از کار بیافتد، ممکن است باعث از کار افتادن کل برنامه یا بخشهایی از آن شود.
معماری Microservices
معماری Microservices راه نجات از مشکلات معماری Monolithic است. در معماری Microservices، برنامه سمت سرور به سرویسهای مختلفی تقسیم میشود. هر سرویس یک فرآیند پردازشی مستقل است که به عنوان یکی از قابلیتهای خاص برنامه سمت سرور به حساب میآید. به عنوان مثال یک سرویس وظیفه پرداختها را به عهده دارد و دیگری بطور مستقل برای مدیریت حسابها استفاده میشود. برنامههای نوشته شده با این معماری اجباری برای اجرا شدن در سرورهای جداگانه را ندارند، مگر اینکه یک سرویس، شرایط خاصی از جمله مصرف بالای RAM یا نیاز به پردازش ویژه و زیاد در CPU را داشته باشد. در اینصورت بهتر است که سرویس از یک سرور مجزا اجرا شود. لازم است که سرویسها در بستر شبکه با یکدیگر در ارتباط باشند.
در دیاگرام بالا میشود اینطور تصور کرد که Service1، یک وب سرور است که با مرورگر برای دریافت درخواستها در ارتباط است و باقی سرویسها حکم API برای عملیاتهای مختلف را دارند.
ارزش معماری Microservices
- از آنجایی که سرویسها از طریق زبان مشترک شبکه با یکدیگر در ارتباط هستند، میشود آنها را با زبانهای برنامهنویسی مختلف و بر روی فریمفرکهای متفاوت نوشت.
- بدیهی است که با این معماری، هر سرویس را میشود به صورت جداگانه ایجاد کرد و تغییر داد که باعث سرعت در به روزرسانی و فرآیند گسترش برنامه میشود.
- مانیتور کردن سرویسها سادهتر خواهد بود. از آنجایی که هر سرویس به صورت یک پردازش جداگانه اجرا خواهد شد، تعیین اینکه هر سرویس از چه منابعی و به چه اندازهای استفاده میکند، آسانتر خواهد بود.
- از آنجایی که این سرویسها از طریق شبکه در تبادل هستند، میشود از آنها در سایر برنامهها مجدداً استفاده کرد.
افزایش یک سرویس خاص
یکی از با ارزشترین قابلیتهای معماری Microservices، افزایش یک سرویس، که به عنوان مثال فقط یک وهله از آن در حال اجراست، به دو یا سه وهله جداگانه است؛ بدون آنکه نیاز باشد سرویسهای در ارتباط با آنها نیز وهله سازیهای اضافهای داشته باشند. این حالت در دیاگرام زیر قابل مشاهده است.
در دیاگرام بالا از سرویس یک، دو وهله، در دو سرور جداگانه ایجاد شده است که Load Balancer ترافیک ورودی را بین آنها تقسیم میکند. باقی سرویسها به همان تعداد که بودند باقی میمانند.
مشکلات معماری Microservices
- از آنجایی که برنامههای سمت سرور نوشته شده با این معماری به سرویسهای مختلفی تقسیم میشوند، گسترش و تنظیمات آنها میتواند کاری وقت گیر و طاقت فرسایی باشد.
- از آنجایی که ارتباط بین سرویسها در بستر شبکه انجام میشود، انتظار کندی عملکرد سرویسها دور از ذهن نیست.
- به دلیل ارتباطات شبکهای، احتمال آسیب پذیریهای امنیتی در این نوع برنامهها بیشتر است.
- نوشتن سرویسهایی که در بستر شبکه با سایر سرویسها در ارتباط هستند سختی و مشکلات خود را دارد. برنامهنویس در این شرایط، درگیر برقراری ارتباط، رمزگذاری دادهها در صورت نیاز و تبدیل آنها میشود.
- به دلیل مجزا بودن بخشهای مختلف برنامه، مانیتور کردن و ردیابی عملکرد سرویسها، یکی از کارهای اصلی توسعه دهنده یا استفاده کننده از برنامه است.
- در مجموع سرعت برنامههای نوشته شده با معماری Microservices کندتر از برنامههای نوشته شده با معماری Monolithic است. دلیل آن محیط اجرایی برنامهها است. برنامههایی با معماری Monolithic بر روی حافظه سرور پردازش میشوند.
چه زمانی از معماری Microservices استفاده کنیم؟
در واقع قاعده مشخصی برای انتخاب بین این دو معماری وجود ندارد. شاید بهترین دلیل برای استفاده از این معماری زمانی است که تیم توسعه دهنده به این نتیجه برسد که خصوصیات معماری Monolithic برای آنها مشکل به حساب میآید.
اگر تیم توسعه دهنده تصمیم بگیرد که از معماری Monolithic به نوع Microservices تغییر مسیر دهد، نیازی به نوشتن کل برنامه از ابتدا نیست. در این شرایط میتوان فقط کامپوننتهایی را که دردسر ساز شدهاند، به نوع سرویسی آن تبدیل کرد. به این نوع برنامههای سمت سروری که بخش اصلی برنامه به صورت Monolithic ولی برخی از عملکردهای خاص آن به صورت سرویسی نوشته شده باشد، اصطلاحا معماری Microservices با هسته Monolithic گفته میشود.
مدیریت دادهها:
در معماری Microservices، هر سرویس میتواند پایگاه داده خود را برای ذخیره دادهها داشته باشد و یا اینکه از یک پایگاه داده مرکزی بهره ببرد. استفاده از پایگاه دادهی مجزای برای هر سرویس، مشکلات خود را دارد. باید بین سرویسهای مختلف، همگام سازی صورت بگیرد که در این صورت، اگر یکی از سرویسها از کار بیافتد، سرویسهای وابسته به آن که دادهها بین آنها در تبادل هستند، دچار مشکل میشود و مسئله میتواند به سایر سرویسها که به صورت زنجیر وار به دادههای در حال تبادل یکدیگر وابسته هستند، سرایت کند. همچنین در این روش دادههای تکراری وجود خواهند داشت و در نهایت کدنویسی برای این سیستم مشکل خواهد بود.
در نتیجه بهتر این است که سرویسها با یک پایگاه داده مرکزی سر و کار داشته باشند و اگر سرویس خاصی نیاز داشته باشد که دادههای بخصوص خود را تولید کند و نمیخواهد آن را با سایر سرویسها به اشتراک بگذارد، میتواند پایگاه داده مخصوص به خود را داشته باشد. نکته مهم دیگر این است که سرویسها نباید به صورت مستقیم با پایگاه داده مرکزی در ارتباط باشند؛ بلکه به سرویسی مجزا، به نام "سرویس پایگاه داده" که وظیفه فراهم کردن APIهای مخصوص کار با پایگاه داده مرکزی را به عهده دارد، نیاز است.
پیادهسازی معماری Microservicesها توسط فریمفرک Seneca
Seneca یک فریم ورک Node.js است که برای ساخت برنامههای سمت سروری با معماری Microservices و هسته Monolithic استفاده میشود. در مطلب بعدی به این فریمورک نگاهی گذرا خواهیم داشت.
منبع : برنامه نویسان
لینک کوتاه این مطلب : snha.ir/1HBksY