В традиционной многопоточной модели, такой как сервлет 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;
}
Большое спасибо за ответ на мой вопрос!