嗡嗡嗡~

Reactor pattern

2017-08-27 (2018-04-08 updated)

這篇 paper

問題 & 情境

Reactor pattern 處理一個 application 收到從一個或多個 client 同時(concurrently)送 request 的情況。

分散式環境的 server 必須處理多個送 request 過來的 client。為了處理 request,server 必須 demultiplex 以及 dispatch request 給對應的 service。設計 demultiplexing 及 dispatching 需考量:

Solution

整合 demultiplexing 以及 dispatching 並且 decouple 通用的 event demultiplexing & dispatching 以及處理 request 的 service 實作邏輯、屬於應用邏輯的部份。讓 dispatch 歸 dispatch,應用邏輯歸應用邏輯,兩邊別混在一起。

Structure

看圖說故事比較容易,圖片出處

Reactor

流程

  1. application 向 Initiation Dispatcher 註冊 Concrete Event Handler,告訴 Initiation Dispatcher 這個 handler 處理哪種 event。
  2. application call Initiation Dispatcher 的 handle_events() 進入 event loop。Initiation Dispatcher 由 Event Handler 取得 Handle 交給 Synchronous Event Demultiplexer 等待 event。
  3. event 發生時 Synchronous Event Demultiplexer 通知 Initiation Dispatcher(以 select() 來說是 return)。
  4. Initiation Dispatcher call 對應 Event Handler 的 function 來處理 event。

Reactor

優缺點

優點

缺點

實作細節

流程上雖然一開始就向 Dispatcher 註冊完 event handler,但也可能是某種 event handler 處理 event 時才生另外的 event handler 並且註冊,即註冊及移除 event handler 是動態的。例如 Linux 處理 accept socket connection 的 event handler 在 accept() 後才生處理 client request 的 event handler 並向 Dispatcher 註冊,之後由該 event handler 處理 client 的 request。


Blog comments powered by Disqus