У нас есть веб-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
}
}
}
Мы добавили код, чтобы попытаться определить, когда и как происходит исчерпание потока, поскольку мы замечаем симптом, заключающийся в том, что очереди запросов внезапно растут до тех пор, пока пул приложений не выйдет из строя. При чтении онлайн рост очереди запросов вызван исчерпанием потоков. Мы добавили ведение журнала, чтобы показать текущие доступные потоки, и все, что мы видим, это то, что всплеск очереди запросов происходит очень внезапно, никакого накопления не обнаружено.
Что нам действительно нужно, так это направление, чтобы проверьте, мы проверили код, средство просмотра событий, другие журналы, чтобы попытаться выяснить, что вызывает всплеск, но мы не можем ничего найти. Мы будем очень признательны за любую помощь.
Я нарисовал график двух разных прогонов с доступной записью потоков и вот несколько снимков экрана.
Подробнее здесь: https://stackoverflow.com/questions/791 ... -8-web-api