Java Netty线程模型在许多客户端连接的情况下是如何工作的?

Java Netty线程模型在许多客户端连接的情况下是如何工作的?,java,asynchronous,network-programming,nio,netty,Java,Asynchronous,Network Programming,Nio,Netty,我打算在即将到来的项目中使用Netty。此项目将同时充当客户端和服务器。特别是,它将建立和维护与各种服务器的许多连接,同时为自己的客户机提供服务 现在,的文档相当好地指定了服务器端的线程模型——在整个过程中,每个绑定的侦听端口都需要一个专用的boss线程,而连接的客户端将在工作线程上以非阻塞方式处理。具体来说,一个工作线程将能够处理多个连接的客户端 但是,的文档不太具体。这似乎还利用了boss线程和worker线程。然而,文件指出: 一个NioClientSocketChannelFactory

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

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

但是,的文档不太具体。这似乎还利用了boss线程和worker线程。然而,文件指出:

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

工作线程的工作方式似乎与服务器线程的工作方式相同

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


作为旁注。将单个执行器(缓存线程池)重新用作ChannelFactory的bossExecutor和workerExecutor是否有任何不良副作用?在不同的客户端和/或服务器ChannelFactory实例之间重复使用如何,但我觉得这些答案不够具体。有人能详细说明一下吗?

这并不是您关于Netty客户端线程模型如何工作的问题的真实答案。但是,您可以使用相同的
NioClientSocketChannelFactory
创建具有多个
ChannelPipelineFactory
的单个
ClientBootstrap
,然后创建大量连接。看看下面的例子

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");
            }
        });
    }
}
publicstaticvoidmain(字符串[]args)
{
String host=“localhost”;
int端口=8090;
ChannelFactory工厂=新的NioClientSocketChannelFactory(执行者
.newCachedThreadPool(),Executors.newCachedThreadPool());
MyHandler handler1=新的MyHandler();
PipelineFactory1=新的PipelineFactory(handler1);
AnotherHandler handler2=新的AnotherHandler();
PipelineFactory2=新的PipelineFactory(handler2);
ClientBootstrap bootstrap=新ClientBootstrap(工厂);
//在客户端选项为tcpNoDelay,在服务器端选项为child.tcpNoDelay
setOption(“tcpNoDelay”,true);
setOption(“keepAlive”,true);

对于(inti=1;i您的问题主要涉及性能。单线程在客户端上的扩展性非常好


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

我不确定你的问题是否得到了回答。我的答案是:有一个Boss线程同时管理你应用程序中所有挂起的连接。它使用nio在一个Boss中处理所有当前连接线程,然后将每个成功连接的通道交给其中一个工人。

由于NioClientSocketChannelFactory和OioClientSocketChannelFactory很容易相互替换,您现在可以选择其中任何一个。在您准备好进行一些性能测试后,您可以切换到另一个,看看是否能提供更好的性能er或更差的性能。对于非常简单的情况,我在这里这样做了:注意:它们是可替换的,但如果使用不当,它们的行为会有一点不同-我在上面提到的要点中对此有一点评论。@IvanSopov我从来没有真正考虑过使用ChannelFactorys的Oio版本,因为我知道它们每个线程都使用专用线程线程数与连接数成正比让我感到不舒服。我担心NioClientSocketChannelFactory也会这样做(对于客户端,而不是服务器)是的,这是一个很好的观点。我知道你已经可以为服务器版本做这件事了,但是我没有考虑它的客户端版本。但是,它不会仍然从BaseExcel中消耗一个专用线程吗?p我在服务器端绑定的实例?还是我误解了NioClientSocketChannelFactory的工作原理?实际上,您也可以执行这一个客户端引导实例。请参阅更新的代码。感谢您为我确认这一点。我仍然非常有兴趣进一步了解boss线程在客户端连接中的作用是的,但至少现在我对一对一关系的恐惧已经被抛弃了。网络社区nabble非常活跃,你可以在那里问。Trustin通常自己回答这些问题。