Я хотел бы создать сервис API отдыха Asp.net (с net5), и я хотел бы знать, на правильном ли я пути. Эта служба будет кэшировать значения из другой службы Y в течение X минут, если клиент будет запрашивать данные, и эти данные истекли в этой службе, он запросит у службы Y (с запросом GET) и обновит кеш.
Моя цель — создать сервис, который может обрабатывать также 100 запросов в секунду (я знаю, что на эти данные влияет то, сколько времени требуется для обработки client.GetAsync (), но я бы хотел избежать проблемы с cancelled_request или другой проблемы, когда вы управляли множеством подключений , я не совсем уверен, правильно ли я реализовал материал httpClient)
Через некоторое время, когда происходит много запросов, у меня появляется эта ошибка HTTPERR для этого вызова
[…] — 1 Request_Cancelled DefaultAppPool
потом через некоторое время начнут возвращаться на все звонки и услуга будет заморожена
[…] — 503 1 Н / Д DefaultAppPool
Я реализовал класс Startup с
services.AddHttpClient<DataController>(x => x.Timeout = TimeSpan.FromSeconds(5))
DataController
private readonly IHttpClientFactory _clientFactory;
private static readonly SemaphoreSlim SemaphoreSlim = new SemaphoreSlim(1, 100);
public DataController (ILogger<PriceController> logger, IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
[HttpGet("testRaw/{KeyId}")]
public async Task<IActionResult> GetTestRaw(uint KeyId)
{
//if data are update return data [...]
//if data expired
await SemaphoreSlim.WaitAsync();
try
{
return await UpdateService(KeyId);
}
finally
{
SemaphoreSlim.Release();
}
}
private async Task<string> UpdateService(uint keyId)
{
var client = _clientFactory.CreateClient();
using var response = await client.GetAsync("myserviceURL/"+ keyId);
if (!response.IsSuccessStatusCode)
return null;
string data = await response.Content.ReadAsStringAsync();
//update data to local cache [...]
return data
}