netty源码分析及优点

梦里梦外; 2022-11-16 16:34 277阅读 0赞

今天梳理了一下netty源码调用流程,整理了一下详细流程图,如下

netty流程图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NjMwODEw_size_16_color_FFFFFF_t_70

netty的优点

  1. Reactor主从设计模型
  2. Nio非阻塞
  3. 无锁化串行
  4. 零拷贝(使用直接内存)
  5. ByteBuf内存池
  6. 灵活的TCP参数配置能力
  7. 并发优化

然后找几个解释一下,如下

Reactor主从设计模型

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NjMwODEw_size_16_color_FFFFFF_t_70 1

Netty 抽象出两组线程池BossGroup和WorkerGroup,BossGroup和WorkerGroup类型都NioEventLoopGroup,BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写,bossGroup每次和客户端执创建完连接,都会(轮询)选择一个workGroup,把selectorKey注册到workGroup上NIOEventLoop的selector,所以客户端下一次进行数据交互的时候就会在workGroup上。

无锁化串行

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NjMwODEw_size_16_color_FFFFFF_t_70 2

#

在Netty中的无锁化串行是指数据在ChannelPipeline中执行Handler是串行执行的,不存在多线程,这样就减少了为了竞争锁带来的性能下降,我们可以通过配置NIO线程池参数来指定多个串行线程并行运行,这样的效率会更高。而且Redis也是利用这种思想来设计的。

直接内存

直接内存指的是元空间或者物理机的内存,是堆外内存。

使用直接内存的优点如下

  1. 不占用堆内存空间,减少了发生GC的可能
  2. 不需要从物理内存拷贝到堆内存(零拷贝原理)。

缺点:

  1. 初始分配慢
  2. 没有jvm管理,容易出现fullGC

#

零拷贝

数据在交互过程中一般需要先从socket中拷贝到物理内存,然后从物理内存在拷贝到jvm内存,处理完之后再从jvm内存拷贝到物理内存,物理内存写出到socket中,这是一个完整的数据传输过程,而零拷贝是指由于使用了直接内存,并不需要从物理内存拷贝到jvm内存,jvm堆内使用是地址指向直接内存,少了一次交互,所以称之为零拷贝。

发表评论

表情:
评论列表 (有 0 条评论,277人围观)

还没有评论,来说两句吧...

相关阅读