Netty'的解决方案;s每个处理程序/通道的单线程限制
在Netty 4中,有这样一个选项:“Netty'的解决方案;s每个处理程序/通道的单线程限制,netty,Netty,在Netty 4中,有这样一个选项:“EventExecutor和EventLoop分配给处理程序或通道的始终是单线程的。”这看起来有利于线程安全,但在处理数百个连接的情况下,对吞吐量并不是很好。当有空闲线程处理某些事件时,它们可能正在队列中等待。在我的研究中,我发现了相关的和,但对事件循环、组、执行器和调用器非常困惑,无法理解如何使用它们来获得我想要的 我有一套处理程序来编码和解码数据,并将输入消息重定向到akka系统。有些消息很大,序列化/反序列化它们需要花费宝贵的时间。我希望这个处理程序不
EventExecutor
和EventLoop
分配给处理程序或通道的始终是单线程的。”这看起来有利于线程安全,但在处理数百个连接的情况下,对吞吐量并不是很好。当有空闲线程处理某些事件时,它们可能正在队列中等待。在我的研究中,我发现了相关的和,但对事件循环、组、执行器和调用器非常困惑,无法理解如何使用它们来获得我想要的
我有一套处理程序来编码和解码数据,并将输入消息重定向到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操作绑定到同一线程