一、優秀的模組化設計
(1)高度抽象的模組介面
所有的模組都遵循著同樣的ngx_module_t介面設計規範。
(2)模組介面簡單,靈活性高
模組的基本介面ngx_module_t足夠簡單,只涉及模組的初始化、退出以及對配置項的處理,這同時帶來了足夠的靈活性,是的nginx比較簡單的實現了動態可修改性,也就是保持服務正常執行下使得系統功能發生改變。
102 struct ngx_module_s ;上述**中void*型別的成員ctx一般用於表示在不同型別的模組中一種型別模組所具備的通用性幾介面。
(3)多層次、多類別的模組設計
nginx常用模組機器之間的關係:
可以注意到,ngx_module_t介面中有乙個type成員,指明了nginx允許在設計模組時定義模組型別這個概念。
配置模組的型別是ngx_conf_module,僅有乙個模組。配置模組是所有模組的基礎,它實現了最基本的配置項的解析功能(就是解析nginx.conf檔案)。
nginx定義了一種基礎型別的模組:核心模組,模組型別是ngx_core_module。定義核心模組的目的是使得非模組化的框架**只關注與如何呼叫6個核心模組。
事件模組、http模組、mail模組這三種模組的共性是:實際上它們在核心模組中各有1個模組作為自己的代言人,並在同類模組中有1個作為核心業務與管理功能的模組。
事件模組是http模組和mail模組的基礎。
二、事件驅動架構
nginx採用完全的事件驅動架構來處理業務,這與傳統的web伺服器(如apache)是不同的。
對於傳統web伺服器而言,採用的所謂事件驅動往往侷限在tcp連線建立、關閉事件上。乙個連線建立後,在其關閉之前的所有操作都不再是事件驅動,這時會退化成按序執行每個操作的批處理模式,這樣每個請求在連線建立後都將始終占用著系統資源,直到連線關閉後才會釋放資源。
這種傳統的web伺服器往往把乙個程序或執行緒作為事件消費者,當乙個請求產生的事件被該程序處理時,直到這個請求處理結束時程序資源都將被這乙個請求所占用。
nginx則不然,不會使用程序或執行緒來作為事件消費者,所謂的事件消費者只能是某個模組(在這裡沒有程序的概念)。只有事件收集、分發器才有資格占用程序資源,它們會在分發某個事件時呼叫事件消費模組使用當前占用的資源。
nginx處理事件的簡單模型如下圖:
從上面的內容可一看出傳統web伺服器與nginx之間的重要差別:前者是每個事件消費者獨佔乙個程序資源,後者的事件消費者只是被事件分發者短期呼叫而已。這種設計使得網路效能、使用者感知的請求時延都得到提公升,每個使用者的請求都所產生的事件都得到及時響應,整個伺服器的網路吞吐量都會由於事件的及時響應而增大。但這也會帶來乙個問題:事件消費者都不能有阻塞行為,否則由於長時間占用事件分發者程序而導致其它事件得不到及時響應。
三、請求的多階段非同步處理
請求的多階段非同步處理是基於事件(也只能基於事件)驅動架構實現。就是把乙個請求的處理過程按照事件的觸發方式分為多個節點,每個階段都由事件收集、分發器來觸發。
其優勢:
這種設計配合事件驅動架構,將極大地提高網路的效能,同時使得每個程序全力運轉,不會或者盡量少的出現程序休眠狀況。因為一旦出現程序休眠,必然減少併發處理事件的數目,一定會降低網路效能,同時會增加請求處理時間的平均時延。這時,網路效能無法滿足業務需求將只能增加程序數目,程序數目過多就會增加作業系統核心的額外操作:程序間切換。頻繁的程序切換仍會消耗cpu等資源,從而降低網路效能。同時,休眠的程序會使程序占用的記憶體得不到有效釋放,這最終必然導致系統可用記憶體的下降,從而影響系統能夠處理的最大併發連線數。
Nginx學習之五 nginx基礎架構設計
一 優秀的模組化設計 1 高度抽象的模組介面 所有的模組都遵循著同樣的ngx module t介面設計規範。2 模組介面簡單,靈活性高 模組的基本介面ngx module t足夠簡單,只涉及模組的初始化 退出以及對配置項的處理,這同時帶來了足夠的靈活性,是的nginx比較簡單的實現了動態可修改性,也...
軟體架構設計 nginx(二)
nginx在linux下的安裝 在ubuntu中安裝的nginx,目錄結構如下 usr sbin nginx 主程式 etc nginx 存放配置檔案 usr share nginx 存放靜態檔案 var log nginx 存放日誌 nginx的安裝 nginx實現動靜分離 如果出現這種錯誤,則用...
系統架構設計基礎(一)
今天我們來聊一下系統架構設計的相關基本概念。系統架構這個詞現在用的非常多,大家可能平時都在用在講。那麼這個詞我覺得用的也比較淡,什麼事情可能不能扯上一點系統架構。但是回過頭去想,這種架構確實也不是乙個高大上的東西,你可能每天都在接觸,每天都在應用。如果那方面你沒有去總結,另一方面,你可能也沒有把這個...