1.传统I/O模型
2.Reactor模式
3.单Reactor单线程
4.单Reactor多线程
5.主从Reactor多线程
6.Reactor模式特点总结
不同的线程模式对于性能有巨大的影响,为了后续更好地开展Netty的线程模式,我们先来看下各种线程模式的原理和区别,最后进行对比。
1.传统I/O模型
1.1)工作原理图:
文章图片
1.2)模型特点:
传统I/O模型也就是BIO模型,这在我们前面已经介绍过。Netty网络编程——Netty的基本介绍与BIO,它的缺点有:
1)每个请求都要创建线程,浪费资源。
2)连接建立后,如果服务端的数据还没有准备好,则服务端线程不会去处理别的请求,会阻塞,造成资源浪费。
2.Reactor模式
针对传统I/O模型的缺点,我们有如下的解决方案:
1)基于多路复用,一个线程处理多个客户端连接。
2)业务逻辑处理线程基于线程池,一个线程可以处理多个连接的业务。
Reactor模式原理图:
文章图片
我们从图中可以得出,
1)服务器端程序处理传进来的多个请求,并将他们分派给对应的处理线程,我们称之为Reactor(反应堆)模式。
2)Reactor采用IO多路复用,一个Handler处理多个客户端连接,处理线程完毕后,会通过Handler返回对应的客户端。
我们可以得出Reactor里有两个角色:
ServiceHandler:负责监听和分发事件,分发给适当的线程来对业务逻辑进行处理。
EventHandler:处理请求的实际线程。
Reactor模式还分为三种:
单Reactor单线程,单Reactor多线程,主从Reactor多线程,我们来依次进行讲解。
3.单Reactor单线程
原理图:
文章图片
处理逻辑:
1)当有client请求的时候,我们通过select进行I/O多路复用处理请求。
2)Reactor通过select监听客户端事件,通过dispatch来转发请求。
3)如果是建立连接的请求,我们使用Acceptor通过accept处理请求。
4)如果是不是建立连接请求,Reactor则会调用对应的Handler解决。
总结:
服务器端用一个线程完成所有客户端的IO操作,模型简单易懂。
优缺点分析:
优点:
1)简单,没有线程竞争,全部都由一个线程完成。
缺点:
1)性能不佳,一个线程要处理这么多请求,当Handler正在进行I/O密集型的操作时,整个Reactor无法处理其它事件。
2)高度耦合性,导致线程出现异常的时候,会导致整个模块不可用。
4.单Reactor多线程
原理图:
文章图片
处理逻辑:
1)通过Reactor中的select处理所有连接请求。
2)通过Reactor中的dispatch来分发请求。
3)通过Acceptor来处理连接。
4)通过不同的handler来处理不同的处理请求,但是不做具体处理,而是通过send发送给线程池。
5)worker线程业务处理完毕后,将结果返回handler。
优缺点分析:
优点:相比单线程模式,更能发挥cpu的能力。
缺点:建立连接的线程还是只有一个,在连接数多的情况下,容易出现瓶颈。
5.主从Reactor多线程
针对单Reactor中的连接数过大造成的瓶颈,可以让Reactor在多线程中进行运行。
原理图:
文章图片
处理逻辑:
1)MainReactor主线程通过select处理多个连接请求,以及处理建立连接的逻辑。
2)MainReactor接受到处理事件后,把事件分发给Reactor子线程。
3)SubReactor将连接加入到连接队列进行监听,并根据事件创建不同的handler
4)handler将对应的事件分发给worker线程进行处理。
5)返回结果
6)Reactor主线程可以对应多个Reactor子线程。
优缺点分析:
优点:
1)父子线程职责明确,父线程只需要建立连接,子线程处理业务逻辑
2)父子线程只需要进行转发即可,交互简单。
缺点:
1)编程复杂度高。
6.Reactor模式特点总结
【Netty网络编程——Reactor模式高性能架构设计原理】1)响应快,不必为某个长时间处理的业务进行阻塞等待。
2)分工明确,各自的线程处理各自的逻辑,单一职责。
3)扩展性好,主需要增加不同的Handler就可以处理不同的任务,还不用修改原来的代码。
4)复用性好,Reactor与具体的逻辑无关,具有很高的复用性。
5)避免复杂的多线程的切换开销。