我打算在即将到来的项目中使用 Netty。该项目将充当客户端和服务器。特别是它会建立和维护与各种服务器的许多连接,同时为自己的客户端提供服务。
现在,NioServerSocketChannelFactory 的文档相当好地指定服务器端的线程模型 - 每个绑定(bind)的监听端口在整个过程中都需要一个专用的 boss 线程,而连接的客户端将在 worker 线程。具体来说,一个工作线程将能够处理多个连接的客户端。
但是,NioClientSocketChannelFactory 的文档不太具体。这似乎也利用了 boss 和 worker 线程。但是,文档指出:
One NioClientSocketChannelFactory has one boss thread. It makes a connection attempt on request. Once a connection attempt succeeds, the boss thread passes the connected Channel to one of the worker threads that the NioClientSocketChannelFactory manages.
工作线程似乎也以与服务器案例相同的方式运行。
我的问题是,这是否意味着从我的程序到外部服务器的每个连接都会有一个专用的 boss 线程?如果我建立数百或数千个这样的连接,这将如何扩展?
作为旁注。将单个 Executor(缓存线程池)同时用作 ChannelFactory 的 bossExecutor 和 workerExecutor 是否有任何不利的副作用?在不同的客户端和/或服务器 ChannelFactory 实例之间重用呢? This is somewhat discussed here ,但我发现这些答案不够具体。谁能详细说明一下?
最佳答案
这不是您关于 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");
}
});
}
}
它还展示了如何为不同的连接设置不同的管道工厂,因此,根据您建立的连接,您可以调整 channel 管道中的编码器/解码器。
关于java - Netty 线程模型在客户端连接多的情况下如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7895964/