1. 程式人生 > >Netty Reator(三)Reactor 模型

Netty Reator(三)Reactor 模型

Netty Reator(三)Reactor 模型

Netty 系列目錄 (https://www.cnblogs.com/binarylei/p/10117436.html)

本文介紹 DC Schmidt 大神的一篇文章《Reactor: an object behavioral pattern for concurrent event demultiplexing and event handler dispatching》

一、What:Reactor 模式是什麼?

反應器設計模式(Reactor pattern)是一種為處理併發服務請求,並將請求提交到一個或者多個服務處理程式的事件設計模式。當客戶端請求抵達後,服務處理程式使用多路分配策略,由一個非阻塞的執行緒來接收所有的請求,然後派發這些請求至相關的工作執行緒進行處理。 Reactor模式主要包含下面幾部分內容。

Reactor 模式

  1. 初始事件分發器(Initialization Dispatcher) :用於管理 Event Handler,定義註冊、移除 EventHandler 等。它還作為 Reactor 模式的入口呼叫 Synchronous Event Demultiplexer 的 select 方法以阻塞等待事件返回,當阻塞等待返回時,根據事件發生的 Handle 將其分發給對應的 Event Handler 處理,即回撥 EventHandler 中的 handle_event() 方法

  2. 同步(多路)事件分離器(Synchronous Event Demultiplexer) :無限迴圈等待新事件的到來,一旦發現有新的事件到來,就會通知初始事件分發器去調取特定的事件處理器。

  3. 系統處理程式(Handles) :作業系統中的控制代碼,是對資源在作業系統層面上的一種抽象,它可以是開啟的檔案、一個連線(Socket)、Timer 等。由於 Reactor 模式一般使用在網路程式設計中,因而這裡一般指 Socket Handle,即一個網路連線(Connection,在 Java NIO 中的 Channel)。這個 Channel 註冊到 Synchronous Event Demultiplexer 中,以監聽 Handle 中發生的事件,對 ServerSocketChannnel 可以是 CONNECT 事件,對 SocketChannel 可以是 READ、WRITE、CLOSE 事件等。

  4. 事件處理器(Event Handler) : 定義事件處理方法,以供 Initialization Dispatcher 回撥使用。

一、Why:為什麼使用 Reactor 模式?

(1) Part A

對於一個事件驅動的分散式日誌登入服務系統,如下圖1所示。

客戶端應用通過日誌服務來錄入它們當前狀態和記錄,這些狀態可記錄可能包含了錯誤通知資訊、斷點除錯資訊等。日誌記錄被髮送到一箇中央日伺服器上,該伺服器可以處理日誌和連線使用者請求。客戶端想要記錄日誌資訊,首先必須傳送一個連線請求給伺服器。伺服器通過一個“處理工廠”來監聽客戶端對應的地址資訊,以等待這些連線請求的到來。當一個連線請求到來時,“處理工廠”就建立一個handle,其代表了連線的端點,用來建立客戶端和伺服器之間的連線。當handle收到來自客戶端的請求連線時,就會返回給伺服器。一旦客戶端連線成功,它們就可以同時傳送日誌記錄到伺服器。

(2) Part B

或許最有效的方法來開發一個併發日誌系統是使用多執行緒,這樣可以同時處多個理客戶端請求,如下圖2所示。

然而,多執行緒實現這樣的分散式日誌系統可能會面臨下面的問題:

  1. 可用性:伺服器必須能夠處理傳入請求即使是等待其他請求到達的。特別是,一個伺服器不能無限期地處理任何單一來源的事件而排斥其他事件源。因為這可能大大延遲響應其他客戶的時間。
  2. 效率:一個伺服器應該做到延遲最小化、吞吐量最大化,避免不必要地使用CPU。多執行緒可能會導致糟糕的效能由於上下文切換、同步和資料移動。
  3. 程式設計簡潔:伺服器的設計上應該簡化使用合適的併發策略。多執行緒可能需要複雜的併發控制方案。
  4. 可移植性:多執行緒不是可用在所有作業系統平臺。
  5. 適應性:整合新的或改進服務,如改變訊息格式或新增伺服器端快取,應該承擔最小的現有程式碼的修改和維護成本。例如,實現新應用程式服務應該不需要修改通用事件多路分解和排程機制。

(3) Part C

針對上面的問題,可以整合同步多路分解事件並分發相應的事件處理程式來處理相應的事件。對於每一個應用程式所提供的服務,引入一個單獨的事件處理器處理某些型別的事件。所有事件處理程式實現了相同的介面。事件處理程式註冊一個初始排程程式,它使用一個同步事件訊號分離器等待事件發生。當事件發生時,同步事件訊號分離器通知初始排程器,它同步告知事件處理程式去關聯對應的事件。事件處理程式然後分派事件到實現了所請求服務的方法中。

客戶端連線到日誌伺服器所經過的一系列步驟如下圖所示:

日誌伺服器記錄日誌所經過的一系列步驟如下圖所示:

二、Reactor 模型

針對上面的問題,可以整合同步多路分解事件並分發相應的事件處理程式來處理相應的事件。對於每一個應用程式所提供的服務,引入一個單獨的事件處理器處理某些型別的事件。所有事件處理程式實現了相同的介面。事件處理程式註冊一個初始排程程式,它使用一個同步事件訊號分離器等待事件發生。當事件發生時,同步事件訊號分離器通知初始排程器,它同步告知事件處理程式去關聯對應的事件。事件處理程式然後分派事件到實現了所請求服務的方法中。

上述日誌系統的 Reactor 模式類圖如下所示:

參考:

  1. 《Reactor 模型》:https://blog.csdn.net/pistolove/article/details/53152708

每天用心記錄一點點。內容也許不重要,但習慣很重要!