ASPNET 7 - Rate Limit
2022. 12. 1. 00:00ㆍASPNET/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}";
}
관련영상
반응형
'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 |