2013-03-05 1 views
18

Можете ли вы объяснить, две методики, которые были реализованы в различных реализациях сервлетов:В чем разница между потоком за соединение и потоком за запрос?

  1. резьба в связи
  2. резьбы по запросу

Какой из двух вышеупомянутых стратегий масштабируется лучше и почему?

+1

http://stackoverflow.com/questions/7457190/how-threads-allocated-to-handle-servlet-request - дублировать? – Mikhail

ответ

16

Какой из двух вышеупомянутых стратегий масштабируется лучше и почему?

Оценка по запросу масштабируется лучше, чем резьба на соединение.

Потоки Java довольно дороги, обычно с использованием сегмента памяти 1 МБ каждый, независимо от того, активны они или нет. Если вы укажете каждому соединению свой собственный поток, поток, как правило, будет сидеть без дела между последовательными запросами на соединение. В конечном итоге инфраструктура должна либо прекратить прием новых соединений (поскольку она не может создавать больше потоков), либо начать отключение старых подключений (что приводит к сбою соединения, если/когда пользователь просыпается).

HTTP-соединение требует значительно меньше ресурсов, чем потоковый стек, хотя существует ограничение на 64K открытых соединений на IP-адрес из-за того, как работает TCP/IP.

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

(И заметьте, что запрос токарно-за не означает, что структура должна закрыть соединение HTTP после каждого запроса ...)


Сказав, что модель токарно-за запрос не является идеальным, когда во время обработки каждого запроса есть длительные паузы. (И это особенно не идеально, когда служба использует подход comet, который предполагает сохранение открытого потока ответа в течение длительного времени.) Для поддержки этого в спецификации Servlet 3.0 предусмотрен механизм «асинхронного сервлета», который позволяет использовать метод запроса сервлета приостановить его связь с текущим потоком запросов. Это освобождает поток для обработки и обработки другого запроса.

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


Followup

Давайте предположим, что один сайт с 1000 изображений. Это приводит к 1001 HTTP-запросам. Далее предположим, что HTTP-постоянные соединения используются. Благодаря стратегии TPR это приведет к 1001 управлению пулами потоков (TPMO). Благодаря стратегии TPC это приведет к 1 TPMO ... Теперь, в зависимости от фактических затрат для одного TPMO, я могу представить сценарии, в которых TPC может масштабироваться лучше, чем TPR.

Я думаю, что есть некоторые вещи, которые не считаются:

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

  • С помощью TPC и постоянных подключений поток должен ждать, пока клиент получит ответ и отправит следующий запрос. Это время ожидания может быть значительным, если высокая латентность сети.

  • Сервер не может знать, когда данное (постоянное) соединение может быть закрыто. Если браузер не закрывает его, он может «задерживаться», привязывая поток TPC до тех пор, пока сервер не отключит соединение.

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

У меня такое ощущение, что эти факторы могут перевесить экономию TPMO иметь один поток, посвященный каждый подключение.

+0

Вы писали: «(И обратите внимание, что поток за запрос не означает, что фреймворк должен закрыть HTTP-соединение после каждого запроса ...)». Поэтому, когда соединение будет повторно использовано позже, к нему присоединяется тот же поток или это другая тема? – Geek

+0

Это, как правило, другой поток. –

+0

"* Thread-per-request масштабируется лучше, чем поток за соединение. *" ... Что относительно сценария, в котором есть ** значительное число ** HTTP-запросов, которые подаются в ** одном ** HTTP связь? Для этого сценария я могу представить, что стратегия потока за запрос вызывает большую нагрузку на сервер из-за издержек управления потоком пула, в то время как стратегия соединения за запрос не будет иметь этих накладных расходов. – Abdull

2

HTTP 1.1 - Поддерживает постоянные соединения, что означает, что более одного запроса/ответа могут быть получены/отправлены с использованием одного и того же HTTP-соединения. Таким образом, для запуска этих запросов, полученных с использованием того же соединения параллельно, создается новый Thread для каждого запроса.

HTTP 1.0 - В этой версии только один запрос был получен с использованием соединения, и соединение было закрыто после отправки ответа. Таким образом, для одного соединения был создан только один поток.

2

Thread per connection является Концепция повторного использования того же HTTP Connection от multiple requests (keep-alive).

Thread per request создаст поток для each request из client .Server может создать ряд threads как на request.

+0

Чтобы уточнить для других, keep-alive не обязательно будет выделять поток для всего соединения, например, когда он сделан против контейнера сервлетов. В этом разница между Keep-Alive и TPC. – tunesmith

0

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

+0

Использует ли поток пул или порождает новые потоки и присоединяется к старым? – LtWorf

+0

Нерест новой нити - очень дорогая операция. Я предполагаю, что любая адекватная реализация повторно использует потоки через пул. – Mikhail

+0

Я знаю, что это дорого, вот почему я спросил. Без пула потоков, используя один поток для каждого запроса, намного дороже, чем использование одного потока для каждого соединения. И предположения плохие, вот почему я спросил. – LtWorf

1

Нить за запрос создаст поток для каждого HTTP-запроса, который получает сервер.

резьба в связи будет использовать тот же HTTP-соединение из нескольких запросов (держать-жив) .AKA HTTP persistent connection , но обратите внимание, что это поддерживается только HTTP 1.1

поток на запрос быстрее, поскольку большинство использования веб-контейнера Пул потоков.

Количество максимальных параллельных соединений, которые вы должны установить на количество ядер на вашем сервере. Больше сердечников => больше параллельных потоков.

Смотрите здесь, как настроить ... Tomcat 6: http://tomcat.apache.org/tomcat-6.0-doc/config/executor.html

Tomcat 7: http://tomcat.apache.org/tomcat-7.0-doc/config/executor.html

Пример

Смежные вопросы