Netty的实现图解

Netty基础概念

1.epoll函数

Netty的实现图解_第1张图片

NIO中实现多路复⽤的核⼼类是Selector,当多路复⽤器Selector调⽤select⽅法时,将会查找发⽣事件的channel,问题是,该如何在多个注册到selector上的channel中找到哪些channel发⽣了事件,此时NIO不同的版本有不同的做法。

select(早期版本) poll(1.4) epoll(1.5及以后)
操作方式 遍历 遍历 回调
底层实现 数组 链表 哈希表
IO效率 线性遍历数组中所有的channel,性能较差 线性遍历链表中所有的channel,性能较差 由操作系统将发生事件的channel存入到服务端的就绪事件列表中,selector直接从就绪事件列表中获得发生事件的channel,而不需要遍历所有的channel
最大连接 有上限 无上限 无上限

2.Reactor模型

不同的线程模型决定了程序的性能。在IO线程模型领域,并发编程之⽗Doug Lea提出了Reactor模型。Netty的线程模型就是基于Reactor模型设计的。

  • 传统的阻塞IO模型

    传统的BIO模型中,服务端的⼀条线程必须处理完⼀个客户端的所有请求后才能处理另⼀个客户端的请求。

    Netty的实现图解_第2张图片
  • 基于事件响应式的基础Reactor模型

    基础版本的Reactor模型,由单线程逐⼀处理来⾃于多个客户端的不同事件,⽽不需要等待某⼀个客户端的请求全部执⾏完才能处理另⼀个客户端的请求。

    Netty的实现图解_第3张图片
  • 提升业务处理能力的Reactor模型

    在基础Reactor模型中,Reactor在处理某⼀个客户端的读请求时,其他请求依然需要阻塞等待,如何提升这⼀块的并发性呢,就可以使⽤线程池来提升处理某⼀个具体业务的并发操作。

    Netty的实现图解_第4张图片
  • 多主多从的Reactor模型

    如果只把业务处理模块交由多线程来解决,但是在实际场景中,有可能会⾯临成千上万客户端的连接,⽽这些客户端的连接请求只能等待Reactor完成业务处理后才能被处理。此时创建⼀个独⽴的Reactor专⻔负责处理客户端的连接请求,⽽且这样的Reactor也可以⽀持多线程,那么就能解决海量客户端连接的应⽤场景。

Netty的实现图解_第5张图片

3.Netty线程模型

基于Reactor模型的Netty线程模型

Netty的实现图解_第6张图片

你可能感兴趣的:(java,开发语言,nio)