Netty 系列目錄 (http://www.javashuo.com/article/p-hskusway-em.html)html
本文介紹 DC Schmidt 大神的一篇文章《Reactor: an object behavioral pattern for concurrent event demultiplexing and event handler dispatching》react
反應器設計模式(Reactor pattern)是一種爲處理併發服務請求,並將請求提交到一個或者多個服務處理程序的事件設計模式。當客戶端請求抵達後,服務處理程序使用多路分配策略,由一個非阻塞的線程來接收全部的請求,而後派發這些請求至相關的工做線程進行處理。 Reactor模式主要包含下面幾部份內容。編程
初始事件分發器(Initialization Dispatcher) :用於管理 Event Handler,定義註冊、移除 EventHandler 等。它還做爲 Reactor 模式的入口調用 Synchronous Event Demultiplexer 的 select 方法以阻塞等待事件返回,當阻塞等待返回時,根據事件發生的 Handle 將其分發給對應的 Event Handler 處理,即回調 EventHandler 中的 handle_event() 方法設計模式
同步(多路)事件分離器(Synchronous Event Demultiplexer) :無限循環等待新事件的到來,一旦發現有新的事件到來,就會通知初始事件分發器去調取特定的事件處理器。緩存
系統處理程序(Handles) :操做系統中的句柄,是對資源在操做系統層面上的一種抽象,它能夠是打開的文件、一個鏈接(Socket)、Timer 等。因爲 Reactor 模式通常使用在網絡編程中,於是這裏通常指 Socket Handle,即一個網絡鏈接(Connection,在 Java NIO 中的 Channel)。這個 Channel 註冊到 Synchronous Event Demultiplexer 中,以監聽 Handle 中發生的事件,對 ServerSocketChannnel 能夠是 CONNECT 事件,對 SocketChannel 能夠是 READ、WRITE、CLOSE 事件等。服務器
事件處理器(Event Handler) : 定義事件處理方法,以供 Initialization Dispatcher 回調使用。網絡
(1) Part A多線程
對於一個事件驅動的分佈式日誌登陸服務系統,以下圖1所示。併發
客戶端應用經過日誌服務來錄入它們當前狀態和記錄,這些狀態可記錄可能包含了錯誤通知信息、斷點調試信息等。日誌記錄被髮送到一箇中央日服務器上,該服務器能夠處理日誌和鏈接用戶請求。客戶端想要記錄日誌信息,首先必須發送一個鏈接請求給服務器。服務器經過一個「處理工廠」來監聽客戶端對應的地址信息,以等待這些鏈接請求的到來。當一個鏈接請求到來時,「處理工廠」就建立一個handle,其表明了鏈接的端點,用來創建客戶端和服務器之間的鏈接。當handle收到來自客戶端的請求鏈接時,就會返回給服務器。一旦客戶端鏈接成功,它們就能夠同時發送日誌記錄到服務器。分佈式
(2) Part B
或許最有效的方法來開發一個併發日誌系統是使用多線程,這樣能夠同時處多個理客戶端請求,以下圖2所示。
然而,多線程實現這樣的分佈式日誌系統可能會面臨下面的問題:
(3) Part C
針對上面的問題,能夠集成同步多路分解事件並分發相應的事件處理程序來處理相應的事件。對於每個應用程序所提供的服務,引入一個單獨的事件處理器處理某些類型的事件。全部事件處理程序實現了相同的接口。事件處理程序註冊一個初始調度程序,它使用一個同步事件信號分離器等待事件發生。當事件發生時,同步事件信號分離器通知初始調度器,它同步告知事件處理程序去關聯對應的事件。事件處理程序而後分派事件到實現了所請求服務的方法中。
客戶端鏈接到日誌服務器所通過的一系列步驟以下圖所示:
日誌服務器記錄日誌所通過的一系列步驟以下圖所示:
針對上面的問題,能夠集成同步多路分解事件並分發相應的事件處理程序來處理相應的事件。對於每個應用程序所提供的服務,引入一個單獨的事件處理器處理某些類型的事件。全部事件處理程序實現了相同的接口。事件處理程序註冊一個初始調度程序,它使用一個同步事件信號分離器等待事件發生。當事件發生時,同步事件信號分離器通知初始調度器,它同步告知事件處理程序去關聯對應的事件。事件處理程序而後分派事件到實現了所請求服務的方法中。
上述日誌系統的 Reactor 模式類圖以下所示:
參考:
天天用心記錄一點點。內容也許不重要,但習慣很重要!