Alterada a inicialização da variável `_windowStart` no arquivo RateLimiter.cs para simplificar o cálculo do início da janela de tempo, removendo o arredondamento baseado no intervalo. No arquivo Program.cs, o limite de requisições do RateLimiter foi reduzido de 400/minuto para 12/segundo, permitindo um controle de taxa mais preciso e restritivo.
46 lines
1.3 KiB
C#
46 lines
1.3 KiB
C#
namespace Infrastructure
|
|
{
|
|
public class RateLimiter
|
|
{
|
|
private readonly int _maxRequests;
|
|
private readonly TimeSpan _interval;
|
|
private int _requestCount;
|
|
private DateTime _windowStart;
|
|
private readonly object _lock = new();
|
|
|
|
public RateLimiter(int maxRequests, TimeSpan interval)
|
|
{
|
|
_maxRequests = maxRequests;
|
|
_interval = interval;
|
|
var now = DateTime.Now;
|
|
_windowStart = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0);
|
|
_requestCount = 0;
|
|
}
|
|
|
|
public async Task WaitAsync(CancellationToken ct)
|
|
{
|
|
while (true)
|
|
{
|
|
lock (_lock)
|
|
{
|
|
if ((DateTime.Now - _windowStart) > _interval)
|
|
{
|
|
// reset janela
|
|
_windowStart = DateTime.Now;
|
|
_requestCount = 0;
|
|
}
|
|
|
|
if (_requestCount < _maxRequests)
|
|
{
|
|
_requestCount++;
|
|
return; // pode prosseguir
|
|
}
|
|
}
|
|
|
|
// já bateu o limite → espera até reset
|
|
await Task.Delay(200, ct); // aguarda 200ms e tenta de novo
|
|
}
|
|
}
|
|
}
|
|
}
|