简介
reactor基于事件驱动的,它有一个或多个并发输入源,有一个Service Handler,和有多个Request Handlers。
reactor模式是将一个请求通过Service Handler分发给event Handler
实现一个reactor,主要由以下几部分组成:
reactor:反应堆;主要功能:注册事件、移除事件、分发事件
- EventHandler:事件,事件处理
- SynchronousEventDemultiplexer:采集事件
- ConcreteEventHandler:请求事件
这个案例分为服务端和客户端两个,
- 服务端:服务端和普通linux上的服务程序是相同的,有客户端连接时,服务端会将标识符注册,并且不断检测fd的可读可写性,每2s向客户端发送时间
- 客户端:客户端实现也是相同的,也是通过注册fd,然后并且不断检测fd的可读可写性,向服务
端发送消息
reactor的优缺点
优点
- 响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的;
- 编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销;
- 可扩展性,可以方便的通过增加Reactor实例个数来充分利用CPU资源;
- 可复用性,reactor框架本身与具体事件处理逻辑无关,具有很高的复用性
缺点
- 相比传统的简单模型,Reactor增加了一定的复杂性,因而有一定的门槛,并且不易于调试。
- Reactor模式需要底层的Synchronous Event Demultiplexer支持,比如操作系统的select系统调
用支持,如果要自己实现Synchronous Event Demultiplexer可能不会有那么高效。 - Reactor模式在IO读写数据时还是在同一个线程中实现的,即使使用多个Reactor机制的情况下,那些共享一个Reactor的Channel如果出现一个长时间的数据读写,会影响这个Reactor中其他Channel的相应时间,比如在大文件传输时,IO操作就会影响其他Client的相应时间,因而对这种操作,则不合适使用reactor模式。