28

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

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

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

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

工作线程似乎也以与服务器案例相同的方式运行。

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

作为旁注。将单个 Executor(缓存线程池)同时用作 ChannelFactory 的bossExecutorworkerExecutor是否有任何不利的副作用?在不同的客户端和/或服务器 ChannelFactory 实例之间重用呢?这在此处有所讨论,但我发现这些答案不够具体。谁能详细说明一下?

4

3 回答 3

13

这不是您关于 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");
            }
        });
    }
}

它还展示了如何为不同的连接设置不同的管道工厂,因此根据您建立的连接,您可以调整通道管道中的编码器/解码器。

于 2011-10-26T16:28:17.230 回答
1

我不确定您的问题是否已得到解答。这是我的答案:有一个 Boss 线程同时管理应用程序中所有待处理的 CONNECT。它使用 nio 在单个(Boss)线程中处理所有当前连接,然后将每个成功连接的通道交给其中一个工作人员。

于 2012-01-18T09:41:49.687 回答
0

您的问题主要涉及性能。单线程在客户端上可以很好地扩展。

哦,nabble 已经关闭了。您仍然可以在那里浏览存档。

于 2011-11-15T18:30:29.530 回答