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

更新於 發佈於 閱讀時間約 3 分鐘
上一篇有講完【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

筆者的話

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

參考資料:

avatar-img
14會員
29內容數
技術筆記紀錄、生活隨筆
留言
avatar-img
留言分享你的想法!

































































Scott Salon 的其他內容
上一篇有提到﹝NGINX﹞低消耗高效能的原由,正來至於它優秀的架構設計,其架構主要包括:『模組化設計』、『事件驅動架構』、『請求多階段非同步處理』、『管理程式與多工程式設計』、『記憶體池設計』。 而這邊透過自己的理解,來專門介紹『模組化設計』,以此來幫助自己認識NGINX架構的內容。 核心模組:
什麼是NGINX ﹝NGINX﹞是一款免費的開源軟體的非同步框架的Web Server
上一篇有提到﹝NGINX﹞低消耗高效能的原由,正來至於它優秀的架構設計,其架構主要包括:『模組化設計』、『事件驅動架構』、『請求多階段非同步處理』、『管理程式與多工程式設計』、『記憶體池設計』。 而這邊透過自己的理解,來專門介紹『模組化設計』,以此來幫助自己認識NGINX架構的內容。 核心模組:
什麼是NGINX ﹝NGINX﹞是一款免費的開源軟體的非同步框架的Web Server
你可能也想看
Google News 追蹤
Thumbnail
在這篇文章中,我們深入探討系統架構的不同層面,尤其關注於軟體層面。文章介紹了幾種常見的架構模式,包括一體化架構、微服務架構、事件驅動架構、服務導向架構及無服務架構,並討論了其優缺點。此外,我們還探討了技術選型與性能優化的重要性,並提供實用的建議,幫助讀者在未來的軟體開發中做出更明智的選擇。
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
※ 觀察者模式 定義: 觀察者模式(Observer Pattern)是一種設計模式,涉及兩個主要角色:觀察者(Observers)和被觀察者(Subject)。在這種模式中,一群觀察者訂閱並觀察某個被觀察的對象。當被觀察者的狀態發生改變時,它會通知所有觀察者,讓他們知曉並作出相應的反應。這種模
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
Thumbnail
訊息的即時傳遞已然成為現代社會的趨勢了, 而扮演中樞平台的系統架構功能也漸趨複雜完整, Kafka是一個事件流平台, 正好滿足串流時代之下的即時訊息傳遞架構, 因此我們有必要深入來學習這套事件流平台, 不論是自動化、金融交易、IOT、物流…皆離不開即時的需求, 所以就讓我們蹲好馬步來好好的學習一
※ 說明事件委派 (Event Delegation) ,背後的運作機制。 網頁元素接收事件的順序,流程有兩種個方向的傳遞: 由下而上的,稱為事件冒泡 (event bubbling) 由上而下的,稱為事件捕獲 (event capturing) ※ 事件冒泡 Event Bubbling
Thumbnail
探討《學矽谷人做身體駭客》一書,強調神經語言程式學在改善行為表現上的應用,特別是透過次感元進行心理排練。作者反思了對次感元概念的理解,並以民事訴訟中規則的重要性為例,說明系統性建構的價值。文章最後強調理論與實踐相結合的重要性。
Thumbnail
在這篇文章中,我們深入探討系統架構的不同層面,尤其關注於軟體層面。文章介紹了幾種常見的架構模式,包括一體化架構、微服務架構、事件驅動架構、服務導向架構及無服務架構,並討論了其優缺點。此外,我們還探討了技術選型與性能優化的重要性,並提供實用的建議,幫助讀者在未來的軟體開發中做出更明智的選擇。
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
※ 觀察者模式 定義: 觀察者模式(Observer Pattern)是一種設計模式,涉及兩個主要角色:觀察者(Observers)和被觀察者(Subject)。在這種模式中,一群觀察者訂閱並觀察某個被觀察的對象。當被觀察者的狀態發生改變時,它會通知所有觀察者,讓他們知曉並作出相應的反應。這種模
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
Thumbnail
訊息的即時傳遞已然成為現代社會的趨勢了, 而扮演中樞平台的系統架構功能也漸趨複雜完整, Kafka是一個事件流平台, 正好滿足串流時代之下的即時訊息傳遞架構, 因此我們有必要深入來學習這套事件流平台, 不論是自動化、金融交易、IOT、物流…皆離不開即時的需求, 所以就讓我們蹲好馬步來好好的學習一
※ 說明事件委派 (Event Delegation) ,背後的運作機制。 網頁元素接收事件的順序,流程有兩種個方向的傳遞: 由下而上的,稱為事件冒泡 (event bubbling) 由上而下的,稱為事件捕獲 (event capturing) ※ 事件冒泡 Event Bubbling
Thumbnail
探討《學矽谷人做身體駭客》一書,強調神經語言程式學在改善行為表現上的應用,特別是透過次感元進行心理排練。作者反思了對次感元概念的理解,並以民事訴訟中規則的重要性為例,說明系統性建構的價值。文章最後強調理論與實踐相結合的重要性。