Скажем, вы используете (блокирующий) разъем BIO, например:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol" connectionTimeout="20000" redirectPort="8443" maxConnections="1000" maxThreads="200" />
и вы делаете 201 одновременных соединений, что происходит с последним соединением?
Если вы сделаете 1001 одновременных подключений, что произойдет с последним подключением?
Далее воспользуемся (неблокирующим) коннектором NIO protocol="org.apache.coyote.http11.Http11NioProtocol"
.
Будут ли отличия, если мы сделаем 201 и 1001 одновременных подключений?
Насколько я понимаю, поведенческих различий между NIO и NIO2 нет, отличается только реализация, так ли это?
Какой коннектор Tomcat 8 использует с настройками протокола по умолчанию protocol="HTTP/1.1"
, когда недоступен APR/собственный коннектор?
------------- редактировать ---------------
Я сделал небольшой сервлет следующим образом:
Thread.sleep(2000);
response.getWriter().write("ok");
Установите эти настройки connectionTimeout="20000"
maxConnections="10"
maxThreads="2"
и сделайте 50 одновременных запросов. Все будет принято, а затем выполнено по 2 за раз (по мере завершения выполнения потоков). Ни один из запросов не истек по тайм-ауту или не получил ошибок, хотя connectionTimeout="20000"
и maxConnections="10"
.
Точно так же и для protocol="org.apache.coyote.http11.Http11NioProtocol"
, и для protocol="org.apache.coyote.http11.Http11Protocol"
. Я думаю, разница проявляется, когда у вас есть Keep-Alive
подключений. BIO блокирует поток на все время соединения, NIO освобождает поток после каждого запроса.
Когда я тестировал тот же сценарий, но с добавленным параметром acceptCount="15"
, как указал Dennis R, только тогда большинство запросов возвращали org.apache.http.conn.HttpHostConnectException: Connection to http://localhost:8080 refused
.
---------- редактировать2 -----------
Обратите внимание, что если я установил это maxConnections="100"
acceptCount="15"
, то все 50 соединений были приняты.