阻塞I/O

- 每一条连接都需要建立一个独立的线程来处理,机器耗费线程资源。
- 当没有数据读写时,线程还会阻塞。
Reactor模式
IO多路复用+线程池来实现。
I/O多路复用来解决会有多个线程阻塞的问题,IO多路复用只会造成一个线程阻塞。
线程池不必为每个连接都建立一个新的线程。
Reactor模型,是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式。 服务端程序处理传入多路请求,并将它们同步分派给请求对应的处理线程,Reactor模式也叫Dispatcher模式,即I/O多路复用统一监听事件,收到事件后分发(Dispatch给某进程)。
Reactor两个关键组成:
- Reactor
负责监听和分发事件,分发给适当的处理程序来对IO事件做出反应。 - Handler
处理程序执行I/O事件要完成的实际事件.
单Reactor

- Reactor对象通过select不断轮询监控客户端请求事件,收到事件后通过dispatch进行分发
- 如果是建立连接请求事件,则由Acceptor通过accept处理连接请求,然后创建一个Handler对象处理连接完成后的后续业务处理
- 如果不是建立连接事件,则Reactor会分发调用连接对应的Handler来响应
- Handler会完成read->业务处理->send的完整业务流程
单Reactor多线程
主要通过建立一个线程池。
Worker线程池会分配独立的线程完成真正的业务处理,如何将响应结果发给Handler进行处理。
主从Reactor多线程

- Reactor主线程MainReactor对象通过select监控建立连接事件,收到事件后通过Acceptor接收,处理建立连接事件。
- Accepto处理建立连接事件后,MainReactor将Socket分配Reactor子线程给SubReactor进行处理。
- SubReactor将Socket加入连接队列进行监听,并创建一个Handler用于处理各种连接事件,例如读写操作。
- 当有新的事件发生时,SubReactor会调用连接对应的Handler进行响应
- Handler通过read读取数据后,会分发给后面的Worker线程池进行业务处理
- Worker线程池会分配独立的线程完成真正的业务处理,如何将响应结果发给Handler进行处理
- Handler收到响应结果后通过send将响应结果返回给client
NIO代码
1 | package nioDemo; |
Proactor模型(异步)
主要的核心在于回调机制。
Reactor在接收事件后需要交给Reactor处理。而Proactor直接由操作系统来处理相关事件,然后返回结果。