Какой из двух вышеупомянутых стратегий масштабируется лучше и почему?
Оценка по запросу масштабируется лучше, чем резьба на соединение.
Потоки 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 иметь один поток, посвященный каждый подключение.
http://stackoverflow.com/questions/7457190/how-threads-allocated-to-handle-servlet-request - дублировать? – Mikhail