当前位置: 首页 > 面试题库 >

如果有许多客户端连接,Netty线程模型如何工作?

郏经纬
2023-03-14
问题内容

我打算在即将进行的项目中使用Netty。该项目将同时充当客户端和服务器。特别是它将建立并维护与各种服务器的许多连接,同时为自己的客户端提供服务。

现在,NioServerSocketChannelFactory的文档很好地指定了服务器端的线程模型-
每个绑定的侦听端口在整个过程中都需要一个专用的 老板 线程,而连接的客户端将在 工作
线程上以非阻塞方式进行处理。具体来说,一个工作线程将能够处理多个连接的客户端。

但是,NioClientSocketChannelFactory的文档不太具体。这似乎也利用了
老板工人 线程。但是,文档指出:

一个NioClientSocketChannelFactory有一个老板线程。根据请求进行连接尝试。连接尝试成功后,老板线程将已连接的Channel传递给NioClientSocketChannelFactory管理的工作线程之一。

辅助线程似乎也以与服务器端相同的方式起作用。

我的问题是,这是否意味着从程序到外部服务器的每个连接都会有一个专用的 老板 线程?如果建立数百或数千个此类连接,将如何扩展?

作为旁注。将单个Executor(缓存的线程池) 重新 用作ChannelFactory 的 bossExecutor
workerExecutor
是否有不利的副作用?还可以在不同的客户端和/或服务器ChannelFactory实例之间重用呢?这里对此进行了一些讨论,但是我没有找到足够具体的答案。有人可以详细说明吗?


问题答案:

这不是您有关Netty客户端线程模型如何工作的问题的真实答案。但是,您可以使用相同NioClientSocketChannelFactory的对象创建ClientBootstrap带有多个ChannelPipelineFactorys的单个对象,进而建立大量连接。看下面的例子。

public static void main(String[] args)
{
    String host = "localhost";
    int port = 8090;
    ChannelFactory factory = new NioClientSocketChannelFactory(Executors
            .newCachedThreadPool(), Executors.newCachedThreadPool());
    MyHandler handler1 = new MyHandler();
    PipelineFactory factory1 = new PipelineFactory(handler1);
    AnotherHandler handler2 = new AnotherHandler();
    PipelineFactory factory2 = new PipelineFactory(handler2);
    ClientBootstrap bootstrap = new ClientBootstrap(factory);
    // At client side option is tcpNoDelay and at server child.tcpNoDelay
    bootstrap.setOption("tcpNoDelay", true);
    bootstrap.setOption("keepAlive", true);
    for (int i = 1; i<=50;i++){
        if(i%2==0){
            bootstrap.setPipelineFactory(factory1);
        }else{
            bootstrap.setPipelineFactory(factory2);
        }

        ChannelFuture future = bootstrap.connect(new InetSocketAddress(host,
                port));

        future.addListener(new ChannelFutureListener()
        {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception
            {
                future.getChannel().write("SUCCESS");
            }
        });
    }
}

它还显示了如何为不同的连接设置不同的流水线工厂,因此基于连接,您可以调整通道流水线中的编码器/解码器。



 类似资料:
  • 在Netty中创建客户端连接时,我有一个问题。 这里,为什么我们没有一个bind方法,将通道绑定到发起客户端连接的端口(在客户端)?我们唯一需要提供的就是给出服务器地址和端口如下: 这是在客户端还是服务器端创建了一个新的通道?此通道绑定在客户端的哪个端口? 我们在执行服务器端引导时进行绑定,如下所示 我很困惑,不明白客户端从哪个端口向服务器发送数据,使用的是什么通道?

  • 故事是这样的,我有一个远程服务器和一个防火墙后面的客户端。客户端由netty实现,它将建立一个与远程服务器的保活连接。如果200秒内通道中没有消息传输,防火墙将重置连接到远程服务器端的连接,但客户端没有收到任何tcp数据包(例如RST包),因此客户端认为此连接是活的,而事实并非如此。那么如何在防火墙错误处理此保活连接之前强制关闭不寻常的连接呢?顺便说一句:我无法配置防火墙

  • 我试图理解netty http客户端连接池。如果是NIO和异步的,那么这个连接池的意义是什么? 例如:如果服务A调用服务B,并且服务A的客户端连接池计数设置为50,那么这是否意味着我们最多只能发出50个并行请求? 更新: 我在3.5秒内完成了所有通话。理想情况下,有一个连接,我应该在150秒内完成。

  • 我正在尝试从另一台机器创建与基于java的套接字服务器的多个客户端连接。服务器和客户端都使用Netty 4进行NIO。在服务器端,我使用了boss和Worker group,它能够在单个linux盒上接收和服务器100000并发连接(在设置内核参数和ulimited之后)。 但是,我最终在客户端为每个连接创建了一个新线程,这导致了JVM线程限制异常。 有人能告诉我,我如何使用Netty从客户端创建

  • 是否有办法限制netty用于客户端连接的线程数(netty是连接到远程服务器的客户端)。我使用的是1个NioEventLoopGroup,它被传递到每个引导程序中。每个引导都得到相同的通道初始值设定项引用(我曾经为每个引导创建不同的初始值设定项,但共享相同的引用似乎效果很好)。我从Java应用程序连接到许多充当服务器的硬件设备。 我注意到,目前最多使用16个线程(我在一台8核机器上,据我所知,Ne

  • 我正在使用Netty 4.0构建一个客户端/服务器。服务器正在正确监听localhost:8083并且我可以远程登录它,它会正确触发服务器断点。但是当我尝试使用这段代码连接时: 它在sync()处抛出异常:java.nio.channels.ClosedChannelException。如前所述,当我telnet 127.0.0.1 8083(或用Socket连接代码)时,它确实有效。知道吗?非常