Строка запроса изменяет поведение параллельной обработки RestController при весенней загрузке

#java #spring-boot #spring-restcontroller

Вопрос:

Я новичок в Spring Boot и в настоящее время проверяю, как работает мой пример API с помощью @RestController. Поведение этого метода при получении двух одновременных запросов, по-видимому, меняется в зависимости от того, прикрепляю я строку запроса или нет.

Вот мой пример кода:

 @Slf4j
@RestController public class TestController {

    @RequestMapping("/test")
    public String test(){
           
        String str = UUID.randomUUID().toString();

        for(int i=0; i<100000; i  ){
            log.info(str);
        }

        return str;
    }
}
 

Когда я вызываю этот метод без строки запроса от двух клиентов одновременно (http://localhost:8080/test), он работает последовательно. Журнал будет выглядеть так:

 2021-09-16 18:20:14.914  INFO 19480 --- [nio-8080-exec-2] com.example.demo.TestController          : e909a1ba-835c-4ecf-adfc-460cb03665eb
2021-09-16 18:20:14.914  INFO 19480 --- [nio-8080-exec-2] com.example.demo.TestController          : e909a1ba-835c-4ecf-adfc-460cb03665eb
2021-09-16 18:20:14.908  INFO 19480 --- [nio-8080-exec-1] com.example.demo.TestController          : cdd31851-a2d7-4c24-9369-c90b9926b65f
2021-09-16 18:20:14.908  INFO 19480 --- [nio-8080-exec-1] com.example.demo.TestController          : cdd31851-a2d7-4c24-9369-c90b9926b65f
 

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

С другой стороны, когда я вызываю его с помощью двух разных строк запроса (/test?a=1 и /test?a=2), он работает параллельно. UUID смешаны.

 2021-09-16 18:20:14.928  INFO 19480 --- [nio-8080-exec-2] com.example.demo.TestController          : e909a1ba-835c-4ecf-adfc-460cb03665eb
2021-09-16 18:20:14.928  INFO 19480 --- [nio-8080-exec-1] com.example.demo.TestController          : cdd31851-a2d7-4c24-9369-c90b9926b65f
2021-09-16 18:20:14.928  INFO 19480 --- [nio-8080-exec-2] com.example.demo.TestController          : e909a1ba-835c-4ecf-adfc-460cb03665eb
2021-09-16 18:20:14.928  INFO 19480 --- [nio-8080-exec-1] com.example.demo.TestController          : cdd31851-a2d7-4c24-9369-c90b9926b65f
 

Этот метод не использует строки запроса, поэтому я думаю, что единственное различие между двумя случаями-это URL-адреса, которые получает Spring Boot.

Каковы внутренние различия в обработке между этими двумя случаями?

Комментарии:

1. я думаю, что здесь у вас может быть ложное предположение: то, что UUID отображаются последовательно, не обязательно означает, что они обрабатываются последовательно. Это может просто означать, что они передаются потокам последовательно, и по какой-то случайности поток 1 завершается до запуска потока 2. кроме того, во втором журнале все эти сообщения записываются сразу, а это означает, что они не обязательно находятся в правильном порядке.

2. Сколько раз вы проводили оба теста? Получили ли вы последовательные результаты, подтверждающие ваше предположение о последовательном и параллельном выполнении? Кроме того, здесь играет роль ведение журнала. Вместо регистрации не могли бы вы, пожалуйста, поместить UUID ее на карту с меткой времени и зарегистрировать ее один раз вне for цикла? Запустите тесты пару раз и поделитесь своими наблюдениями.

3. Спасибо вам за ваши комментарии. Я попробовал провести дополнительный тест с использованием метки времени и получил тот же результат, но понял, что причиной является Chrome. Похоже, что Chrome может отправлять запросы на разные URL-адреса одновременно, но не для одного и того же. Когда я использовал Chrome и Firefox для каждого запроса, оба способа вызова приводили к одному и тому же результату.