ASP.NET большое количество одновременных загрузок - PullRequest
2 голосов
/ 26 июня 2011

В настоящее время у меня есть веб-приложение, в котором около 500 пользователей.Чего я не ожидал, так это того, что веб-приложение работает ужасно при такой нагрузке.Посещение любой страницы приводит к минутам ожидания.По сути, каждый пользователь, пользуясь основной функцией веб-приложения, вызывает процесс, в котором я считываю несколько байтов с другого веб-сервера, а затем перенаправляю эти данные в браузер пользователей.Страница работает нормально, пока не достигнет определенной нагрузки около 200-300 одновременных процессов загрузки, как описано ранее.

Я использую IIS 7.5 и ASP.NET (4).Для доступа к базе данных я использую LINQ TO SQL.Я уже настроил IIS и удалил все ограничения, такие как максимальное число одновременных операций на процессор и т. Д. Я потерял надежду на то, что конфигурация IIS в этом случае проблематична.Я боюсь, что мой код дает такие результаты для IIS или что даже такой подход является основной причиной этой проблемы.

В настоящее время он работает следующим образом:

  • Пользователь посещает EG.aspx

  • EG.aspx использует .NET HTTP Post и GET-запросы для авторизации на другом веб-сервере.

  • EG.aspx открывает поток для чтения со второго веб-сервера (загрузка файла)

  • EG.aspx читает 1024 байта со второго веб-сервера и записывает эти 1024 байта в браузер

Все заголовки и т. Д. Установлены правильно.Я не использую новые темы во время этого процесса.Это просто длинный метод, выполняющий все эти шаги.Загрузка файлов довольно большая (около 100 МБ).В течение всего этого времени, необходимого для передачи такого файла пользователю, на странице выполняется указанный процесс.Каждый пользователь может запустить этот процесс несколько раз (загрузить несколько файлов).

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

Ответы [ 3 ]

1 голос
/ 26 июня 2011

Веб-серверы - особенно толстые веб-серверы, такие как IIS или Apache - на самом деле очень быстро работают с параллельными пользователями.ASP.NET усугубляет это из-за особенностей.Что вам нужно сделать, так это разгрузить этот процесс, чтобы он каким-то образом происходил за пределами веб-запроса клиента на ваш сервер.Самый простой способ добраться туда - использовать некую шину сообщений, такую ​​как MassTransit или NServiceBus.Тогда вы можете заставить его работать следующим образом:

  1. Пользовательские запросы EG.ASPX
  2. EG.ASPX создает сообщение в служебной шине и возвращает какую-то страницу «запрос обработки».
  3. Шина сообщений обрабатывает сообщение и загружает файл или получает сообщение об ошибке или что-то в этом роде.
  4. Пользователь как-то уведомляется о результатах - множество способов сделать это - что его файл готов
  5. Пользователь заходит на соответствующую страницу, чтобы получить свой файл.

Для уведомлений вы можете обработать его несколькими способами:

  • Если это довольно короткая транзакция, выВозможно, на странице «Пожалуйста, подождите» выполняется пингбэк ajax.
  • Если он дольше работает, возможно, вы захотите отправить электронное письмо пользователям, когда оно будет готово.
  • Если у вас есть страница портала пользователя, вы, вероятно, могли бы работать с ней там.

Но, суть в том, что обрабатывать это непосредственно на вашей странице ASP.NET довольно глупо.

1 голос
/ 26 июня 2011

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

Используете ли вы балансировку нагрузки?Одновременная передача нескольких сотен файлов размером 100 МБ - это большая пропускная способность для одного сервера.

0 голосов
/ 26 июня 2011

не можете ли вы кэшировать байты в течение определенного периода времени?

Храните их в статическом словаре, используйте блокировку, вы увидите огромный прирост производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...