原创

Netty设计巧妙的地方

全网最全 Java 知识点整合总目录入口猛戳-->www.gameboys.cn

Netty 全网最全示例源码地址猛戳-->https://github.com/Sniper2016/NettyStudy

1.ByteBuf设计

Netty 的 ByteBuf 采用了读写索引分离的策略(readerIndex 与 writerIndex),一个初始化(里面尚未有任何数据)的 ByteBuf 的 readerIndex 与 writerIndex 值都为 0

2.使用无锁设计

为了尽可能地提升性能,Netty 在很多地方进行了无锁化的设计,例如在 I/O 线程内部进行串行操作,避免多线程竞争导致的性能下降问题。表面上看,串行化设计似乎 CPU 利用率不高,并发程度不够。但是,通过调整 NIO 线程池的线程参数,可以同时启动多个串行化的线程并行运行,这种局部无锁化的串行线程设计相比一个队列—多个工作线程的模型性能更优。 Netty 的 NioEventLoop 读取到消息之后,直接调用 ChannelPipeline 的 fireChannelRead (Object msg)。只要用户不主动切换线程,一直都是由 NioEventLoop 调用用户的 Handler,期间不进行线程切换。这种串行化处理方式避免了多线程操作导致的锁的竞争,从性能角度看是最优的。

例子: AbstractChannelHandlerContext.invokeChannelRead(final AbstractChannelHandlerContext next, Object msg)调用,


    static void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) {
        final Object m = next.pipeline.touch(ObjectUtil.checkNotNull(msg, "msg"), next);
        EventExecutor executor = next.executor();
        if (executor.inEventLoop()) {
            next.invokeChannelRead(m);
        } else {
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    next.invokeChannelRead(m);
                }
            });
        }
    }

3.异步IO操作监听器

Future和Promise的设计,巧妙的解决了Netty异步IO的回调问题

Netty 的 Future,只是增加了监听器。整个异步的状态,是不能进行设置和修改的。换句话说,Future 是只读的,是不可以写的。于是,Netty 的 Promise 接口扩展了 Netty 的 Future 接口,它表示一种可写的 Future,就是可以设置异步执行的结果。

4.channel使用组合方式,将IO操作都交给Unsafe接口及其子类实现,减少耦合。

5.线程模型

使用Reactor设计思路,提高了Netty框架拓展性和复用性

Netty 的线程模型
Netty 的线程模型
Netty线程模型和Reactor模型对比
Netty线程模型和Reactor模型对比
正文到此结束