配置服务器使用netty 4有20,000个客户端的连接

时间:2015-08-12 13:23:43

标签: java asynchronous server netty nio

我正在使用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连接? 我希望每个人的帮助都能重新配置服务器。 谢谢!

1 个答案:

答案 0 :(得分:0)

NIO并不意味着拥有与连接客户端一样多的线程,而是拥有尽可能多的活动客户端(传入或传出消息),至少如果您希望它们是并行的。

否则,如果最大并行度不合适,那么您将在每条消息之间等待一段时间(每个线程将尽快从一个通道转到另一个通道)。一般来说,这不是问题。

但是我认为1000已经相当多了。但它可能真的取决于您的需求。 1000个20K客户端,意味着同时,最多5%的客户端真正活跃(即使它们已连接)。如果您的客户端已连接并且确实处于活动状态,则1000可能还不够......如果您的客户端每秒发送一条消息,每条消息需要100毫秒,那么它平均意味着10%的并发消息,所以2000 ...你必须亲自去做。

EventExecutorGroup上,这取决于您的编码器和解码器以及商家处理程序:

  • 如果一个人阻止或长时间消费,那么这个可能需要EventExecutorGroup
  • 如果没有,则不需要EventExecutorGroup

您可以尝试以下方法:

  • 在必要时将踏板数增加到编解码器和业务处理程序以及workerGroup中可能的活动(或并发)消息数。
  • 对多个处理程序使用相同的EventExecutorGroup
  • 在引导程序中将ChannelOption.SO_REUSEADDR添加为true。
  • bossGroup一般应该是(2 x核心数)+1(所以如果你有6核,你可以将它设置为13)。不应该有这样的需要将它增加到100。
  • 使处理程序的顺序更符合惯例:

    1. IdleStateHandler
    2. ServerHandleIdleTime
    3. ServerMsgDecoder
    4. ServerMsgEncoder //由于addFirst
    5. ,目前位于代码的第一个位置
    6. ServerHandleSimple