Lower minimum delay between two requests to 1.5 seconds; no longer use delay if cache can be used

This commit is contained in:
pcjones
2024-02-19 14:19:57 +01:00
parent f804dd796f
commit 828faae486
2 changed files with 19 additions and 14 deletions

View File

@@ -20,6 +20,20 @@ namespace UmlautAdaptarr.Services
_cache = cache;
}
private static async Task EnsureMinimumDelayAsync(string targetUri)
{
var host = new Uri(targetUri).Host;
if (_lastRequestTimes.TryGetValue(host, out var lastRequestTime))
{
var timeSinceLastRequest = DateTimeOffset.Now - lastRequestTime;
if (timeSinceLastRequest < TimeSpan.FromMilliseconds(1500))
{
await Task.Delay(TimeSpan.FromMilliseconds(1500) - timeSinceLastRequest);
}
}
_lastRequestTimes[host] = DateTimeOffset.Now;
}
public async Task<HttpResponseMessage> ProxyRequestAsync(HttpContext context, string targetUri)
{
if (!HttpMethods.IsGet(context.Request.Method))
@@ -27,18 +41,6 @@ namespace UmlautAdaptarr.Services
throw new ArgumentException("Only GET requests are supported", context.Request.Method);
}
// Throttling mechanism
var host = new Uri(targetUri).Host;
if (_lastRequestTimes.TryGetValue(host, out var lastRequestTime))
{
var timeSinceLastRequest = DateTimeOffset.Now - lastRequestTime;
if (timeSinceLastRequest < TimeSpan.FromSeconds(3))
{
await Task.Delay(TimeSpan.FromSeconds(3) - timeSinceLastRequest);
}
}
_lastRequestTimes[host] = DateTimeOffset.Now;
// Check cache
if (_cache.TryGetValue(targetUri, out HttpResponseMessage cachedResponse))
{
@@ -46,6 +48,8 @@ namespace UmlautAdaptarr.Services
return cachedResponse!;
}
await EnsureMinimumDelayAsync(targetUri);
var requestMessage = new HttpRequestMessage
{
RequestUri = new Uri(targetUri),

View File

@@ -13,13 +13,14 @@ namespace UmlautAdaptarr.Services
private async Task EnsureMinimumDelayAsync()
{
var sinceLastRequest = DateTime.Now - lastRequestTime;
if (sinceLastRequest < TimeSpan.FromSeconds(2))
if (sinceLastRequest < TimeSpan.FromSeconds(1))
{
await Task.Delay(TimeSpan.FromSeconds(2) - sinceLastRequest);
await Task.Delay(TimeSpan.FromSeconds(1) - sinceLastRequest);
}
lastRequestTime = DateTime.Now;
}
// TODO add cache, TODO add bulk request
public async Task<(string? germanTitle, string[]? aliases)> FetchGermanTitleAndAliasesByExternalIdAsync(string mediaType, string externalId)
{
try