Skip to content

Instantly share code, notes, and snippets.

@rodion-m
Last active October 26, 2023 14:48
Show Gist options
  • Save rodion-m/4a631e3acb3597c748652f010ec5b404 to your computer and use it in GitHub Desktop.
Save rodion-m/4a631e3acb3597c748652f010ec5b404 to your computer and use it in GitHub Desktop.
Задача о блокирующих методах и пропускной способности в ASP.NET Core

Задача о блокирующих методах и пропускной способности в ASP.NET Core

В мире технологий каждый мгновенный успех может обернуться новым испытанием. Так случилось и с Васей.

Ведущая мировая компания поручила ему миссию, достойную супергероя — создать бекенд для их нового сервиса. Желая соответствовать высоким стандартам заказчика, Вася решил использовать проверенную и надежную ASP.NET Core. После недель напряженной работы сервис был готов, и компания с гордостью запустила его в массы.

В первые же часы после запуска к сервису присоединились сотни тысяч пользователей. Но вместо восторженных откликов Вася столкнулся с неожиданным противником: низкой пропускной способностью. Великий поток запросов стал препятствием для безупречной работы сервиса.

Вася, словно настоящий детектив, начал расследование. Его анализы и тесты показали, что корень проблемы скрывается в частично блокирующих долгих IO-методах. Как же так? Переписывать их на асинхронные было бы идеальным решением, но требовало бы слишком много времени и ресурсов.

Масштабирование, которое могло бы стать "магическим пластырем", также оказалось бессильным перед этим вызовом. Вася понял, что ему предстоит искать нестандартные решения.

Теперь он стоит перед главным выбором своей карьеры: вернуться к чертежной доске и начать всё сначала или же найти гениальное решение, которое спасет день и превратит его в настоящего героя мира технологий.

public class GitService
{
// Вася не может взять в толк, как сделать так, чтобы этот метод не тормозил все веб-приложение на ASP.NET Core.
public string ReadGitFile(string repoUri, string fileName)
{
using var repo = new Repository(repoUri); //from LibGit2Sharp
var readmeBlob = (Blob) repo.Head[fileName].Target;
return readmeBlob.GetContentText();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment