Reactor模式的基本概念
Reactor模式是事件驱动模型,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler。从结构上,这有点类似生产者消费者模式,即有一个或多个生产者将事件放入一个队列中,而一个或多个消费者主动的从这个队列中提取事件来处理;而Reactor模式则并没有队列来做缓冲,每当一个Event输入到Service Handler之后,该Service Handler会主动的根据不同的Event类型将其分发给对应的Request Handler来处理。
Reactor模式实现原理图如下:
Reactor模式的核心是解决多请求问题,如果有特别多的请求同时发生,不会因为线程池被短时间占满而拒绝服务。我们一般实现多请求的模块,会采用线程池的实现方案,这种方案对于并发量不是特别大的场景是足够用的,一般来说单机tps1000以下都是够用的,但是线程池方案的最大缺点就是,如果瞬间有大并发则会一下子耗满线程,整个服务陷入阻塞中,后续请求将无法接入。基于Reactor模式实现的方案,会有一个Dispatcher先接收event,然后快速分发给相应的耗时eventHandler处理器去处理,这样就不会阻塞请求的接收。
Reactor模式和生产者消费者模式最大的区别在于,生产者消费者模式是基于队列的实现,能够解决生产端和消费端处理速度不同步的问题,queue可以基于Java Queue或者基于现有的MQ产品来实现;而Reactor模式是基于事件驱动模型,当接收到请求后会将请求封装成事件,并将事件分发给相应处理事件的Handler,handler处理完成后将事件状态修改为下一个状态,再由Reactor将事件分发给能够处理下一个状态的handler进行处理。
Reacor模式的优缺点
- 优点:
操作系统可以在多个事件源上等待,并且避免了多线程编程相关的性能开销和编程复杂性;
事件的串行化对应用是透明的,可以顺序的同步执行而不需要加锁;
事务分离:将与应用无关的多路分解和分配机制和与应用相关的回调函数分离开来。 - 缺点:
Reactor处理耗时长的操作会造成事件分发的阻塞,影响到后续事件的处理;
模型复杂,因为涉及到内部回调,多线程处理,不容易调试;
需要操作系统底层支持,导致不同操作系统可能会产生不一样的结果。
总的来说如果并发要求不是那么高,使用传统的阻塞线程池模型足够了,而且调试、查问题都会简单很多。如果我们的使用场景是会产生瞬时大并发,可以使用Reactor模式来实现。