用于 IO 的 Netty 无所事事编解码器?

Netty do-nothing codec for IO?

我正在编写要执行一些非常繁重的计算的 http 服务器。我有一些与业务逻辑和阻塞 IO 相关的编码器-解码器管道。

public void initChannel(Channel ch) { 
    ch.pipeline()
         //All actions in these handlers are very heavy and involve some IO
        .addLast(logicGroup, new HttpRequestDecoder())
        .addLast(logicGroup, new HttpObjectAggregator(Int.MaxValue))
        .addLast(logicGroup, new HttpResponseEncoder())
        .addLast(logicGroup, new ChunkedWriteHandler())
        .addLast(logicGroup, new ResponseBodyDecoder())
        .addLast(logicGroup, new MyBusinessLogic())
}

所以我决定再创建一个worker

EventLoopGroup ioGroup = new NioEventLoopGroup(4)

并在最开始添加简单的处理程序:

.addLast(ioGroup, new ChannelDuplexHandler()) //<---- Only for IO
.addLast(logicGroup, new HttpRequestDecoder())
.addLast(logicGroup, new HttpObjectAggregator(Int.MaxValue))
.addLast(logicGroup, new HttpResponseEncoder())
.addLast(logicGroup, new ChunkedWriteHandler())
.addLast(logicGroup, new ResponseBodyDecoder())
.addLast(logicGroup, new MyBusinessLogic())

Netty 中这样的做法常见吗?或者有更好的方法吗?

如果您想在 IO 线程上 运行 添加处理程序到管道时,通常不会指定 executorGroup。我的建议是这样构建管道:

EventExecutorGroup executorGroup = new DefaultEventExecutorGroup(numberOfThreads);

...

public void initChannel(Channel ch) { 
    ch.pipeline()
      .addLast(new HttpRequestDecoder())
      .addLast(new HttpObjectAggregator(Int.MaxValue))
      .addLast(new HttpResponseEncoder())
      .addLast(new ChunkedWriteHandler())
      .addLast(new ResponseBodyDecoder())
      .addLast(executorGroup, new MyBusinessLogic());
}

这将使您的 MyBusinessLogic 运行 处于另一个线程中并且不会阻塞 IO 线程。如果 ResponseBodyDecoder 在 cpu / 或块上也很重,您也可以在此处使用 executorGroup