反应性非阻塞I / O调用Web套接字会堆栈溢出吗?

时间:2019-12-02 04:21:17

标签: netty spring-webflux reactive

在类似于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秒。
  • CPU计算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;
    }

非常感谢您回答我的问题!

1 个答案:

答案 0 :(得分:0)

毫无疑问,如果速率很高,最终缓冲区将满。

缓冲区的溢出将通过TCP从接收方反馈到发送方。

背压是一种解决方法。

要清楚,如果使用RSocket之类的协议,连接将被重用。