NGINX 架構 - 《事件驅動架構》

更新於 發佈於 閱讀時間約 4 分鐘

上一篇有講完【NGINX 架構 - 《模組化設計》】後,接下來這邊透過自己的理解,來專門介紹『事件趨動架構』,以此來幫助自己認識NGINX架構的內容。

什麼是「事件驅動架構」

事件驅動架構並非是NGINX獨有的名詞,也並非只應用於電腦程式設計領域,它是一種古老的回應事件模型,在電腦程式設計、公共關係、經濟活動等領域均有很廣泛的應用。《節錄於 Nginx技術手札:網頁伺服器應用全攻略 3.3章節》

而這邊指的事件驅動架構是一種程式設計的方式 - 事件驅動程式設計(Event-driven programming)

事件驅動程式設計Event-driven programming)是一種電腦程式設計模型。這種模型的程式執行流程是由使用者的動作(如滑鼠的按鍵,鍵盤的按鍵動作)或者是由其他程式的訊息來決定的。更多細節,可閱維基百科《事件驅動程式設計

事件驅動架構,主要是由「事件收集器」、「事件發送器」、「事件處理器」三個基本單元組成的,如同名稱上的意思,由使用者觸發事件(滑鼠點擊),然後透過事件收集器來收集事件,再由事件發送器來分配事件,最後才由事件處理器來處理這些事件。

事件驅動架構

事件驅動架構

Nginx Server回應和處理Web請求的過程,就是以事件驅動模型為基礎的,因此事件收集器和事件發送器,顧名思義,就不需要多做解釋了,最主要的是「事件處理器」。

事件收集器:負責收集 worker 進程的各種 IO 請求
事件發送器:負責將 IO 事件發送到 事件處理器
事件處理器:負責各種事件的響應工作

事件處理器有三種實現的方式:

1. 進程(Process)事件處理器

「事件處理器」收到事件後,「目標物件」就建立一個進程(Process),來處理該事件,透過此方式處理事件,會讓Server負擔較大,因此效能較差,但實現較為容易。

進程的優缺點:
優點:每個進程有自己獨立的系統資源分配空間,不同進程之間的資源不共享,因此不需要特別對進程做互斥存取的處理。
缺點:建立進程以及進程的上下文切換(Context Switch)都較消耗資源,進程間若有通訊的需求也較為複雜。
(截錄於:莫力全 Kyle Mo - 程序(進程)、執行緒(線程)、協程,傻傻分得清楚! )

2. 線程(thread)事件處理器

「事件處理器」收到事件後,「目標物件」就建立一個線程(thread),來處理該事件,透過此方式處理事件,可能會遇到鎖死、同步等諸多問題,且編碼複雜。

3. 非阻塞I/O事件處理器

「事件處理器」收到事件後,「目標物件」就將其放入一個待處理事件的列表,使用非阻塞I/O方式來處理事件。透過此方式處理事件,代碼、邏輯都比上述兩者還複雜,現今大多數網路伺服器都是採用此種方式,因此就有了「事件驅動處理函數庫」。

使用多線程或多進程來處理,會有以下兩種缺點 :
1. 高併發會爆,因此進程或線程數有限制,且上下文切換。
2. 如果應用大部份的服務是 I/O 會很浪費資源(因為就為了等待,而用不少記憶體開進程,但是他大部份都只是在等待)。
(截錄於 拿鐵派的馬克 Blog - 30-07 之應用層的 I/O 優化 - 非阻塞 I/O 模型)
連結:什麼是進程?什麼是線程?
連結:什麼是非阻塞I/O

筆者的話

原本打算把「事件驅動處理函數庫」的模組也寫在這篇,但深入地去認識了解後,發現吸收上著實需要花一些時間,因此打算寫在下一篇了。
還是那句話:寫這本影子書的目的,是為了督促自己讀書!

參考資料:

a. 事件驅動程式設計維基百科
b. Nginx技術手札:網頁伺服器應用全攻略
c. 拿鐵派的馬克 Blog - 30-07 之應用層的 I/O 優化 - 非阻塞 I/O 模型
d. 莫力全 Kyle Mo - 程序(進程)、執行緒(線程)、協程,傻傻分得清楚!



留言
avatar-img
留言分享你的想法!
avatar-img
Scott Salon
14會員
27內容數
技術筆記紀錄、生活隨筆
Scott Salon的其他內容
2022/07/08
承上篇【NGINX 架構 - 事件驅動架構】後續,這篇開始記錄函數庫的相關筆記 事件驅動處理函數庫: 函數庫的細節,就沒打算太過深入,我們只要知道模型的運作方式、優缺點及如何使用就足夠了。 1. select模型: 手動啟用模組編譯: 禁用模組編譯: 2. poll模型: Nginx編譯代碼:
Thumbnail
2022/07/08
承上篇【NGINX 架構 - 事件驅動架構】後續,這篇開始記錄函數庫的相關筆記 事件驅動處理函數庫: 函數庫的細節,就沒打算太過深入,我們只要知道模型的運作方式、優缺點及如何使用就足夠了。 1. select模型: 手動啟用模組編譯: 禁用模組編譯: 2. poll模型: Nginx編譯代碼:
Thumbnail
2022/06/23
上一篇有提到﹝NGINX﹞低消耗高效能的原由,正來至於它優秀的架構設計,其架構主要包括:『模組化設計』、『事件驅動架構』、『請求多階段非同步處理』、『管理程式與多工程式設計』、『記憶體池設計』。 而這邊透過自己的理解,來專門介紹『模組化設計』,以此來幫助自己認識NGINX架構的內容。 核心模組:
Thumbnail
2022/06/23
上一篇有提到﹝NGINX﹞低消耗高效能的原由,正來至於它優秀的架構設計,其架構主要包括:『模組化設計』、『事件驅動架構』、『請求多階段非同步處理』、『管理程式與多工程式設計』、『記憶體池設計』。 而這邊透過自己的理解,來專門介紹『模組化設計』,以此來幫助自己認識NGINX架構的內容。 核心模組:
Thumbnail
2022/06/08
什麼是NGINX ﹝NGINX﹞是一款免費的開源軟體的非同步框架的Web Server
Thumbnail
2022/06/08
什麼是NGINX ﹝NGINX﹞是一款免費的開源軟體的非同步框架的Web Server
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
隨著系統的規模和複雜性不斷增長,事件驅動架構(EDA)已成為現代應用中的一個重要組成部分。它允許系統組件之間解耦,並使其能夠非同步、高效地處理和響應事件。
Thumbnail
隨著系統的規模和複雜性不斷增長,事件驅動架構(EDA)已成為現代應用中的一個重要組成部分。它允許系統組件之間解耦,並使其能夠非同步、高效地處理和響應事件。
Thumbnail
當我們在處理一連串的事件或請求時,責任鏈模式 (Chain of Responsibility Pattern) 就像一位隱形的助手🤖,幫助我們將這些請求一一分發給合適的處理者。
Thumbnail
當我們在處理一連串的事件或請求時,責任鏈模式 (Chain of Responsibility Pattern) 就像一位隱形的助手🤖,幫助我們將這些請求一一分發給合適的處理者。
Thumbnail
  當我們要使用執行緒的時候,就要引用System.Threading的類別庫,程式才可以使用唷!這篇內容先說明:建立與啟用執行緒、跨執行緒控制UI介面、等待或暫停時間執行緒、共享資源的部分。
Thumbnail
  當我們要使用執行緒的時候,就要引用System.Threading的類別庫,程式才可以使用唷!這篇內容先說明:建立與啟用執行緒、跨執行緒控制UI介面、等待或暫停時間執行緒、共享資源的部分。
Thumbnail
  在說執行緒(Thread)時就要先知道什麼是程式(Program)、程序(Process),才能了解什麼是執行緒(Thread),因為它們間都有著神秘的關係與關聯,再更深入一點就又會有多程序(muti-Process)、多執行緒(muti-Thread),我們就先一一說明好了,了解它們後再使用時
Thumbnail
  在說執行緒(Thread)時就要先知道什麼是程式(Program)、程序(Process),才能了解什麼是執行緒(Thread),因為它們間都有著神秘的關係與關聯,再更深入一點就又會有多程序(muti-Process)、多執行緒(muti-Thread),我們就先一一說明好了,了解它們後再使用時
Thumbnail
在搞清楚事件委託前必須先了解什麼是事件傳遞機制(Event Propagation),也就是捕獲(capture)跟冒泡(bubble),聽起來好像很難但是我昨天看完彭彭的直播課程(17:00開始)後就懂了!我寫成文章幫助記憶,也希望能幫助到大家,然後希望我面試會被考到。
Thumbnail
在搞清楚事件委託前必須先了解什麼是事件傳遞機制(Event Propagation),也就是捕獲(capture)跟冒泡(bubble),聽起來好像很難但是我昨天看完彭彭的直播課程(17:00開始)後就懂了!我寫成文章幫助記憶,也希望能幫助到大家,然後希望我面試會被考到。
Thumbnail
介紹 計算機架構相關名詞 📷 中央處理器 (CPU)Central Processing Unit Processors (處理器) Sockets (實體插槽) Cores (實體核心) Logical processors (邏輯核心) 超執行緒(HT)Hyper-Threading Tec
Thumbnail
介紹 計算機架構相關名詞 📷 中央處理器 (CPU)Central Processing Unit Processors (處理器) Sockets (實體插槽) Cores (實體核心) Logical processors (邏輯核心) 超執行緒(HT)Hyper-Threading Tec
Thumbnail
前言 這是第一次寫技術文章,但其實應該也只能說是蒐集很多資料並學習如何透過自己的話解釋的內容,並不能像其他大神可能分享一些很酷的技術,目標就單純是為了完成最後一週的作業(如下)。 走入非同步之前 執行環境(Execution Context) 執行環境堆疊 (Execution stack)
Thumbnail
前言 這是第一次寫技術文章,但其實應該也只能說是蒐集很多資料並學習如何透過自己的話解釋的內容,並不能像其他大神可能分享一些很酷的技術,目標就單純是為了完成最後一週的作業(如下)。 走入非同步之前 執行環境(Execution Context) 執行環境堆疊 (Execution stack)
Thumbnail
承上篇【NGINX 架構 - 事件驅動架構】後續,這篇開始記錄函數庫的相關筆記 事件驅動處理函數庫: 函數庫的細節,就沒打算太過深入,我們只要知道模型的運作方式、優缺點及如何使用就足夠了。 1. select模型: 手動啟用模組編譯: 禁用模組編譯: 2. poll模型: Nginx編譯代碼:
Thumbnail
承上篇【NGINX 架構 - 事件驅動架構】後續,這篇開始記錄函數庫的相關筆記 事件驅動處理函數庫: 函數庫的細節,就沒打算太過深入,我們只要知道模型的運作方式、優缺點及如何使用就足夠了。 1. select模型: 手動啟用模組編譯: 禁用模組編譯: 2. poll模型: Nginx編譯代碼:
Thumbnail
上一篇有提到﹝NGINX﹞低消耗高效能的原由,正來至於它優秀的架構設計,其架構主要包括:『模組化設計』、『事件驅動架構』、『請求多階段非同步處理』、『管理程式與多工程式設計』、『記憶體池設計』。 而這邊透過自己的理解,來專門介紹『模組化設計』,以此來幫助自己認識NGINX架構的內容。 核心模組:
Thumbnail
上一篇有提到﹝NGINX﹞低消耗高效能的原由,正來至於它優秀的架構設計,其架構主要包括:『模組化設計』、『事件驅動架構』、『請求多階段非同步處理』、『管理程式與多工程式設計』、『記憶體池設計』。 而這邊透過自己的理解,來專門介紹『模組化設計』,以此來幫助自己認識NGINX架構的內容。 核心模組:
Thumbnail
什麼是NGINX ﹝NGINX﹞是一款免費的開源軟體的非同步框架的Web Server
Thumbnail
什麼是NGINX ﹝NGINX﹞是一款免費的開源軟體的非同步框架的Web Server
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News