🚀 प्रदर्शन और स्केलेबिलिटी को समझना
<पी> कार्यान्वयन में उतरने से पहले, आइए दो महत्वपूर्ण अवधारणाओं को परिभाषित करें:- <पी> प्रदर्शन :आपका एप्लिकेशन किसी एक अनुरोध पर कितनी तेजी से प्रतिक्रिया देता है।
(उदाहरण:प्रतिक्रिया समय को 300 एमएस से घटाकर 100 एमएस)। पी> - <पी> स्केलेबिलिटी :आपका एप्लिकेशन बढ़े हुए लोड को कितनी अच्छी तरह संभालता है।
(उदाहरण:क्रैश हुए बिना 10,000 समवर्ती उपयोगकर्ताओं को संभालना)। पी>
⚙️ एसिंक्रोनस प्रोग्रामिंग का उपयोग करना
<पी> ASP.NET कोर रनटाइम एसिंक्रोनस I/O संचालन के लिए अनुकूलित है .async का उपयोग करके और await कीवर्ड, आप एक साथ अधिक अनुरोधों को संभालने के लिए थ्रेड्स को मुक्त कर सकते हैं। ✅ उदाहरण:एसिंक्रोनस कंट्रोलर एक्शन
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private readonly IProductService _productService;
public ProductsController(IProductService productService)
{
_productService = productService;
}
[HttpGet("{id}")]
public async Task<IActionResult> GetProductById(int id)
{
var product = await _productService.GetProductAsync(id);
if (product == null)
return NotFound();
return Ok(product);
}
}
<पी> Task<IActionResult> का उपयोग करके , डेटाबेस क्वेरीज़ या एपीआई कॉल जैसे I/O-बाउंड ऑपरेशंस की प्रतीक्षा करते समय थ्रेड ब्लॉक नहीं होता है। यह भारी भार के तहत स्केलेबिलिटी में नाटकीय रूप से सुधार करता है। 🧩 मिडिलवेयर पाइपलाइन को अनुकूलित करें
<पी> मिडलवेयर घटक प्रत्येक अनुरोध को क्रमिक रूप से संभालते हैं। अपने मिडलवेयर को हल्का रखें और अनावश्यक प्रोसेसिंग से बचें।✅ उदाहरण:कस्टम लाइटवेट मिडलवेयर
public class RequestTimingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<RequestTimingMiddleware> _logger;
public RequestTimingMiddleware(RequestDelegate next, ILogger<RequestTimingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
var start = DateTime.UtcNow;
await _next(context);
var elapsed = DateTime.UtcNow - start;
_logger.LogInformation($"Request took {elapsed.TotalMilliseconds} ms");
}
}
// Registration in Program.cs
app.UseMiddleware<RequestTimingMiddleware>();
<पी> 👉टिप :हल्के मिडलवेयर को शीर्ष पर रखें (जैसे रूटिंग या कम्प्रेशन), और भारी मिडलवेयर (जैसे प्रमाणीकरण) को पाइपलाइन में नीचे रखें।
⚡ रिस्पांस कैशिंग सक्षम करें
<पी> कैशिंग से परिणामों की पुनः गणना करने या डेटाबेस को बार-बार हिट करने की आवश्यकता कम हो जाती है। ASP.NET कोर एक अंतर्निहित रिस्पॉन्स कैशिंग मिडलवेयर प्रदान करता है .✅ उदाहरण:रिस्पांस कैशिंग सक्षम करें
// In Program.cs
builder.Services.AddResponseCaching();
var app = builder.Build();
app.UseResponseCaching();
app.MapGet("/time", (HttpContext context) =>
{
context.Response.GetTypedHeaders().CacheControl =
new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
{
Public = true,
MaxAge = TimeSpan.FromSeconds(30)
};
return DateTime.UtcNow.ToString("T");
});
<पी> अब, बाद के अनुरोधों को 30 सेकंड के भीतर कैश से पूरा किया जाएगा - प्रदर्शन में काफी सुधार होगा। 🧠 EF Core के साथ डेटा एक्सेस को अनुकूलित करें
<पी> डेटाबेस पहुंच अक्सर मुख्य बाधा होती है। एंटिटी फ्रेमवर्क कोर का उपयोग करें कुशलतापूर्वक लागू करके:- <पी> AsNoTracking() केवल पढ़ने योग्य प्रश्नों के लिए
- <पी> संकलित प्रश्न बार-बार पहुंच के लिए
- <पी> कनेक्शन पूलिंग पी>
✅ उदाहरण: का उपयोग करना AsNoTracking()
public async Task<IEnumerable<Product>> GetAllProductsAsync()
{
return await _context.Products
.AsNoTracking() // Improves performance
.ToListAsync();
}
<पी> यदि आप बार-बार इसी तरह की क्वेरी चलाते हैं, तो संकलित क्वेरी पर विचार करें :
private static readonly Func<AppDbContext, int, Task<Product?>> _getProductById =
EF.CompileAsyncQuery((AppDbContext context, int id) =>
context.Products.FirstOrDefault(p => p.Id == id));
public Task<Product?> GetProductAsync(int id) =>
_getProductById(_context, id);
🧰 आउटपुट कंप्रेशन का उपयोग करें
<पी> क्लाइंट को भेजने से पहले प्रतिक्रियाओं को संपीड़ित करने से बैंडविड्थ का उपयोग कम हो जाता है और डिलीवरी में तेजी आती है।✅ उदाहरण:प्रतिक्रिया संपीड़न सक्षम करें
// In Program.cs
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
options.MimeTypes = new[] { "text/plain", "application/json" };
});
var app = builder.Build();
app.UseResponseCompression();
<पी> अब सभी application/json प्रतिक्रियाएँ स्वचालित रूप से GZIP-संपीड़ित हो जाएंगी। 🌍 लोड संतुलन के साथ स्केलिंग
<पी> ट्रैफ़िक बढ़ने पर प्रदर्शन ट्यूनिंग पर्याप्त नहीं है। स्केलेबिलिटी अक्सर इसका उपयोग करके कई सर्वरों पर लोड वितरित करना शामिल होता है:- <पी> क्षैतिज स्केलिंग :अधिक सर्वर जोड़ना
- <पी> लोड बैलेंसर्स :एनजीआईएनएक्स, एज़्योर फ्रंट डोर, एडब्ल्यूएस ईएलबी, आदिपी>
✅ उदाहरण:वितरित कैश (रेडिस) कॉन्फ़िगर करें
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379";
});
public class CacheService
{
private readonly IDistributedCache _cache;
public CacheService(IDistributedCache cache)
{
_cache = cache;
}
public async Task SetCacheAsync(string key, string value)
{
await _cache.SetStringAsync(key, value, new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5)
});
}
public Task<string?> GetCacheAsync(string key) => _cache.GetStringAsync(key);
}
<पी> इससे आपका ऐप स्टेटलेस हो जाता है , जो लोड संतुलन के लिए आवश्यक है। 🧩 उच्च थ्रूपुट के लिए केस्ट्रेल और होस्टिंग कॉन्फ़िगर करें
<पी> Kestrel, अंतर्निहित ASP.NET कोर वेब सर्वर, ठीक से कॉन्फ़िगर होने पर प्रति सेकंड सैकड़ों हजारों अनुरोधों को संभाल सकता है।✅ उदाहरण:केस्ट्रेल कॉन्फ़िगरेशन को अनुकूलित करें
builder.WebHost.ConfigureKestrel(options =>
{
options.Limits.MaxConcurrentConnections = 10000;
options.Limits.MaxConcurrentUpgradedConnections = 1000;
options.Limits.RequestHeadersTimeout = TimeSpan.FromSeconds(30);
});
<पी> इसके अतिरिक्त: - <पी> रिवर्स प्रॉक्सी सर्वर का उपयोग करें (जैसे एनजीआईएनएक्स या आईआईएस) स्थिर फ़ाइल प्रबंधन और टीएलएस समाप्ति के लिए।पी>
- <पी> कंटेनरीकृत वातावरणमें तैनात करें ऑटो-स्केलिंग के लिए (उदाहरण के लिए, कुबेरनेट्स)।
🧮 मेमोरी और ऑब्जेक्ट पूलिंग का उपयोग करें
<पी> बार-बार ऑब्जेक्ट आवंटन और कचरा संग्रहण से बचने के लिए, ASP.NET कोर ऑब्जेक्ट पूलिंग का समर्थन करता है .✅ उदाहरण: का उपयोग करना ArrayPool<T>
using System.Buffers;
public class BufferService
{
public void ProcessData()
{
var pool = ArrayPool<byte>.Shared;
var buffer = pool.Rent(1024); // Rent 1KB buffer
try
{
// Use the buffer
}
finally
{
pool.Return(buffer);
}
}
}
<पी> यह दृष्टिकोण ढेर आवंटन को कम करता है और जीसी दबाव को कम करता है - प्रदर्शन-संवेदनशील अनुप्रयोगों के लिए महत्वपूर्ण। 🧱 स्टार्टअप समय और मेमोरी फ़ुटप्रिंट को कम करें
- <पी> अनावश्यक सेवाओं से बचें
Program.csमें . - <पी> AddSingleton का उपयोग करें AddTransient के बजाय जहां उचित हो.
- <पी> निर्भरताओं को ट्रिम करें
*.csprojमें फ़ाइलें.
✅ उदाहरण:न्यूनतम एपीआई सेटअप
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<IProductService, ProductService>();
var app = builder.Build();
app.MapGet("/products", async (IProductService service) =>
await service.GetAllProductsAsync());
app.Run();
<पी> न्यूनतम एपीआई बॉयलरप्लेट को कम करते हैं और स्टार्टअप प्रदर्शन में सुधार करते हैं। 📊 निगरानी और बेंचमार्किंग
<पी> आप जिसे मापते नहीं उसे सुधार नहीं सकते। जैसे टूल का उपयोग करें:- <पी> डॉटनेट-ट्रेस और डॉटनेट-काउंटर पी>
- <पी> एप्लिकेशन अंतर्दृष्टि पी>
- <पी> बेंचमार्कडॉटनेट पी>
✅ उदाहरण:बेंचमार्कडॉटनेट का उपयोग करना
[MemoryDiagnoser]
public class PerformanceTests
{
private readonly ProductService _service = new();
[Benchmark]
public async Task FetchProducts()
{
await _service.GetAllProductsAsync();
}
}
<पी> बाधाओं और स्मृति अक्षमताओं की पहचान करने के लिए इस बेंचमार्क को चलाएँ। 🧩 अतिरिक्त अनुकूलन युक्तियाँ
- <पी> HTTP/2 या HTTP/3 सक्षम करें बेहतर समानता के लिए।
- <पी> सीडीएन का उपयोग करें स्थैतिक संपत्तियों के लिए।
- <पी> रोजगारकनेक्शन पूलिंग डेटाबेस और HTTP क्लाइंट के लिए।
- <पी>
IHttpClientFactoryका प्रयोग करें सॉकेट थकावट को रोकने के लिए।
builder.Services.AddHttpClient("MyClient")
.SetHandlerLifetime(TimeSpan.FromMinutes(5));