ASPNET 7 - Rate Limit

2022. 12. 1. 00:00ASPNET/ASPNET 7

반응형

Microsoft.AspNetCore.RateLimiting 미들웨어는 속도 제한 미들웨어를 제공한다.

앱은 속도 제한 정책을 구성한 다음, 정책을 엔드포인트에 연결한다. 

 

속도 제한 알고리즘

  • Fixed window
  • Sliding window
  • Token bucket
  • Concurrency

위와 같은 4가지 종류의 알고리즘이 있다.

 

사용하기 위에서는 아래와 같은 코드를 Program.cs 에 추가해야 한다. 

builder.Services.AddRateLimiter(options =>
{
  // 각 알고리즘별 code
}

...

app.UseRateLimiter();

기본적인 코드는 아래와 같다.

 

Program.cs

Global Fixed window Rate Limit

...
builder.Services.AddRateLimiter(options =>
{
    options.RejectionStatusCode = 429; // Rate Lime 을 넘어가면 429 error code return
    options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(httpContext =>
        RateLimitPartition.GetFixedWindowLimiter(
            partitionKey: httpContext.User.Identity?.Name ?? httpContext.Request.Headers.Host.ToString(),
            factory: partition => new FixedWindowRateLimiterOptions
            {
                AutoReplenishment = true, 
                PermitLimit = 10, // 한번에 10개 까지 요청 처리
                QueueLimit = 0, // Queue 에 담아서 처리 할 수 있는 개수 
                Window = TimeSpan.FromSeconds(10) // 10초 동안 
            }));
});
...
app.UseRateLimiter();
...
app.MapGet("/", () => "Hello World!");

app.Run();

위와 같이 global 영역에 작업하면 모든 Api 에 기본적인 Rate Limit 이 적용된다. 

 

특정 API 에 적용하게 하려면 다음과 같이 할 수 있다. 

Policy 를 설정하고 적용하는 방식이다. 

builder.Services.AddRateLimiter(_ => _
    .AddFixedWindowLimiter(policyName: "fixed", options => //policy 이름 설정
    {
        options.AutoReplenishment = true;
        options.PermitLimit = 10;
        options.Window = TimeSpan.FromSeconds(10);
        options.QueueLimit = 0;
    }));

...
...
app.MapGet("/require-rate-limiting", () => "Hello World!")
   .RequireRateLimiting("fixed"); // 해당 Policy 적용
...

 

이러한 Policy 를 지정하는 방식은 Controller 에서도 적용가능 하다.

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.RateLimiting;

namespace RateLimit.Controllers;
[ApiController]
[Route("[controller]")]

public class RateLimitControllerController : ControllerBase
{
    private readonly ILogger<RateLimitControllerController> _logger;
    public RateLimitControllerController(ILogger<RateLimitControllerController> logger)
    {
        _logger = logger;
    }
    [HttpGet]
    public string Get() => $"Hello!! {DateTime.Now.Ticks}";
    [HttpGet("policy")]
    [EnableRateLimiting("fixed")]
    public string GetWithPolicy() => $"Hello!! {DateTime.Now.Ticks}";
}

 

관련영상

https://youtu.be/7me2x9IYxrs

 

반응형

'ASPNET > ASPNET 7' 카테고리의 다른 글

gRPC HealthCheck  (0) 2022.12.15
ASPNET 7 - Endpoint Filter  (0) 2022.12.12
ASPNET 7 - Authentication  (0) 2022.12.08
ASPNET 7 - Route Group and Swagger  (0) 2022.12.05
ASPNET 7 - Output Cache  (0) 2022.11.28