Очередь запросов IIS внезапно резко возрастает для веб-API .net 8 ⇐ C#

Место общения программистов C#
Anonymous
Очередь запросов IIS внезапно резко возрастает для веб-API .net 8

Сообщение Anonymous »

Это продолжение моего вопроса.
У нас есть веб-API .net 8.0, который получает большой трафик при полной загрузке, 1500 открытых запросов, 1500 запросов x 30 секунд, спорадически. набор запросов для 1500 клиентов.
Открытые запросы упоминаются в ссылке, которую я разместил выше, по сути, это запрос, который ожидает публикации сообщения в очереди RabbitMQ, который затем передается обратно клиенту. Запрос «зависает», но поскольку мы провели рефакторинг кода для использования ожиданий, потоки для этих открытых запросов не блокируются.
Вот потребительский код, который у нас есть:

Код: Выделить всё

ncChannel.QueueDeclare(queueName, true, false, false, null);
ncChannel.ExchangeDeclare(ExchangeName, ExchangeType.Topic, true, false, null);
ncChannel.QueueBind(queueName, ExchangeName, routingKey);
Channel responseChannel = Channel.CreateBounded(channelOptions);
EventHandler nextCommandHandler = async (object sender, BasicDeliverEventArgs msg) =>
{
try
{
if (msg != null && msg.Body.ToArray() != null)
{
string msgBody = Encoding.UTF8.GetString(msg.Body.ToArray());
//log
}
else
{
//log
}
await responseChannel.Writer.WriteAsync(msg);
responseChannel.Writer.TryComplete();
}
catch (Exception ex)
{
//log
}
};
consumer.Received += nextCommandHandler;
bool autoAck = true;
consumerTag = ncChannel.BasicConsume(queueName, autoAck, consumer);

CancellationTokenSource timeoutTokenSource = new CancellationTokenSource(55000);
using (CancellationTokenSource linkedToken = CancellationTokenSource.CreateLinkedTokenSource(timeoutTokenSource.Token, HttpContext.RequestAborted))
{
try
{
isMessageFound = await responseChannel.Reader.WaitToReadAsync(linkedToken.Token);
if (isMessageFound)
{
message = await responseChannel.Reader.ReadAsync();
//log; cancel consumer
}
else
{
//log
}
}
catch (OperationCanceledException)
{
isMessageFound = false;
if (timeoutTokenSource.IsCancellationRequested)
{
//log timeout
}
}
}
Клиент RabbititMQ 6.8.1 имеет известную проблему неправильного управления потоками, и изначально мы думали, что проблема именно в этом. Это должно было быть устранено путем установки значения ThreadPool.MinThreads на подходящую величину, чтобы уменьшить зависания, вызванные клиентом. Однако, похоже, это лишь маскирует проблему, поскольку, когда у нас есть развертывание, в котором база данных находится на другом сервере, сбой кажется лишь вопросом времени, независимо от того, какое значение мы установили для MinThreads.
Мы добавили код, чтобы попытаться определить, когда и как происходит исчерпание потока, поскольку мы замечаем симптом, заключающийся в том, что очереди запросов внезапно растут до тех пор, пока пул приложений не выйдет из строя. При чтении онлайн рост очереди запросов вызван исчерпанием потоков. Мы добавили ведение журнала, чтобы показать текущие доступные потоки, и все, что мы видим, это то, что всплеск очереди запросов происходит очень внезапно, никакого накопления не обнаружено.
Что нам действительно нужно, так это направление, чтобы проверьте, мы проверили код, средство просмотра событий, другие журналы, чтобы попытаться выяснить, что вызывает всплеск, но мы не можем ничего найти. Мы будем очень признательны за любую помощь.
Я нарисовал график двух разных прогонов с доступной записью потоков и вот несколько снимков экрана.
Изображение


Подробнее здесь: https://stackoverflow.com/questions/791 ... -8-web-api

Вернуться в «C#»