در این مقاله، بررسی میکنیم که چگونه بار ترافیکی را بین چندین نسخه از اپلیکیشن ASP.NET Core توزیع کنیم و با چه چالشهایی (مثل مدیریت Session و کلیدهای امنیتی) روبرو خواهیم شد.
تصور کنید یک فروشگاه شلوغ فقط یک صندوقدار داشته باشد. هر چقدر هم این شخص سریع باشد، در نهایت صف طولانی تشکیل میشود. راهحل؟ اضافه کردن صندوقدارهای بیشتر.
در دنیای نرمافزار، Load Balancer نقش آن مدیر صف را دارد که مشتریان (درخواستهای HTTP) را به خلوتترین صندوق (سرور اپلیکیشن) هدایت میکند.
مزایای اصلی:
High Availability (پایداری بالا): اگر یک سرور کرش کند، بقیه سرورها بار را به دوش میکشند.
Scalability (مقیاسپذیری): هر زمان نیاز بود، میتوانید سرور جدید اضافه کنید.
Performance (کارایی): توزیع بار باعث میشود هیچ سروری بیش از حد داغ (Overloaded) نشود.
برای توزیع بار در ASP.NET Core، سه مسیر اصلی وجود دارد:
۱. استفاده از YARP (Yet Another Reverse Proxy)
YARP پروژهای از خود مایکروسافت است که با استفاده از داتنت ساخته شده. این ابزار به شما اجازه میدهد یک اپلیکیشن ASP.NET Core بسازید که به عنوان یک Load Balancer بسیار قدرتمند و سفارشیسازی شده عمل کند.
ویژگیها: پشتیبانی از HTTP/2 و gRPC، قابلیت برنامهنویسی با C#، و عملکرد بسیار بالا.
سناریو: وقتی میخواهید منطق توزیع بار را بر اساس کدهای خودتان (مثلاً بر اساس نقش کاربری یا هدرهای خاص) مدیریت کنید.
۲. سرویسهای جانبی (Nginx, HAProxy, IIS)
۳. سرویسهای ابری (Cloud Load Balancers)

بسیاری از توسعهدهندگان پس از پیادهسازی Load Balancer با باگهای عجیبی روبرو میشوند. دلیل آن این است که اپلیکیشن دیگر "یکپارچه" نیست. برای حل این مشکلات، باید ۳ گام زیر را طی کنید:
گام اول: اشتراکگذاری کلیدهای امنیتی (Data Protection)
مشکل: اگر کاربر در سرور ۱ لاگین کند و درخواست بعدیاش به سرور ۲ برود، سرور ۲ نمیتواند کوکی را رمزگشایی کند و کاربر را "لاگاوت" تشخیص میدهد.
راهحل: کلیدها را در یک فضای مشترک مثل Redis یا یک Network Share ذخیره کنید:
گام دوم: مدیریت حالت (State Management)
راهحل: همانطور که در مقاله قبلی گفتیم، باید از Distributed Cache (ترجیحاً Redis) برای ذخیره سشنها استفاده کنید تا همه سرورها به یک منبع داده متصل باشند.
گام سوم: نشستهای چسبنده (Sticky Sessions)
Load Balancer چگونه انتخاب میکند که درخواست را به کدام سرور بفرستد؟
Round Robin: درخواستها را به ترتیب به سرورها میفرستد (۱، ۲، ۳، بازگشت به ۱).
Least Connections: درخواست را به سروری میفرستد که در آن لحظه کمترین تعداد اتصال فعال را دارد.
IP Hash: بر اساس IP کاربر تصمیم میگیرد (برای اینکه یک کاربر همیشه به یک سرور خاص برود).
در حالت ایدهآل، پایداری سیستم (Availability) با فرمول زیر محاسبه میشود که در آن $p$ احتمال سالم بودن یک سرور و $n$ تعداد سرورهاست:
$$Availability = 1 - (1 - p)^n$$
این یعنی هر چه تعداد سرورها ($n$) بیشتر شود، احتمال از دسترس خارج شدن کل سیستم به شدت کاهش مییابد.
یک Load Balancer هوشمند نباید درخواستها را به سروری که خاموش شده یا دیتابیسش قطع است بفرستد. در ASP.NET Core، شما باید قابلیت Health Checks را فعال کنید:
سپس Load Balancer را تنظیم کنید تا هر چند ثانیه یکبار به مسیر /health درخواست بزند. اگر پاسخ 200 OK نبود، آن سرور را موقتاً از چرخه خارج کند.
پیادهسازی Load Balancing در ASP.NET Core صرفاً اضافه کردن یک سرور جدید نیست؛ بلکه نیاز به تغییر استراتژی در ذخیرهسازی دادهها (Data Protection و Caching) دارد. بهترین ترکیب برای اکثر پروژهها، استفاده از Nginx یا YARP به عنوان واسط، و Redis برای مدیریت وضعیتهای مشترک است.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.