Настройка сервера отчетов для освобождения ресурса от веб-сервера - PullRequest
4 голосов
/ 25 февраля 2009

Yay, первый пост на SO! (Хорошая работа, Джефф и др.)

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

Наша инфраструктура выглядит следующим образом: 1 сервер, выполняющий роль веб-сервера / DBServer (ColdFusion 7 и MSSQL 2005)

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

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

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

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

Итак, мы думаем о том, чтобы получить второй сервер и использовать его в качестве «сервера отчетов» с реплицированной копией нашей БД, на которой будут выполняться запросы. Это решило бы одну проблему, но осталась вторая: создание PDF-файлов требует значительных ресурсов.

Мы хотели бы также переложить эту задачу на сервер отчетов, но, находясь в защищенном веб-приложении, мы не можем просто запустить HTTP GET для создания PDF-файлов с пользователем, вошедшим в веб-приложение с сервера 1 и отображающим в веб-приложении, но генерирует / извлекает его на сервере 2 без проверки учетных данных пользователя ...

Кто-нибудь имеет опыт работы с этим? Заранее спасибо переполнение стека !!

Ответы [ 4 ]

3 голосов
/ 26 февраля 2009

"Мы хотели бы также переложить эту задачу на сервер отчетов, но, находясь в защищенном веб-приложении, мы не можем просто запустить HTTP GET для создания PDF-файлов с пользователем, вошедшим в веб-приложение с сервера 1 и отображать его в веб-приложении, но генерировать / извлекать его на сервере 2 без проверки учетных данных пользователя ... "

почему ты не можешь? Вы используете самый простой в мире язык для написания веб-сервисов. вот мои предложения.

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

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

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

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

3 голосов
/ 25 февраля 2009

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

1 голос
/ 27 февраля 2009

Вы должны разделить восприятие между созданием PDF и выполнением расчетов. Оба являются отдельными шагами.

Что вы можете сделать, это

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

2) Когда кто-то запрашивает отчет в формате PDF, попросите его выполнить простой выбор предварительно рассчитанных значений. Это будет гораздо меньше усилий, чем расчет на лету. Вы можете использовать Coldfusion для создания PDF, если он использует необычные настройки PDF. В противном случае вы можете избежать использования необработанного формата PDF (он похож на разметку html) в текстовой форме или использовать другую библиотеку (cfx_pdf, подходящую библиотеку Java и т. Д.) Для их генерации.

Если пользователям не нужно скачивать и нужно только просматривать / распечатывать отчет, не могли бы вы воспользоваться флэш-бумагой?

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

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

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

Дайте нам знать, как это происходит!

0 голосов
/ 26 февраля 2009

В дополнение к советам по разделению серверов web и db я попытался:

а) перемещать запросы в хранимые процедуры, если вы их еще не используете;

b) генерировать отчеты по планировщику и хранить их в специальных таблицах в состоянии готовности к использованию, поэтому клиенты выбирают их только с помощью нескольких быстрых запросов - это также должно сократить время создания отчетов для клиентов.

Надеюсь, это поможет.

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