netty优化使用-增强写数据功能,流量整形,不同平台开启naive

netty增强写数据功能

  • 一般我们发送数据会采用如下方法进行发送数据
- `public class BussinessProcessHandler extends SimpleChannelInboundHandler<Object> {
    protected void channelRead0(ChannelHandlerContext ctx, Object o) throws Exception {
        ctx.writeAndFlush()
    }
}`

使用ctx.writeAndFlush(),这种方式为相当于加急式快递,每次write后就调用Flush,这样会对吞吐量有影响

  • 改进方式1.利用channelReadComplete
    • 实现:我们在read的时候write,在readComplete时flush,这样就减少了flush次数
public class BussinessProcessHandler extends SimpleChannelInboundHandler<Object> {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ctx.write(new Object());
    }

    protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
        
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.flush();
    }
}
  • 缺点: 1.不适合异步业务线程。因为channelRead中的业务处理结果的write可能发生在channelReadComplete之后
    2.不适合精细控制,例如连续16次读时,flush一次,不能保持连续的次数不变
  • 改进方式2:利用flushConsolidationHandler减少flush使用
    • 实现: 比如这边就是5次flush才真正flush一次
socketChannel.pipeline().addLast(new FlushConsolidationHandler(5,true));
- 缺点:牺牲了一定的延时

netty流量整形

  • 流量整形用途: 例如:1.百度云盘限速,2.高峰期限流
  • netty内置的三种流量整形
    • 全局级别:GlobalTrafficShapingHandler
    • channel级别:ChannelTrafficShapingHandler
    • 全局级别和channel级别:GlobalChannelTrafficShapingHandler
  • netty流量整形总结
    • 读写流控判断:按一定时间段checkInterval(1s)来统计,writeLimit/readLimit设置为0时,标识关闭写/读整形
    • 等待时间范围控制,10ms-15s
    • 读流控:取消读事件,让读缓存区满,然后客户端无法写进去,对端就会减少发送
    • 写流控,待发数据入queue,等待4s或单个channel缓存的数据超过4M或者所有缓存数据超过400M时,修改为不可写
  • netty流量整形使用
public class MyServerInitializer extends ChannelInitializer<SocketChannel> {

    Charset utf8 = Charset.forName("utf-8");
    final int M = 1024 * 1024;
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {

        GlobalTrafficShapingHandler globalTrafficShapingHandler = new GlobalTrafficShapingHandler(ch.eventLoop().parent(), 10 * M, 50 * M);
//        globalTrafficShapingHandler.setMaxGlobalWriteSize(50 * M);
//        globalTrafficShapingHandler.setMaxWriteSize(5 * M);
        ch.pipeline().addLast("GlobalTrafficShapingHandler", globalTrafficShapingHandler);
    }
}

不同平台启用native

  • 如何开启native
    • 例如在linux下,
      NioEventLoopGroup → EpollEventLoopGroup
      NioEventLoop → EpollEventLoop
      NioServerSocketChannel → EpollServerSocketChannel
      NioSocketChannel → EpollSocketChannel
    • 准备好native库 ,netty已经有了实现
  • 常见问题:在这里插入图片描述
    准备的库与实际运行的不一样

你可能感兴趣的:(java)