单线程Reactor
reactor线程负责多路分离套接字,accept新连接,dispatch分派请求到Handler处理器中,所有操作都在一个线程中。
缺点:
- 单线程模型是串行的,当其中某个handler阻塞时, 其他client的handler得不到执行,无法接收新的client请求。
- 单线程模型不能充分利用多核资源。
多线程的Reactor
reactor是一个独立线程,如果要利用多核优势,可以将reactor拆分成多个线程;handler由线程池中的线程执行。
优点
- 编程简单,可以最大程度避免复杂的多线程及同步问题
- 响应快,不会因为单个handler同步操作而阻塞阻塞,虽然Reactor本身依然是同步的
- 使用线程池,避免了多线程/进程的切换开销
- 可扩展性,可以方便的通过增加Reactor实例个数来充分利用CPU资源
- 可复用性,reactor框架本身与具体事件处理逻辑无关
缺点
- 相比传统的简单模型,Reactor增加了一定的复杂性,有一定的门槛,不易调试
- Reactor模式需要底层的Synchronous Event Demultiplexer支持,比如Java中的Selector支持,操作系统的select系统调用支持
- Reactor模式在IO读写数据时还是在同一个线程中实现的,即使使用多个Reactor机制的情况下,那些共享一个Reactor的Channel如果出现一个长时间的数据读写,会影响这个Reactor中其他Channel的相应时间,比如在大文件传输时,IO操作就会影响其他Client的相应时间,因而对这种操作,使用传统的Thread-Per-Connection或许是一个更好的选择,或则此时使用改进版的Reactor模式如Proactor模式