Следует ли мне беспокоиться об обработке пользовательских запросов или проблемах производительности из-за большого количества вызовов asyn c в моем приложении?
EF Core предоставляет интерфейс запросов Asyn c для репозиториев. Независимо от того, является ли это asyn c -all-the-way, или же методы Certian блокируют потоки пула потоков, зависит от поставщика EF. SQLServer SqlClient имеет методы Asyn c на основе задач, которые не блокируют потоки. Большинство других провайдеров тоже. Но, например, для поставщика EF в памяти или, возможно, поставщика SQLite это может быть asyn c -over-syn c, либо завершающееся синхронно и возвращающее завершенную задачу, либо блокирующее поток пула потоков.
Итак, EF обычно не блокирует ваши потоки. А когда вы выполняете Asyn c вызов базы данных, он освобождает поток вашего приложения, чтобы он мог выполнять больше работы. Нравится обрабатывать дополнительные запросы. Если у вас слишком много одновременных запросов к базе данных, каждый запрос начнет занимать больше времени.
Когда это происходит, вам нужен механизм, замедляющий скорость новых запросов к базе данных, иначе вы попадете в плохое состояние. Например, где находится сервер базы данных, выполняется 2000 запросов, большинство из которых отправляются от имени клиентов, которые сдались и истекло время ожидания. И новые запросы не обрабатываются своевременно из-за всех старых запросов.
Обычно пропускная способность увеличивается по мере того, как вы добавляете параллелизм до определенной точки, но после этого общая пропускная способность снижается, иногда резко. Примерно так:
Это зависит от вас, чтобы ограничить общий параллелизм, чтобы предотвратить серьезное снижение пропускной способности. Лучше отклонить некоторые запросы на раннем этапе (например, с HTTP 503), чем принимать их все и не выполнять ни одного в рамках вашего SLA.
Одно из преимуществ использования синхронного доступа к базе данных состоит в том, что он занимает поток приложения для продолжительность взаимодействия с базой данных, автоматически добавляя противодавление к потоку запросов. Наличие запроса, ожидающего потока пула потоков, когда все потоки пула потоков заняты, на самом деле хорошо. Когда вы go all asyn c этот элемент управления исчезает, и вам нужно подумать о его замене.
ASP. NET Ядро в настоящее время не имеет встроенного троттлинга. Хост вашего веб-сервера может иметь некоторые из них, и, например, ограничение пула соединений SqlConnection служит для ограничения количества одновременных запросов на экземпляр приложения. Но у вас должно быть что-то , которое позволяет вам упорядоченно обрабатывать всплеск объема запросов.