Reactor模式

shigp1發表於2024-09-28

Reactor Pattern

借用一張圖展示Reactor模式的結構:

Reactor模式

我們都知道Node.js是事件驅動模型,該模型涉及事件多路分解器和事件佇列。所有的io請求都會變成一系列的事件。

接下來我們看看上圖的Reactor模式發生了什麼?

  1. 事件多路分解器會接受來自應用程式的I/O請求, 然後轉給對應I/O硬體處理, 當然應用程式同時會指定一個處理程式(Handler)。
  2. 當一組I/O操作完成時候,事件多路分解器將會把新的事件和事件對應的Handle推進事件佇列(Event Quene)。
  3. 此時Event Loop一直去遍歷Event Quene中的item。
  4. 取出每個事件關聯的處理程式(Handle)去執行。
  5. 當執行某個事件的處理程式(Handle)這個過程中如果又產生新的非同步請求如圖中的5b,此時又回進入新的一輪I/O請求插入到事件多路分解器。另外需要注意的是事件處理程式執行完閉會把控制權返回給Event Loop。

Event Loop是單執行緒和半無限迴圈。被稱為半無限迴圈的原因是因為如果Event Quene中沒有事件或Event Demultiplexer沒有任何待處理請求,這實際上會在某個時刻退出。

事件多路分解器不是現實世界中存在的元件,而是Reactor模式中的抽象概念。在現實世界中,每個作業系統都有自己的事件多路分解器,例如Linux中的epoll,BSD系統中的kqueue(MacOS),Windows中的IOCP等。

但是Node.js需要達到跨平臺, 就需要磨平這些平臺的差異, 所以Node團隊開發了一個名叫libuv的庫, libuv提供了一個跨平臺的抽象,由平臺決定使用libev或IOCP。

下圖是常見的libuv的架構圖:

libuv

資料

本文僅作為個人筆記, 有誤請斧正。

來源:https://juejin.im/post/5c33722be51d45522d172dba

相關文章