前言
从这篇文章开始,开始进入源码分析阶段。在之前的入门篇和实战篇中,通过代码的编写和各种特性的讲解,让我们对 Netty 有了充分的感性认知。那么接下来,通过对代码的详细走读,来细细查看哪些在感性直觉背后的实现原理。
Netty 的线程模型
Netty 的线程模型其实没有什么太特别的地方,属于比较自然而然的设计。
首先,基于 Selector 可以同时监控多个链接的特性,很容易想到将所有通道都注册到一个 selector 对象,然后死循环获取通道上的就绪事件并且进行处理。这就是最朴素的设计,也就是作为的单线程模型。这种模式,比较适合客户端,用于服务端的话,因为线程数太少,无法有效的利用多核 CPU 的处理能力。
单线程无法有效的利用 CPU,而且在一个 Selector 上管理太多的链接,效率也会下降。很自然的想到利用多线程提升效率。如何使用多线程按照不同的方向扩展又有所区分。单线程模式中的点在于两个:
- 单个 Selector 关注了太多链接,导致一次取出的集合可能很大,遍历耗时太多;
- 所有的链接事件都在一个线程中处理,处理完才能处理下一个链接,导致在后面的链接长时间的等待。
根据这两点,对应的也有两种扩展模式。
模式一