.NET Core Rate Limit: Nedir ve Nasıl Kullanılır?

Rate limiting (hız sınırlaması), bir uygulamanın belli bir zaman aralığında gelen talepleri kontrol altına almasını sağlayan önemli bir tekniktir. Bu, hem sunucu kaynaklarını korumak hem de sürdürülebilir bir hizmet sağlamak için çok önemlidir. Bu yazıda, .NET Core 7.0 üzerinde rate limiting'i nasıl uygulayabileceğinizi tüm özellikleriyle ve basit örneklerle açıklayacağız.

Rate Limiting Nedir ve Ne İşe Yarar?

Rate limiting, API'lerin çok sayıda istek alarak tükenmesini veya performansının düşmesini engellemek için belirli sınırlar getirir. Örneğin, bir kullanıcıya belirli bir zaman dilimi içerisinde sınırlı sayıda istek yapma hakkı verilir. Bu sayede, kaynakların daha dengeli dağılması ve çok sayıda istek alan sistemlerin korunması sağlanır.

.NET Core 7.0'da Rate Limiting Nasıl Uygulanır?

.NET Core 7.0, rate limiting işlemi için yerleşik destek sunmaktadır. Bu sayede ek bir kütüphane yüklemeden, framework'ün sağladığı araçlarla rate limiting yapabilirsiniz. Aşağıda .NET Core 7.0'da rate limiting'i nasıl uygulayabileceğimizi ve bu özelliklerin detaylarını göreceğiz.

Rate Limiting Türleri

.NET Core 7.0'da rate limiting için birden fazla yöntem bulunmaktadır:

  1. Fixed Window Limiter: Belirli bir zaman penceresi içinde izin verilen istek sayısını sınırlar.

  2. Sliding Window Limiter: İsteklerin belirli bir zaman dilimi içinde değerlendirilmesini sağlar ve bu pencere her istekte kaydırılır. Bu yöntem, daha esnek bir kontrol sağlar.

  3. Concurrency Limiter: Aynı anda işleme alınabilecek istek sayısını sınırlar. Bu yöntem, özellikle aynı anda birden fazla iş parçacığı gerektiren işlemlerde faydalıdır.

  4. Token Bucket Limiter: Belirli bir hızda "token" eklenmesini sağlar ve her istek bir token tüketir. Bu yöntem,

    isteklerin daha düzgün dağılmasını sağlar.

Adım Adım Rate Limit Kurulumu ve Kullanımı

  1. Program.cs Dosyasında Rate Limiting Ayarlarını Yapın

    .NET Core 7.0 ile birlikte rate limiting özelliklerini Program.cs dosyasında kolayca ayarlayabilirsiniz:

    using Microsoft.AspNetCore.RateLimiting;
    using System.Threading.RateLimiting;
    
    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddRateLimiter(options =>
    {
        options.AddFixedWindowLimiter("FixedWindow", config =>
        {
            config.Window = TimeSpan.FromMinutes(1);
            config.PermitLimit = 5;
            config.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
            config.QueueLimit = 2;
        });
    
        options.AddSlidingWindowLimiter("SlidingWindow", config =>
        {
            config.Window = TimeSpan.FromMinutes(1);
            config.SegmentsPerWindow = 4;
            config.PermitLimit = 5;
            config.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
            config.QueueLimit = 2;
        });
    
        options.AddConcurrencyLimiter("Concurrent", config =>
        {
            config.PermitLimit = 3;
            config.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
            config.QueueLimit = 1;
        });
    
        options.AddTokenBucketLimiter("TokenBucket", config =>
        {
            config.TokenLimit = 10;
            config.TokensPerPeriod = 5;
            config.ReplenishmentPeriod = TimeSpan.FromSeconds(30);
            config.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
            config.QueueLimit = 3;
        });
    });
    var app = builder.Build();
    
    // Rate limiting middleware'i kullanın
    app.UseRateLimiter();
    
    app.Run();
    • Yukarıdaki örnekte, farklı türde rate limiting stratejileri kullanılmıştır. Bu stratejilerle, belirli endpointler için farklı limitleme türleri uygulanabilir:

      • /api/fixed endpointi için bir dakika içinde en fazla 5 istek kabul edilir.

      • /api/sliding endpointi için Sliding Window limitlemesi uygulanır; bu, belirli zaman dilimlerine bölünmüş esnek bir kontrol sağlar.

      • /api/concurrent endpointi aynı anda en fazla 3 isteği kabul eder.

      • /api/token endpointi için belirli aralıklarla 10 token ile limitli istekler kabul edilir.

      Eğer app.MapGet ile belirli bir endpoint için rate limiting ayarı yapmazsanız, tüm endpointler varsayılan olarak GlobalLimiter ile belirtilen rate limiting ayarını kullanacaktır. Bu örnekte, GlobalLimiter olarak FixedWindow ayarı kullanılmıştır, bu yüzden tanımlanmamış tüm endpointler için FixedWindow limitlemesi geçerli olacaktır.

  2. Controller Üzerinde Rate Limiting Kullanımı

    Rate limiting kurulumunu Controller tabanlı API'lerde kullanmak için aşağıdaki gibi bir örnek oluşturabilirsiniz:

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.RateLimiting;
    
    [ApiController]
    [Route("api/[controller]")]
    public class RateLimitTestController : ControllerBase
    {
        [HttpGet("fixed")]
        [EnableRateLimiting("FixedWindow")]
        public IActionResult GetFixedWindow()
        {
            return Ok("Fixed Window isteğiniz kabul edildi.");
        }
    
        [HttpGet("sliding")]
        [EnableRateLimiting("SlidingWindow")]
        public IActionResult GetSlidingWindow()
        {
            return Ok("Sliding Window isteğiniz kabul edildi.");
        }
    
        [HttpGet("concurrent")]
        [EnableRateLimiting("Concurrent")]
        public IActionResult GetConcurrent()
        {
            return Ok("Concurrency isteğiniz kabul edildi.");
        }
    
        [HttpGet("token")]
        [EnableRateLimiting("TokenBucket")]
        public IActionResult GetTokenBucket()
        {
            return Ok("Token Bucket isteğiniz kabul edildi.");
        }
    }
    • Bu controller yapısında her endpoint, belirli bir rate limiting stratejisi ile sınırlandırılmıştır:

      • /api/ratelimittest/fixed endpointi için FixedWindow limitlemesi uygulanır.

      • /api/ratelimittest/sliding endpointi için SlidingWindow limitlemesi uygulanır.

      • /api/ratelimittest/concurrent endpointi için Concurrency limitlemesi uygulanır.

      • /api/ratelimittest/token endpointi için TokenBucket limitlemesi uygulanır.

      Eğer herhangi bir limitleme tanımlamazsanız, global rate limiting ayarı geçerli olur ve ilgili ayarlar kullanılır.

Rate Limiting Ayarları ve Özellikler

  • Permit Limit: Belirlenen zaman penceresi içinde izin verilen maksimum istek sayısını belirler.

  • Window: İsteklerin değerlendirileceği zaman penceresinin süresini belirler.

  • Segments Per Window (Sliding Window için): Zaman penceresinin kaç segmente bölüneceğini belirler. Bu, isteklere daha esnek bir şekilde yanıt verilmesini sağlar.

  • Queue Limit: İsteklerin sıraya alınıp alınmayacağı ve kaç isteğin sıraya alınacağı bilgisini belirler.

  • Queue Processing Order: Sıraya alınan isteklerin nasıl işleneceğini belirler. (Örneğin, OldestFirst ya da NewestFirst)

  • Replenishment Period (Token Bucket için): Tokenların ne sıklıkla ekleneceğini belirler.

Rate Limiting'in Avantajları

  • Kaynak Koruma: Rate limiting, sunucu kaynaklarını korumak için kullanılır ve ani yüklenmelerin sistem üzerinde yarattığı olumsuz etkileri azaltır.

  • Güvenlik: Saldırganların API'ı aşırı yüklemesini engelleyerek sistemin stabilitesini korumaya yardımcı olur.

  • Adil Kullanım: Kullanıcıların sistem kaynaklarından adil bir şekilde yararlanmasını sağlar.

Rate Limiting Kullanırken Dikkat Edilmesi Gerekenler

  • Kullanıcı Deneyimi: Sıkı rate limiting kuralları kullanıcı deneyimini olumsuz etkileyebilir. Bu yüzden uygun limitler seçilmelidir.

  • Gerçek Zamanlı Gereksinimler: Eğer uygulamanızda gerçek zamanlı verilere erişim gerekiyorsa, rate limiting ayarlarını dikkatlice yapmalısınız.

  • Alternatif Yöntemler: Belirli kullanıcılara daha yüksek limitler tanımlamak veya limitleri geçici olarak kaldırmak gibi esnek çözümler de değerlendirilebilir.

Sonuç

.NET Core 7.0 uygulamalarında rate limiting, yerleşik destek sayesinde basit bir kurulumla büyük faydalar sağlayabilir. Bu yazıda, .NET Core 7.0'da rate limiting'in farklı türlerini ve nasıl uygulanabileceğini öğrendik. Bu, hem kaynakların korunmasına hem de kullanıcı deneyiminin iyileşmesine katkı sağlayacaktır. Rate limiting stratejilerini doğru bir şekilde kullanarak uygulamanızın performansını ve güvenliğini artırabilirsiniz.