我正在使用netty 4.0编写TCP服务器,它可能同时加载20k客户端。但我的服务器不能承受很多这样的连接。 这是我的代码。
private void initServer(){
EventLoopGroup boosGroup = new NioEventLoopGroup(100);
EventLoopGroup workerGroup = new NioEventLoopGroup(1000);
EventExecutorGroup eegHandle = new DefaultEventExecutorGroup(1000);
EventExecutorGroup eegDecode = new DefaultEventExecutorGroup(1000);
EventExecutorGroup eegEndcode = new DefaultEventExecutorGroup(1000);
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(boosGroup, workerGroup);
bootstrap.channel(NioServerSocketChannel.class);
bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeLine = ch.pipeline();
//add check idle time of connection
pipeLine.addLast("Ilde event", new IdleStateHandler(timeIdleRead, timeIdleWrite, 0));
//add idle handler to handle idle connection
pipeLine.addLast("Idle handler", new ServerHandleIdleTime(logger));
//add decode handler to decode message received from client
pipeLine.addLast(eegDecode, new ServerMsgDecoder());
//add business handler to process business
pipeLine.addLast(eegHandle, new ServerHandleSimple());
//add encode handler to encode message send to client
pipeLine.addFirst(eegEncode, new ServerMsgEncoder());
}
});
bootstrap.option(ChannelOption.SO_BACKLOG, 200);
bootstrap.childOption(ChannelOption.SO_KEEPALIVE, false);
// bootstrap.option(ChannelOption.SO_TIMEOUT, 10000);
ChannelFuture channelFuture = bootstrap.bind(host, port);
channelFuture.sync();
channelFuture.channel().closeFuture().sync();
} catch (Exception e) {
logger.error("", e);
} finally {
workerGroup.shutdownGracefully();
boosGroup.shutdownGracefully();
}}
我应该使用3 for 3处理程序EventExecutorGroup吗? 我使用nthread(= 1000)for workerGroup有足够的20k连接? 我希望每个人的帮助都能重新配置服务器。 谢谢!
答案 0 :(得分:0)
NIO并不意味着拥有与连接客户端一样多的线程,而是拥有尽可能多的活动客户端(传入或传出消息),至少如果您希望它们是并行的。
否则,如果最大并行度不合适,那么您将在每条消息之间等待一段时间(每个线程将尽快从一个通道转到另一个通道)。一般来说,这不是问题。
但是我认为1000已经相当多了。但它可能真的取决于您的需求。 1000个20K客户端,意味着同时,最多5%的客户端真正活跃(即使它们已连接)。如果您的客户端已连接并且确实处于活动状态,则1000可能还不够......如果您的客户端每秒发送一条消息,每条消息需要100毫秒,那么它平均意味着10%的并发消息,所以2000 ...你必须亲自去做。
在EventExecutorGroup
上,这取决于您的编码器和解码器以及商家处理程序:
EventExecutorGroup
。EventExecutorGroup
。您可以尝试以下方法:
EventExecutorGroup
。ChannelOption.SO_REUSEADDR
添加为true。使处理程序的顺序更符合惯例: