Обработка долгосрочных отчетов - PullRequest
8 голосов
/ 01 октября 2008

Я работаю над приложением ASP.net, написанным на C # с базой данных Sql Server 2000. У нас есть несколько отчетов в формате PDF, которые клиенты используют для своих бизнес-задач. Проблема заключается в том, что создание этих отчетов занимает некоторое время (> 3 минуты). Обычно происходит то, что когда пользователь запрашивает отчет, тайм-аут запроса убивает запрос до того, как веб-сервер успеет завершить генерацию отчета, поэтому у пользователя никогда не будет возможности загрузить файл. Затем пользователь обновит страницу и попытается снова, что запустит весь процесс создания отчета и все равно завершится по тайм-ауту. (Нет, мы сейчас не кешируем отчеты; это то, к чему я настаиваю ...).

Как вы справляетесь с этими сценариями? У меня в голове есть идея, которая заключается в том, чтобы сделать aysnchronous запрос, чтобы начать генерацию отчета, а затем иметь некоторый javascript для периодической проверки статуса. Как только статус показывает, что отчет закончен, сделайте отдельный запрос для фактического файла.

Есть ли более простой способ, которого я не вижу?

Ответы [ 6 ]

5 голосов
/ 01 октября 2008

Использование файловой системы здесь, вероятно, хорошая ставка. Имейте запрос, который немедленно возвращает URL к местоположению отчета в формате PDF. Затем ваш сервер может либо запустить внешний процесс, либо отправить запрос самому себе для выполнения отчетов. Клиент может опросить сервер (используя http HEAD) для PDF по предоставленному URL. Если вы зададите имя файла PDF из параметров отчета, либо используя хеш, либо непосредственно указав параметры в имени, вы также получите мгновенное кэширование на стороне сервера.

4 голосов
/ 01 октября 2008

Я бы посоветовал сделать этот отчет немного более автономным с точки зрения обработки.

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

Может быть, я бы даже создал отдельную службу Windows для обработки очереди.

Обновление: отправка пользователю может быть отправлена ​​по электронной почте или на странице «отчетов», где они могут проверить статус своих отчетов и загрузить их, если они готовы.

2 голосов
/ 01 октября 2008

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

В зависимости от того, что вы найдете в просмотре запроса, вам может потребоваться добавить некоторые индексы или даже настроить таблицу для хранения денормализованной информации для вашего отчета, чтобы сделать его доступным быстрее. Затем эту денормализованную таблицу можно обновлять (через задание SQL Server) каждый час или с любой частотой, которую диктуют ваши требования (в пределах разумного).

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

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

2 голосов
/ 01 октября 2008

Вот некоторые вещи, которые я бы сделал, если бы мне представили эту проблему:

1- Остановите эти тайм-ауты! Они - пустая трата ресурсов. (поднять значение времени ожидания страниц asp)

2- Централизовать весь доступ к БД в одной точке, затем собрать статистику о том, какие отчеты выполнялись, когда и кем, сколько времени это заняло. Выясните, почему это так долго, из-за сложности отчета? диапазон данных? загрузка сервера? (на самом деле вы можете написать это в файле .csv на сервере и периодически импортировать этот файл на сервер sql для последующего анализа).

В конце концов, вам будет проще "кэшировать" отчеты, если вы пройдете через эту единственную точку доступа (например, тот же запрос с той же датой вернет тот же ранее сгенерированный PDF)

3- Я знаю, что это действительно не был вопрос, но вы пытались погрузиться в эти запросы, чтобы понять, почему они так долго работают? Возможно, запрос настройки?

4 - электронная почта / SMS / сообщение на экране, когда отчет готов, кажется отличным ... если ваш пользователь обычно отправляет пакет отчета, который необходимо сгенерировать, возможно, в приложении может быть встроена небольшая панель инструментов, показывающая ход "их" очереди , Небольшое управление ajax будет периодически обновлять статус. Подсказка: если вы использовали этот централизованный доступ к БД, и у вас есть достаточно информации о том, что выполняется, когда, почему и как долго вы в конечном итоге сможете приблизительно оценить время, необходимое для запуска отчета.

Если время отклика является критически важным, должны ли определенные пользователи ограничиваться диапазоном данных (например, диапазоном дат) в течение нескольких часов дня?

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

2 голосов
/ 01 октября 2008

Ваши пользователи могут не принять этот подход, но:

Когда они запрашивают отчет (нажав кнопку или ссылку или что-то еще), вы можете запустить процесс создания отчета в отдельном потоке и перенаправить пользователя на страницу, которая говорит: «Спасибо, ваш отчет будет послать вам письмо через несколько минут ".

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

Кроме того, вы можете зайти в IIS и увеличить время ожидания до> 3 минут.

1 голос
/ 01 октября 2008

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

...