反應器模式
外觀
反應器模式(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層體系結構(頁面存檔備份,存於網際網路檔案館)