Рекомендации для приложения ASP.NET с длительными синхронными запросами - PullRequest
2 голосов
/ 22 октября 2010

В 64-битном Windows Server 2008, IIS 7.0 и .NET 4.0, если приложение ASP.NET (с использованием пула потоков ASP.NET, синхронная обработка запросов) работает долго (> 30 минут). Веб-приложение не имеет страницы, и основная цель - это чтение огромных файлов (> 1 ГБ) порциями (~ 5 МБ) и передача их клиентам. Код:

while (reading)
{
    Response.OutputStream.Write(buffer, 0, buffer.Length);
    Response.Flush();
}

Один производитель - реализован шаблон с одним потребителем, поэтому для каждого запроса есть два потока. Я не использую библиотеку задач здесь, но, пожалуйста, дайте мне знать, если она имеет преимущество перед традиционным созданием потоков в этом сценарии. Обработчик HTTP (.ashx) используется вместо страницы (.aspx). В условиях стресс-теста загрузка ЦП не является проблемой, но с одним рабочим процессом, после 210 одновременных клиентов, новые соединения обнаруживают тайм-аут. Это решается веб-садоводством, так как я не использую состояние сеанса. Я не уверен, есть ли какая-то большая проблема, которую я пропустил, но, пожалуйста, дайте мне знать, какие другие соображения следует принять, по вашему мнению?

например, возможно, IIS закрывает долго работающие TCP-соединения из-за «тайм-аута соединения», поскольку обычные страницы ASP.NET обрабатываются менее чем за 5 минут, поэтому я должен увеличить значение. Я ценю ваши идеи.

Ответы [ 5 ]

2 голосов
/ 23 октября 2010

Во-первых, никогда.НИКОГДА.НИКОГДА!выполнить любую обработку, которая занимает более нескольких секунд в потоке пула потоков.Их ограниченное количество, и они используются системой для многих вещей.Это порождает проблемы.

Во-вторых, хотя обработчик - хорошая идея, вы немного не понимаете, что вы подразумеваете под «генерировать на лету». Вы имеете в виду, что шифруете файл на летуа это шифрование может занять 30 минут?Или вы имеете в виду, что вы извлекаете данные из базы данных и собираете файл?Или загрузка занимает 30 минут?

Редактировать:

Как я уже сказал, не используйте пул потоков для чего-либо, что долго работает.Создайте свой собственный поток или, если вы используете .NET 4, используйте задачу и задайте ее как долго выполняемую.

2 голосов
/ 22 октября 2010

Лично я бы посмотрел на другой механизм для этого типа обработки.HTTP-запросы / веб-приложения НЕ предназначены для такого типа вещей, и стабильность будет ОЧЕНЬ тяжелой, у вас есть ряд рисков, которые могут вызвать серьезные проблемы при работе с моделью такого типа.* Я бы переместил эту обработку в бэкэнд-процесс, чтобы вы находились вне Времени выполнения asp.net, чтобы у вас был больший контроль над пуском / выключением и т. Д.

1 голос
/ 22 октября 2010

Длительные процессы не должны быть реализованы таким образом.Передайте это службе, которую вы настроили.

Если вы действительно хотите, чтобы страница зависла для клиента, рассмотрите возможность взаимодействия с AJAX с чем-то, что не блокирует потоки ввода-вывода, например, node.js.1003 *

Push-уведомления для многих клиентов - это не то, что ASP.NET может обработать из-за использования потоков, поэтому мой node.js.Если ваша нагрузка низкая, у вас есть другие варианты.

0 голосов
/ 01 ноября 2010

Используйте Web-Gardening для большей стабильности вашего приложения.

Отключите кэширование, поскольку у вас нет страниц aspx

Трудно дать совет без анализа производительности.Вы встроенный VS и найти узкие места.

0 голосов
/ 22 октября 2010

Способ работы с длительными процессами в Web 1.0 заключается в том, чтобы порождать их на сервере и немедленно возвращать.Сделайте так, чтобы порожденный сервис обновлял базу данных с прогрессом, и страницы на сайте могут запрашивать прогресс.

Самое распространенное использование этого метода - получение посылки.Вы не можете держать HTTP-соединение открытым, пока не появится мой пакет, поэтому он просто дает вам возможность запрашивать прогресс.Фоновый процесс связан с организацией всех шагов, необходимых для получения предмета, его упаковки, погрузки в грузовик ИБП и т. Д. В течение всего процесса каждый шаг записывается в базу данных.Концептуально, это то же самое.

Редактирование на основе вопроса Редактирование: просто немедленно верните страницу результатов и сгенерируйте двоичный файл на сервере в порожденном потоке или процессе.Используйте Ajax, чтобы проверить, готов ли файл и когда он есть, укажите ссылку на него.

...