Может ли Undertow использовать один и тот же рабочий поток ввода-вывода для обработки двух разных запросов?

Вот моя ситуация, когда я написал демо, которое одновременно отправляет два разных запроса на мой сервер.

Обычно: Undertow будет использовать два рабочих потока XNIO.

[   XNIO-1 I/O-3    XNIO-1 I/O-4] 

для обработки этих двух запросов:

2018-11-30 12:42:10.408  INFO 13052 --- [   XNIO-1 I/O-3] com.ecarx.asrapi.handler.ASRHandler      : ======收到Up请求, id=18179c3d-8958-4ca2-b5a1-65d0f73991da, ak=8c3d8bde3d94397e539dd6eff6e0318336db8e30=======

2018-11-30 12:42:11.896  INFO 13052 --- [   XNIO-1 I/O-4] com.ecarx.asrapi.handler.ASRHandler      : ======收到Down请求, id=18179c3d-8958-4ca2-b5a1-65d0f73991da, ak=8c3d8bde3d94397e539dd6eff6e0318336db8e30=======

Обычный снимок

Ненормально: Undertow использует тот же рабочий поток ввода-вывода.

[   XNIO-1 I/O-3] 

для обработки моих различных запросов:

2018-11-30 12:42:24.253  INFO 13052 --- [   XNIO-1 I/O-3] com.ecarx.asrapi.handler.ASRHandler      : ======收到Up请求, id=4b16a94a-7cc0-4904-ae2b-aae63093ed25, ak=91349ab08e093314705cb59872a206f25f3502bb=======

2018-11-30 12:42:25.737  INFO 13052 --- [   XNIO-1 I/O-3] com.ecarx.asrapi.handler.ASRHandler      : ======收到Down请求, id=4b16a94a-7cc0-4904-ae2b-aae63093ed25, ak=91349ab08e093314705cb59872a206f25f3502bb=======

Аномальный снимок

Демонстрация: может быть отправлено два разных запроса:

    String url = config.getUrl();
    executor.execute(() -> handleUpStream(url + "/up?id=" + id + "&ak=" + token, type, data));
    //handle down stream
    executor.execute(() -> handleDownStream(url + "/down?id=" + id + "&ak=" + token, responses));

Обработчики:

@PostMapping(value = "up", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public Mono<Object> handleASRUp(@RequestParam(required = false) String id, @RequestParam String ak, ServerHttpRequest request) {// need more time to handle...}


@PostMapping(value = "down", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public Mono<Void> handleASRDown(@RequestParam String id, @RequestParam String ak, ServerHttpResponse response) {//need a little time to handle...}

person itachy    schedule 30.11.2018    source источник
comment
Не могли бы вы улучшить свой вопрос? Не могли бы вы рассказать нам, чего вы пытаетесь достичь, показать нам фрагмент кода того, как вы пытаетесь это сделать, какой результат вы ожидали и что вы видите вместо этого. Спасибо!   -  person Brian Clozel    schedule 30.11.2018
comment
ХОРОШО. Вот что я хочу сказать: я использую демо-версию отправки двух HTTP-запросов на сервер, ну, на стороне сервера иногда сервер [Undertow] будет использовать два разных потока ввода-вывода для обработки двух запросов, и каким-то образом сервер ПРОСТО использует один и тот же IO-Thread обрабатывает два моих разных Http-запроса. Как показано на снимках, мой запрос Up сначала поступает и обрабатывается, но НЕ завершен, затем идет Down, сервер повесит запрос Up и начнет обрабатывать запрос Down, когда Down завершится, затем сервер начнет обрабатывать запрос Up.   -  person itachy    schedule 30.11.2018
comment
Я ожидаю, что сервер должен заканчивать работу вверх и вниз с двумя разными потоками ввода-вывода, а не с одним и тем же.   -  person itachy    schedule 30.11.2018
comment
Не могли бы вы обновить свой вопрос с этой информацией? Как вы запускаете различные случаи? Это другое приложение? Другой тип запроса? Не могли бы вы показать несколько фрагментов кода, демонстрирующих настройку сервера и как выглядят обработчики запросов?   -  person Brian Clozel    schedule 30.11.2018
comment
Не поможете ли вы проверить первый снимок, то есть нормальный случай, получает запрос вверх и вниз с двумя разными NIO; Но второй снимок получает запрос вверх и вниз в одном и том же потоке Single NIO.   -  person itachy    schedule 30.11.2018


Ответы (1)


Теперь я предполагаю, что может быть проблема с номером NIO, поскольку я установил server.undertow.io-threads = 1, сервер всегда будет использовать один единственный поток NIO для одновременной обработки моих запросов «вверх» и «вниз», повесьте трубку. "вверх" и обработать запрос "вниз". Но я НЕ понимаю, почему сервер НЕ блокирует запрос «вниз» снаружи, после того, как запрос «вверх» был завершен, затем начинает обрабатывать запрос «вниз»; Ведь «Up request» поступил первым.

person itachy    schedule 30.11.2018