Как один сервлет обрабатывает несколько запросов с клиентской стороны

Как один сервлет обрабатывает несколько запросов клиентов, поступающих в форме запросов пользователя? Основываясь на шаблоне проектирования singleton, я знаю, что мы получаем один экземпляр созданного сервлета, но как один сервлет обрабатывает миллионы запросов. Смущает также и резьба.

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

Является ли он одинаковым для всех фреймворков или он отличается, например, struts v/s springs?

Ответы

Ответ 1

Фреймы Struts/ Spring на самом деле написаны поверх спецификации Servlet, поэтому не важно, что вы используете под ней, используя Servlets.

Вы правы, создается только один экземпляр сервлета, но этот экземпляр разделяется несколькими потоками. По этой причине вы никогда не должны делиться переменными состояниями в своих сервлетах.

Например, у вас есть следующий сервлет, сопоставленный с http://localhost/myservlet

class MySerlvet extends HttpServlet {

     public void doGet(HttpServletRequest req, HttpServletResponse res) {
          // Get Logic
     }    
}

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

MyServlet m = new MyServlet(); // This will be created once

// for each request for http://localhost/myservlet
executorService.submit(new RequestProcessingThread(m));

Ответ 2

Каждый запрос обрабатывается в отдельном потоке. Это не означает, что tomcat создает поток для каждого запроса. Для обработки запросов существует пул потоков. Также есть один экземпляр для каждого сервлета, и это случай по умолчанию. (Дополнительная информация). Ваш сервлет должен быть Thread Safe.

enter image description here

Если ваш сервлет реализует интерфейс SingleThreadModel, каждый поток использует отдельный экземпляр сервлета. SingleThreadModel устарел, не используйте его.

SingleThreadModel

Я сделал этот ответ в качестве вики сообщества.

Ответ 3

Вы не создаете несколько экземпляров сервлета. Механизм сервлетов создает отдельный поток для каждого запроса (до некоторого максимального количества Thread) Производительность связана с количеством потоков, а не количеством экземпляров сервлета.

Например, если есть 1000 запросов, а максимальные потоки, которые могут быть сгенерированы сервлетом, равны 100, тогда будет ухудшение производительности.

Чтобы избежать этой проблемы, мы можем использовать балансировку нагрузки, поставив несколько серверов за балансировщик нагрузки. Балансировщик нагрузки должен быть сконфигурирован так, чтобы "маршрутизировать" запросы на любой из серверов на основе разных параметров/настроек (распространение по кругу, распределение нагрузки и т.д.). Чем больше нагрузки вам нужно, тем больше серверов вы должны добавить. Тем не менее, это действительно посылает весь трафик через балансировщик нагрузки, поэтому важно, чтобы это было избыточным и безопасным при отказе.

Ответ 4

Я думаю, что лучший ответ - это тот, который объединяет ответы @Shazin и @Ali, обязательно в таком порядке.