Реактивный неблокирующий веб-сокет вызова ввода / вывода будет переполняться стеком? - PullRequest
1 голос
/ 02 декабря 2019

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

thread: {
        Obj request;
        // There are at most several socket for threads num
        Obj response = syncClient.blockingWebRequest(request);
        // ...
        logicHandle();
        // ...
        return response;
    }

Но в реактивном неблокирующем I /О, мы будем вызывать сокет в asychronize, поэтому, если запрос слишком велик, в настоящее время мы вызовем множество веб-сокетов. Может ли стек сокетов ОС держать его? А как насчет буфера?

eventLoop: {
        Mono request;
        // Non-blocking IO continuously receives and establishes socket
        Mono response = asyncClient.nonBlockingWebRequest(request);
        response.onSubscribe(()->{
            // ...
            logicHandle();
            // ...
        });
        return response;
    }

Например, установить миллионы соединений сокетов одновременно.

  • Сокет занимает 10 с.
  • Процессор вычисляет 1 мс.

Будет ли выполнено 10 000 подключений к сокету до возвращения первого сокета?

eventLoop: {
        // eventLoop handles one in 1ms
        Mono request;
        // Non-blocking IO continuously receives and establishes socket
        Mono response = asyncClient.nonBlockingWebRequest(request);
        // This will callback after 10s
        response.onSubscribe(()->{
            // ...
            logicHandle();
            // ...
        });
        // eventLoop continue
        return response;
    }

Большое спасибо за ответ на мой вопрос!

...