پادشاهِ کُدنویسا شو!
کینگتو - آموزش برنامه نویسی تخصصصی - دات نت - سی شارپ - بانک اطلاعاتی و امنیت

پیاده سازی Load Balancing در ASP.NET CORE

19 بازدید 0 نظر ۱۴۰۴/۱۲/۱۰
وقتی اپلیکیشن ASP.NET Core شما از یک پروژه کوچک به یک سامانه بزرگ با هزاران کاربر همزمان تبدیل می‌شود، دیگر یک سرور واحد (هرچند قدرتمند) پاسخگو نخواهد بود. اینجاست که مفهوم مقیاس‌پذیری افقی (Horizontal Scaling) و قلب تپنده آن، یعنی Load Balancing (توازن بار)، وارد میدان می‌شود.

در این مقاله، بررسی می‌کنیم که چگونه بار ترافیکی را بین چندین نسخه از اپلیکیشن ASP.NET Core توزیع کنیم و با چه چالش‌هایی (مثل مدیریت Session و کلیدهای امنیتی) روبرو خواهیم شد.

 

Load Balancing چیست و چرا به آن نیاز داریم؟

تصور کنید یک فروشگاه شلوغ فقط یک صندوق‌دار داشته باشد. هر چقدر هم این شخص سریع باشد، در نهایت صف طولانی تشکیل می‌شود. راه‌حل؟ اضافه کردن صندوق‌دار‌های بیشتر.

در دنیای نرم‌افزار، Load Balancer نقش آن مدیر صف را دارد که مشتریان (درخواست‌های HTTP) را به خلوت‌ترین صندوق (سرور اپلیکیشن) هدایت می‌کند.

مزایای اصلی:

  • High Availability (پایداری بالا): اگر یک سرور کرش کند، بقیه سرورها بار را به دوش می‌کشند.

  • Scalability (مقیاس‌پذیری): هر زمان نیاز بود، می‌توانید سرور جدید اضافه کنید.

  • Performance (کارایی): توزیع بار باعث می‌شود هیچ سروری بیش از حد داغ (Overloaded) نشود.

 

روش‌های پیاده‌سازی Load Balancing در ASP.NET Core

برای توزیع بار در ASP.NET Core، سه مسیر اصلی وجود دارد:

۱. استفاده از YARP (Yet Another Reverse Proxy)

YARP پروژه‌ای از خود مایکروسافت است که با استفاده از دات‌نت ساخته شده. این ابزار به شما اجازه می‌دهد یک اپلیکیشن ASP.NET Core بسازید که به عنوان یک Load Balancer بسیار قدرتمند و سفارشی‌سازی شده عمل کند.

  • ویژگی‌ها: پشتیبانی از HTTP/2 و gRPC، قابلیت برنامه‌نویسی با C#، و عملکرد بسیار بالا.

  • سناریو: وقتی می‌خواهید منطق توزیع بار را بر اساس کدهای خودتان (مثلاً بر اساس نقش کاربری یا هدرهای خاص) مدیریت کنید.

۲. سرویس‌های جانبی (Nginx, HAProxy, IIS)

  • رایج‌ترین روش در محیط‌های عملیاتی (Production)، قرار دادن یک وب‌سرور قدرتمند قبل از اپلیکیشن‌های دات‌نتی است.
  • Nginx: محبوب‌ترین گزینه برای لینوکس.
  • HAProxy: متخصص توازن بار در لایه ۴ (TCP) و لایه ۷ (HTTP).
  • IIS: با استفاده از ماژول Application Request Routing (ARR) در محیط‌های ویندوزی.

۳. سرویس‌های ابری (Cloud Load Balancers)

  • اگر اپلیکیشن شما روی Azure یا AWS است، نیازی به نصب نرم‌افزار ندارید. سرویس‌هایی مثل Azure Load Balancer یا AWS ELB این کار را در سطح زیرساخت برای شما انجام می‌دهند.

 

 

چالش‌های فنی: وقتی یک سرور تبدیل به چند سرور می‌شود

بسیاری از توسعه‌دهندگان پس از پیاده‌سازی Load Balancer با باگ‌های عجیبی روبرو می‌شوند. دلیل آن این است که اپلیکیشن دیگر "یکپارچه" نیست. برای حل این مشکلات، باید ۳ گام زیر را طی کنید:

گام اول: اشتراک‌گذاری کلیدهای امنیتی (Data Protection)

  • ASP.NET Core برای رمزنگاری کوکی‌ها و توکن‌ها از سیستم Data Protection استفاده می‌کند. به صورت پیش‌فرض، کلیدهای رمزنگاری در حافظه یا پوشه‌ای در همان سرور ذخیره می‌شوند.

مشکل: اگر کاربر در سرور ۱ لاگین کند و درخواست بعدی‌اش به سرور ۲ برود، سرور ۲ نمی‌تواند کوکی را رمزگشایی کند و کاربر را "لاگ‌اوت" تشخیص می‌دهد.

راه‌حل: کلیدها را در یک فضای مشترک مثل Redis یا یک Network Share ذخیره کنید:

گام دوم: مدیریت حالت (State Management)

  • استفاده از Session در حافظه (In-Memory) دیگر کار نمی‌کند.

راه‌حل: همان‌طور که در مقاله قبلی گفتیم، باید از Distributed Cache (ترجیحاً Redis) برای ذخیره سشن‌ها استفاده کنید تا همه سرورها به یک منبع داده متصل باشند.

گام سوم: نشست‌های چسبنده (Sticky Sessions)

  • گاهی لازم است یک کاربر خاص همیشه به همان سروری هدایت شود که اولین درخواستش را پاسخ داده (مثلاً برای کارهای سنگینی که در حافظه موقت آن سرور ذخیره شده). به این قابلیت Session Affinity یا Sticky Sessions می‌گویند. بیشتر Load Balancerها این قابلیت را با استفاده از یک کوکی مخصوص پشتیبانی می‌کنند.

 

الگوریتم‌های توزیع بار

Load Balancer چگونه انتخاب می‌کند که درخواست را به کدام سرور بفرستد؟

  • Round Robin: درخواست‌ها را به ترتیب به سرورها می‌فرستد (۱، ۲، ۳، بازگشت به ۱).

  • Least Connections: درخواست را به سروری می‌فرستد که در آن لحظه کمترین تعداد اتصال فعال را دارد.

  • IP Hash: بر اساس IP کاربر تصمیم می‌گیرد (برای اینکه یک کاربر همیشه به یک سرور خاص برود).

در حالت ایده‌آل، پایداری سیستم (Availability) با فرمول زیر محاسبه می‌شود که در آن $p$ احتمال سالم بودن یک سرور و $n$ تعداد سرورهاست:

$$Availability = 1 - (1 - p)^n$$

این یعنی هر چه تعداد سرورها ($n$) بیشتر شود، احتمال از دسترس خارج شدن کل سیستم به شدت کاهش می‌یابد.

 

بررسی سلامت (Health Checks)

یک Load Balancer هوشمند نباید درخواست‌ها را به سروری که خاموش شده یا دیتابیسش قطع است بفرستد. در ASP.NET Core، شما باید قابلیت Health Checks را فعال کنید:

سپس Load Balancer را تنظیم کنید تا هر چند ثانیه یک‌بار به مسیر /health درخواست بزند. اگر پاسخ 200 OK نبود، آن سرور را موقتاً از چرخه خارج کند.

 

نتیجه‌گیری

پیاده‌سازی Load Balancing در ASP.NET Core صرفاً اضافه کردن یک سرور جدید نیست؛ بلکه نیاز به تغییر استراتژی در ذخیره‌سازی داده‌ها (Data Protection و Caching) دارد. بهترین ترکیب برای اکثر پروژه‌ها، استفاده از Nginx یا YARP به عنوان واسط، و Redis برای مدیریت وضعیت‌های مشترک است.

 
 
لینک استاندارد شده: RBY

0 نظر

    هنوز نظری برای این مقاله ثبت نشده است.
جستجوی مقاله و آموزش
دوره‌ها با تخفیفات ویژه