Запросы на тот же URL-адрес заблокированы в пуле потоков http nio

Я просто создал приложение RestController в приложении springboot (1.5.4.RELEASE) и проверил, как оно работает при поступлении нескольких запросов. Что меня смутило:

  • тот же URL: 2-й запрос заблокирован до тех пор, пока не будет выполнен 1-й запрос
  • другой URL: неблокируемый, 2 запроса выполняются почти одновременно

Мой вопрос: кто блокирует 2-й запрос и почему?

Тестовый код:

@GetMapping(value = "/sleep")
public String sleep(HttpServletRequest request, @RequestParam boolean status) 
{
    String requestId = request.toString();
    logger.info("request  [{}] in  and status = {}.", requestId, status);
    String result;
    if (status)
    {
        Thread.currentThread().sleep(10 * 1000);
        result = "slept";
    }
    else
    {
        result = "stay up";
    }
    logger.info("response [{}] out and result = [{}].", requestId, result);
    return result;
}

Результат испытаний:

  1. Другой URL-адрес: не блокировать, почти начать выполнение одновременно.

http://localhost:20002/sleep?status=false И http://localhost:20002/sleep?status=true

2018-08-14 15:04:14.139  [http-nio-20002-exec-5]: connection [RequestFacade@46515328] in  and status = true.
2018-08-14 15:04:16.452  [http-nio-20002-exec-6]: connection [RequestFacade@1140f857] in  and status = false.
2018-08-14 15:04:16.452  [http-nio-20002-exec-6]: connection [RequestFacade@1140f857] out and result = [stay up].
2018-08-14 15:04:24.139  [http-nio-20002-exec-5]: connection [RequestFacade@46515328] out and result = [slept].
  1. Тот же URL: блок, второй запрос не выполняется, пока не будет выполнен первый запрос.

http://localhost:20002/sleep?status=true И http://localhost:20002/sleep?status=true

2018-08-14 15:10:29.943  [http-nio-20002-exec-9]: connection [RequestFacade@46515328] in  and status = true.
2018-08-14 15:10:39.944  [http-nio-20002-exec-9]: connection [RequestFacade@46515328] out and result = [slept].
2018-08-14 15:10:39.960  [http-nio-20002-exec-1]: connection [RequestFacade@1140f857] in  and status = true.
2018-08-14 15:10:49.960  [http-nio-20002-exec-1]: connection [RequestFacade@1140f857] out and result = [slept].

Я отлаживаю код tomcat-embed-core и обнаруживаю, что когда приходит запрос с другим URL-адресом, поток опроса может немедленно его перехватить и обработать; в то время как запрос с тем же URL-адресом поступает, опросчик не может получить его, пока не будет возвращено 1-е соединение.


person George Wang    schedule 14.08.2018    source источник
comment
Что произойдет, если вы используете Jetty или более новую версию Spring Boot (1.5.14 вместо 1.5.4)?   -  person M. Deinum    schedule 14.08.2018
comment
Тестил на Jetty и SpringBoot 1.5.14.RELEASE, разницы никакой.   -  person George Wang    schedule 23.08.2018
comment
Пытался воспроизвести, но на моей стороне работает как положено. Выполнение 8 одновременных запросов для одного и того же URL, и они поступают одновременно. Как вы это тестируете? Из браузера, теста или чего-то вроде cUrl или Httpie в командной строке? Я подозреваю браузер, который, вероятно, предотвращает вызов одного и того же URL-адреса (и ждет завершения первого запроса, прежде чем вызывать его снова).   -  person M. Deinum    schedule 23.08.2018
comment
Да, спасибо. Использование разных клиетов и запросы поступают одновременно. Это хром, который застопорил запрос к тому же ресурсу.   -  person George Wang    schedule 24.08.2018


Ответы (1)


Благодаря @M.Deinum блокировка не имеет ничего общего с NIO. Это хром, который заблокировал второй запрос, и по какой-то причине я нахожу комментарий ниже:

this behavior is due to Chrome locking the cache and waiting to see the result of one 
request before requesting the same resource again. 

https://stackoverflow.com/a/27514611/10222882

И это доказано Chrome Network -> Timing, 2-й запрос находится в состоянии [остановлено], пока не будет возвращен 1-й ответ.

connection_stalled

person George Wang    schedule 24.08.2018