Я работаю над веб-приложением на Java, которое получает данные от сервлетов через вызовы AJAX.
В этом приложении есть несколько элементов страницы, которые через довольно короткие промежутки времени получают новые данные с сервера.
При большом количестве пользователей спрос на сервер может стать довольно высоким, поэтому мне любопытно:
Какой подход предлагает лучшую производительность:
Много сервлетов (по одному для каждого типа запроса данных)?
Или же:
один сервлет, который может обрабатывать все запросы?




Нет причин для производительности иметь более одного сервлета. В веб-приложении мгновенно запускается только один экземпляр класса сервлета, независимо от количества запросов. Запросы не сериализуются, они обрабатываются одновременно, поэтому сервлет должен быть потокобезопасным.
каркас стойки использует один сервлет для всего в вашем приложении. Ваш материал подключается к этому сервлету. Если это сработает для них, это, вероятно, сработает и для вас.
Как сказал Тони, на самом деле нет причин использовать более одного сервлета, если только вам не нужно разбить сложный класс сервлетов Java или, возможно, реализовать перехватывающий фильтр.
1. Вам следует редко, если вообще когда-либо, добавлять атрибуты в ServletContext. 2. Можете ли вы подтвердить это: «Несколько сервлетов - определенно способ добиться чистой скорости»? это просто неправильно, если вам нужно синхронизировать что-то, вам придется синхронизировать, есть ли у вас 1 или 100 сервлетов
1. Просто скажу, что ServletContext не является потокобезопасным и ничего не говорит о хороших практиках. 2. Ты абсолютно прав в этом, мозговой перд с моей стороны, и я изменю свой ответ. Я думал, что мы могли бы каким-то образом избежать блокировки потоков с помощью нескольких сервлетов. Моя вина.
Одна из возможных причин наличия нескольких сервисов заключается в том, что если вам нужно расширить до нескольких серверов, чтобы справиться с нагрузкой в будущем, легче перенести отдельную службу на собственный сервер, чем делать это «за кулисами», если все идет. из одной службы.
При этом есть дополнительные накладные расходы на обслуживание, если у вас есть несколько сервлетов, поэтому это вопрос баланса будущей гибкости с меньшей ремонтопригодностью.
К сожалению, вопрос задан о запросе Ajax, поэтому сервер должен быть таким же, как и страница, с которой была загружена страница. Признанный способ сделать то, что вы предлагаете, - использовать балансировщик нагрузки перед несколькими серверами, обслуживающими один и тот же контент (т.е. у всех одинаковые сервлеты).
Как такового повышения производительности в случае использования нескольких сервлетов не происходит, поскольку каждый запрос сервлета обрабатывается в отдельном потоке, при условии, что он не является однопоточным.
Но, сохраняя модульность и разделение кода, у вас может быть несколько сервлетов.
Я уверен, что вы знаете, что у вас может быть несколько экземпляров одного и того же сервлета, если вы зарегистрируете разные узлы в файле web.xml для своего приложения, т.е. если вы хотите это сделать.
Помимо этого, насколько я понимаю, вам может быть полезна архитектура кометы - http://en.wikipedia.org/wiki/Comet_(programming).
Уже есть некоторые реализации Comet на некоторых контейнерах сервлетов - вот один взгляд на то, как использовать Ajax и Comet - http://www.ibm.com/developerworks/java/library/j-jettydwr/. Вы должны изучить, прежде чем выбирать свою архитектуру.
BR,
~ А
Спасибо, я никогда не понимал, что именно происходит на нижнем уровне для сервлетов.