Netty的每个处理程序/通道限制的单线程的解决方法

时间:2014-05-07 14:27:44

标签: netty

在Netty 4中,restriction:" EventExecutorEventLoop分配给处理程序或通道始终是单线程的。"这看起来很适合线程安全,但在处理数百个连接的情况下,吞吐量不太好。某些事件可能在队列中等待,而有空闲线程来处理它们。在我的研究中,我发现了相关的discussionissue,但却对事件循环,组,执行者和调用者感到困惑,他们无法理解如何使用它们来获得我想要的东西。

我有一组处理程序来编码和解码数据,并将收到的消息重定向到akka系统。有些消息很大,需要花费宝贵的时间来序列化/反序列化它们。我希望这些处理程序不要等待特定的线程,只是它们在池中的第一个可用线程中工作。

我可以使用Netty 4吗?或者我应该使用版本5.0.0Alpha1女巫是不是声明稳定?这真的是一个问题吗?

以下是代码:

bossGroup = new NioEventLoopGroup(1, new NamedThreadFactory("SocketServerBossExecutor"));
workerGroup = new NioEventLoopGroup(NUMBER_OF_WORKER_THREADS, new NamedThreadFactory("SocketServerWorkerExecutor"));

serverBootstrap = new ServerBootstrap()
        .group(bossGroup, workerGroup)
        .channel(NioServerSocketChannel.class)
        .childHandler(new ChannelInitializer() {
            @Override
            protected void initChannel(Channel ch) throws Exception {
                ch.pipeline()
                        //Decoder
                        .addLast("frameDecoder", new LengthFieldBasedFrameDecoder(MAX_FRAME_LENGTH, LENGTH_FIELD_OFFSET, LENGTH_FIELD_LENGTH, LENGTH_ADJUSTMENT, INITIAL_BYTES_TO_STRIP))
                        .addLast("protobufDecoder", PROTOBUF_DECODER)
                        .addLast("protoMessageDecoder", PROTO_MESSAGE_DECODER)

                        //Encoder
                        .addLast("frameEncoder", FRAME_ENCODER)
                        .addLast("protobufEncoder", PROTOBUF_ENCODER)
                        .addLast("protoMessageEncoder", PROTO_MESSAGE_ENCODER)

                        .addLast("handler", upstreamHandler);
            }
        })

UPD :如果可能的话,我也不想将不同通道的I / O操作绑定到同一个线程。

0 个答案:

没有答案