在类似于tomcat servlet的传统多线程模型中,我们将同步调用Web套接字,以便即使速率很慢也可以控制速率。
thread: {
Obj request;
// There are at most several socket for threads num
Obj response = syncClient.blockingWebRequest(request);
// ...
logicHandle();
// ...
return response;
}
但是在反应式非阻塞I / O中,我们将异步调用套接字,因此,如果请求过多,将当前调用大量Web套接字。 OS套接字堆栈可以容纳它吗?那缓冲呢?
eventLoop: {
Mono request;
// Non-blocking IO continuously receives and establishes socket
Mono response = asyncClient.nonBlockingWebRequest(request);
response.onSubscribe(()->{
// ...
logicHandle();
// ...
});
return response;
}
例如,同时建立数百万个套接字连接。
在第一个套接字返回之前是否会建立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;
}
非常感谢您回答我的问题!
答案 0 :(得分:0)
毫无疑问,如果速率很高,最终缓冲区将满。
缓冲区的溢出将通过TCP从接收方反馈到发送方。
背压是一种解决方法。
要清楚,如果使用RSocket之类的协议,连接将被重用。