Separação em camadas. Utilização de estimativa para horas faltantes (entre 9 e 11 registros).
46 lines
1.4 KiB
C#
46 lines
1.4 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 - (now.Minute % interval.Minutes), 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
|
|
}
|
|
}
|
|
}
|
|
}
|