语义
- 数据写到输出缓存后,立即从网卡写出去;
- 方法的每次执行,都会调用系统调用:flush(),会影响吞吐量;
优点
缺点
改进方法 1:利用 channelReadComplete()
示例代码如下:
public class EchoServer extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ctx.write(msg);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
ctx.flush();
}
}
缺点:
- 不适合异步业务场景处理(不复用 NioEvengLoop 中的线程,比如 IO 密集型的业务由单独的线程池处理),在异步业务场景中,channelRead 中的 write 很可能发生在 channelReadComplete 之后;
- 不适合更精细的控制,比如连续读 16 次,第 16 次是 flush,但是如果保持连续的次数不变,如何做到 3 次就 flush;
改进方式 2:FlushConsolidationHandler
示例代码如下:
// 对 ctx.writeAndFlush(Object msg) 的优化的 Handler
pipeline.addLast("flushEnhance",
// explicitFlushAfterFlushes:把 5 个 flush 攒到一起 flush;
// consolidateWhenNoReadInProgress:异步也增强;
new FlushConsolidationHandler(5, true));