Когда вам действительно нужна асинхронность в веб-фреймворке?

Async стал модным словом в.net, и MS представила его в Web API 2, чтобы можно было обрабатывать больше запросов, пока другие ожидают завершения ввода-вывода.

Хотя я вижу выгоду от этого, действительно ли это вызывает беспокойство? В архитектуре x64 имеется более 30000 потоков в пуле потоков, поэтому, если у вас есть столько одновременных пользователей на вашем сайте, действительно ли требуется асинхронность? Даже если у вас столько одновременно работающих пользователей без кэширования, я почти уверен, что SQL Server будет зависать от такого количества запросов?

Помимо того, что это блестяще, когда есть реальная необходимость иметь асинхронную маршрутизацию в веб-фреймворке?

5 ответов

Решение

Многие другие ответы здесь приходят с точки зрения пользовательского интерфейса (настольного / мобильного приложения), а не с точки зрения веб-сервера.

Async стал модным словом в.net, и MS представила его в Web API 2, чтобы можно было обрабатывать больше запросов, пока другие ожидают завершения ввода-вывода.

async а также await были представлены в.NET 4.5 / VS 2012. Однако ASP.NET имеет возможность асинхронного запроса начиная с.NET 2.0 - очень давно. И были люди, использующие это.

Какие async а также await привести к таблице асинхронный код, который легко поддерживать.

Хотя я вижу выгоду от этого, действительно ли это вызывает беспокойство?

Основное преимущество async на сервере есть масштабируемость. Проще говоря, async задачи масштабируются гораздо лучше, чем потоки.

Комментарий @ Джошуа - ключ к памяти; поток занимает значительное количество памяти (и не забывайте, стек режима ядра, который не может быть выгружен), в то время как async запрос буквально занимает всего несколько сотен байтов.

Есть также разрыв, чтобы рассмотреть. Поток потоков в.NET имеет ограниченную скорость закачки, поэтому, если вы не установите minWorkerThread считайте до значения, намного большего, чем обычно, тогда, когда вы получаете пакет трафика, некоторые запросы будут выполняться до 503, прежде чем.NET сможет раскрутить достаточно потоков для их обработки. async сохраняет ваши потоки свободными (насколько это возможно), чтобы лучше справляться с интенсивным трафиком.

В архитектуре x64 имеется более 30000 потоков в пуле потоков, поэтому, если у вас есть столько одновременных пользователей на вашем сайте, действительно ли требуется асинхронность?

@ Джошуа снова прав, когда указывает, что вы, вероятно, думаете об ограничении очереди запросов (по умолчанию 1000 для очереди IIS и 5000 для ограничения запросов ASP.NET). Важно отметить, что после заполнения этой очереди (во время интенсивного трафика) новые запросы отклоняются с 503.

Даже если у вас столько одновременно работающих пользователей без кэширования, я почти уверен, что SQL Server будет зависать от такого количества запросов?

Ах, теперь это совсем другой вопрос.

Я выступаю с докладом на ThatConference 2013 специально async сервера. Одна часть этого разговора - это ситуации, когда async не помогает ( мое обновление в Твиттере).

Здесь есть отличная запись в блоге, в которой говорится, что асинхронные вызовы БД не стоят усилий. Важно отметить предположения в этом посте:

  1. На момент написания этой статьи асинхронные веб-серверы были сложными. В эти дни у нас есть async и все больше и больше библиотек предлагают асинхронные API (например, Entity Framework).
  2. Архитектура предполагает один веб-сервер с одним бэкэндом SQL Server. Традиционно это была очень распространенная установка, но сегодня она быстро меняется.

куда async Серверы действительно сияют, когда ваш бэкэнд также может масштабироваться. Например, веб-сервис, Azure SQL, кластер NoSQL и т. Д. Пример: я пишу сервер MVC/WebAPI, который использует Azure SQL и хранилище для своего бэкэнда (для всех практических целей я могу действовать так, как будто они имеют бесконечную масштабируемость); в этом случае я собираюсь сделать мой сервер async, В подобных ситуациях вы можете масштабировать свой сервер в 10 раз или больше, используя async,

Но если у вас есть только один бэкэнд SQL Server (и вы не планируете переходить на Azure SQL), то нет смысла делать ваш веб-сервер async потому что вы все равно ограничены вашим бэкэндом.

  1. Когда длинные операции могут эффективно выполняться параллельно. Например, вам нужно выполнить два SQL и загрузить три изображения - все пять операций сделать асинхронными и ожидать их всех. В этом случае общее время будет самой длинной продолжительностью пяти операций, но не суммой длительностей.
  2. Упреждающий. Если вы можете предсказать (с большой вероятностью), что будет делать пользователь (например, почти наверняка, он (-а) захочет увидеть детали...), вы можете начать подготовку следующей страницы (фрейма, окна), пока пользователь читает предыдущую.

Откуда ты взял 30000 Я точно не помню, но я думаю, что Asp.net использует 12 потоков ядра.

Я должен использовать асинхронный режим, когда операция занимает слишком много времени (загрузка, экспорт, обработка) и пользователь должен знать о прогрессе.

Вам нужно асинхронно в следующих сценариях

1) Когда вы выполняете очень длинную операцию и не хотите останавливать свой пользовательский интерфейс.

2) Когда вы разработали какую-то задачу, которую нужно выполнить в фоновом режиме.

Например, вы визуализируете изображения из базы данных. Но вы не хотите, чтобы ваша страница была заморожена в это время, поскольку асинхронность действительно полезна.

Другие вопросы по тегам