【问题标题】:worker Group vs handler Thread in NettyNetty 中的工人组与处理程序线程
【发布时间】:2019-10-11 00:26:12
【问题描述】:

我正在设置一个 Netty 服务器来接受多个传入的客户端连接,这些连接会依次进行一些处理,但对 wroker 线程组与 Handler 线程感到困惑

我已尝试分配 10 个工作线程和 20 个处理程序线程,如下所示。

EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(10);
EventExecutorGroup handlerThread = new DefaultEventExecutorGroup(20);

try {
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.group(bossGroup, workerGroup);
    serverBootstrap.channel(NioServerSocketChannel.class);
    serverBootstrap.localAddress(new 
    InetSocketAddress(hostName,Integer.parseInt(port)));

    // initialize a new child handler for incoming request
    logger.debug("Incoming request from TCP client...assigning a new Server Handler");
    serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
    protected void initChannel(SocketChannel socketChannel) throws Exception 
    {
    socketChannel.pipeline().addLast(handlerThread,new NettyServerHandler());
                }
            });
            ChannelFuture channelFuture = serverBootstrap.bind().sync();
            channelFuture.channel().closeFuture().sync();

        } catch (Exception e) {
            logger.error("Unable to initialize TCP Server");
        } 

我无法理解工作组的任务和创建新的服务器处理程序之间的区别。据我了解,处理程序线程池将分配给 NettyServerHandler 的每个实例。但是那么创建 10 个线程的工作组池有什么作用呢?

【问题讨论】:

    标签: netty


    【解决方案1】:

    您不必创建一个带有 10 个线程的 EventLoopGroup 来接受 10 个客户端。它足以在bossGroup 上传递一个线程,而在workerGroup 上没有一个线程:

    EventLoopGroup bossGroup = new NioEventLoopGroup(1);
    EventLoopGroup workerGroup = new NioEventLoopGroup();
    

    确保ServerBootstrap().childOption(ChannelOption.SO_BACKLOG, 10); 设置为至少 10 以接受 10 个客户端。

    因此,据我所知,EventLoopGroup 的作用是接受客户。 另一方面,ServerHandler 用于接收数据并管理如何处理数据,如果有人加入或连接有任何问题,您可以通过覆盖 ChannelHandlerAdapter 方法进行拦截。

    我希望我能理解你的问题并帮助你理解它,

    亲切的问候

    【讨论】:

    • 感谢您的回复。我不确定语句 ServerBootstrap().childOption(ChannelOption.SO_BACKLOG, 10);在我的情况下是必需的。该应用程序将在 Intranet 中运行,无需拒绝/限制任何传入连接。另外,您能否提供任何用例,我们将在哪里添加工作线程?
    • childOption 声明是可选的,因为你很伤心。
    • 如果我理解你的问题,你应该在ServerBootstrap().group() 方法中添加 EventLoopGroup (workerThreads),就像你在课堂上所做的那样。它允许服务器处理多个连接以及传入和传出数据。
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多