Установка максимального времени отклика в приложении Spring 3.0 - PullRequest
1 голос
/ 10 марта 2011

У меня есть веб-приложение, которое, как заявил наш владелец продукта, должно ответить в течение 2,5 секунд и быть пригодным для использования в течение 3 секунд.

В настоящее время это в основном POJO поверх тонко нарезанного слоя Spring MVC, который используетсядля внедрения зависимостей и перенаправления запросов в контроллеры.

Веб-приложение представляет собой очень тонкий кусок мяса между стеком API, которые создаются для обеспечения согласованности с разнородным набором очень старых, нерегулярных API.Некоторые из которых могут занять более 3 секунд (хотя и не слишком часто)

Я хочу, чтобы я сказал Spring или tomcat, что если он не загружает JSP в течение 2500 мс, я хочу загрузить jspэто говорит нашему пользователю, что "Чувак, мы просматриваем здесь мелассу! Дай нам секунду и попробуй еще раз. Если ты получишь эту страницу несколько раз, то ты действительно обречен!"

Прямо сейчас этоПохоже, я мог бы сделать это несколькими способами (по желанию)

  • Весной я могу установить тайм-аут и загрузить другой jsp
  • В балансировщике нагрузки я могубыть в состоянии установить тайм-аут с перенаправлением
  • В Tomcat я могу установить тайм-аут и загрузить другой JSP
  • В Apache я могу установить Tomcat сперенаправление
  • в приложении Я разделил архитектуру для запуска внутри потока, который опрашивается каждые 100 мс, чтобы определить, прекратился ли он, и через 2500 мс он выдает исключение

1 Ответ

0 голосов
/ 11 марта 2011

Если я правильно помню, все запросы к Spring MVC проходят через один фильтр.Вы можете переопределить его и запрограммировать свои настройки тайм-аута (например, иметь настраиваемый XML с URL-адресами или путями с тайм-аутом). TimeLimiter от Guava был бы хорошим инструментом для реализации самого тайм-аута.

<general-rant>

Я не знаю, в какой отрасли вы работаете, но обычно ввеб-мир слишком требователен, чтобы паниковать, если ответ не возвращается через 2-3 секунды, особенно если длительный ответ - это меньшинство (как вы говорите).У меня есть опыт работы с большими кучами (Xmx = 10g), где только сборщик мусора может занять несколько минут .Ладно, может быть, это переоцененный пример, но одно-двухсекундное взятие ГК вполне разумно.

Даже Руководство Tomcat говорит, что очень маленькие тайм-ауты, вероятно, будут контрпродуктивными .Ваш владелец продукта должен быть холериком:)

</general-rant>

А, это еще не все.Не забывайте, что вы не можете просто перенаправить, если вы уже отправили что-то обратно в свой ответ сервлета.Поэтому вам, вероятно, нужно отложить ваш ответ до тех пор, пока не будет сделан последний бит вычислений, и очистить все в конце.Это означает, что вам нужно обернуть HttpServletResponse декоратором, который имеет своего рода защелку, которая задерживает вывод ответа до тех пор, пока не будет сгенерирован полный ответ, или, если произойдет тайм-аут - перенаправляет на страницу «ой».

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