用于 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
。
我正在编写要执行一些非常繁重的计算的 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
。