反应器模式
外观
反应器模式(Reactor pattern)是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式。当请求抵达后,服务处理程序使用解多路分配策略,然后同步地派发这些请求至相关的请求处理程序。 [1]
结构
[编辑]
select
或epoll
)典型的由操作系统来提供。反应式应用将提供分派器(事件循环)来通过调用事件处理器而反应于把柄事件,事件处理器被注册为回调[2]。
反应式应用由多个活动部份组成并依赖于一些支持机制[2]:
- 把柄(Handle)
- 具有IO和数据的针对特定请求的一个标识符和接口。这通常采用套接字、文件描述符或类似机制的形式,它们应当由大多数现代的操作系统提供。
- 解多路复用器(Demultiplexer)
- 可以有效的监视一个把柄的状态的事件通知器(notifier),它将有关的状态变更通知给其他子系统,典型的是一个IO把柄成为了“准备好读取”。传统上这个角色由select()系统调用充任,而更加现今的例子包括epoll、kqueue和IOCP。
- 分派器(Dispatcher)
- 反应式应用的实际事件循环,这个构件维护着有效的事件处理器(handler)的注册,它在一个事件被引发之时激发(invoke)适合的处理器。
- 事件处理器(Event Handler)
- 也叫做请求处理器,它是用来处理一种类型的服务请求的特定逻辑。反应器模式为了更大的灵活性而提倡将它们动态的向分派器注册为回调。缺省情况下,反应器不使用多线程,转而在跟分派器同一个线程中激发一个请求处理器。
- 事件处理器接口
- 抽象接口类,代表了事件处理器的通用属性和方法。每个特定处理器都必须实现这个接口,分派器将通过这个接口来操作事件处理器。
应用
[编辑]反应器模式及其变体已经用于很多web服务器、应用服务器和网络编程框架:
属性
[编辑]所有的反应器系统在定义上是单线程的,但可以在多线程环境中存在。
优点
[编辑]反应器模式可完全分离程序特定代码,这意味着应用可分为模块化的,可复用的组件。另外,由于请求的处理程序是同步调用,反应器模式可允许简单粗粒并发而不必添加多线程并发系统的复杂性。
限制
[编辑]由于反向的流程控制,反应器模式比过程模式更难以调试 [2]。此外,因为请求处理器只会被同步调用,因此会限制反应器模式的最大并发数,特别是在对称多处理硬件。反应器模式的可扩展性,不仅受限于请求处理器的同步调用,同时也受解多路器限制。[10]
参见
[编辑]参考
[编辑]- ^ 施密特,道格拉斯等人。《面向模式的软件架构第2卷:模式的并发和网络对象。》第2卷。Wiley出版社,2000。
- ^ 2.0 2.1 2.2 2.3 2.4 Schmidt, Douglas C., An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events (PDF), [2015-02-04], (原始内容存档 (PDF)于2015-04-05)
- ^ 3.0 3.1 Escoffier, Clement; Finnegan, Ken. Chapter 4. Design Principles of Reactive Systems
. Reactive Systems in Java. O'Reilly Media. November 2021. ISBN 9781492091721.
- ^ Garrett, Owen. Inside NGINX: How We Designed for Performance & Scale. NGINX. F5, Inc. 10 June 2015 [10 September 2023]. (原始内容存档于20 August 2023).
- ^ Devresse, Adrien. Efficient parallel I/O on multi-core architectures (PDF). 2nd Thematic CERN School of Computing. CERN. 20 June 2014 [14 September 2023]. (原始内容存档 (PDF)于8 August 2022).
- ^ Bonér, Jonas. The Reactive Patterns: 3. Isolate Mutations. The Reactive Principles. 15 June 2022 [20 September 2023].
- ^ Network Programming: Writing network and internet applications (PDF). POCO Project. Applied Informatics Software Engineering GmbH: 21–22. 2010 [20 September 2023].
- ^ Stoyanchev, Rossen. Reactive Spring. Spring.io. 9 February 2016 [20 September 2023].
- ^ Reactor Overview. twisted.org. [28 July 2024].
- ^ Kegel, Dan, The C10K problem, [2007-07-28], (原始内容存档于2013-07-18)
外部链接
[编辑]- 对象行为模式的解复用和调度处理对同步活动(页面存档备份,存于互联网档案馆) 由 Douglas C.施密特
- APR网络和反应器模式(页面存档备份,存于互联网档案馆)
- 高度可扩展的NIO的服务器的体系结构
- Akka的I/O层体系结构(页面存档备份,存于互联网档案馆)