這篇文章主要總結(jié)兩個(gè)圖譜:Node 的事件輪詢機(jī)制圖譜和 Node 作為中間層在大型應(yīng)用下的架構(gòu)圖譜。
注:文中的內(nèi)容大多是我自己的理解东涡,并不一定正確,如果您在閱讀的過程中發(fā)現(xiàn)了任何錯(cuò)誤,歡迎告訴我摩瞎,以便改正纹笼。
Event Loop 和異步 IO
關(guān)于 Event Loop 和異步 IO纹份,可以參考這兩篇文章:
Node 的事件輪詢機(jī)制圖譜
Node 的事件輪詢機(jī)制圖譜如下:
圖譜說明:
- Node 服務(wù)器收到客戶端的請求,先將請求保存在一個(gè)隊(duì)列中
- 將請求假如到 Event Loop
- Event Loop 通過 Libuv 庫向操作系統(tǒng)發(fā)出指令廷痘,并注冊回調(diào)函數(shù)(具體的任務(wù)交給 Libuv 調(diào)度蔓涧,Event Loop 不負(fù)責(zé)具體的任務(wù)實(shí)現(xiàn),如 IO 讀人穸睢)
- Libuv 是 C++ 的一個(gè)處理異步任務(wù)的模塊元暴,其對(duì) Linux 和 Windows 平臺(tái)進(jìn)行了兼容
- Libuv 將任務(wù)分發(fā)給具體的工作線程,工作線程負(fù)責(zé)執(zhí)行任務(wù)
- 工作線程執(zhí)行任務(wù)完畢后兄猩,通知 Libuv
- Libuv 收到任務(wù)完成的通知后再通知 Event Loop茉盏,觸發(fā)先前注冊的回調(diào)函數(shù)
- 回調(diào)函數(shù)執(zhí)行完成后,移除請求隊(duì)列中的相關(guān)請求
以 Node 為中間層的架構(gòu)圖譜
下面是一個(gè)以 Node 為中間層的架構(gòu)圖譜:
圖譜說明:
- 客戶端發(fā)起請求枢冤,首先由 Nginx 進(jìn)行負(fù)載
- Nginx 將請求轉(zhuǎn)發(fā)到某臺(tái) Node 服務(wù)器后鸠姨,由該服務(wù)器上的 PM2 等管理軟件選擇一個(gè)合適的進(jìn)程處理請求
- 同時(shí),Node 服務(wù)還可以對(duì)靜態(tài)資源進(jìn)行處理掏导,將靜態(tài)資源請求重定向到某臺(tái) CDN 上
- Node 向后端發(fā)起請求
- Node 不直接請求 Java 服務(wù)器享怀,在 Node 和 Java 集群之間設(shè)置一個(gè) HTTP 的緩存,Node 從緩存中獲取數(shù)據(jù)趟咆,緩存一般由 Varnish 或 Squid 完成
- HTTP 緩存和 Java 服務(wù)器之間要保持連接添瓷,一般可以通過心跳確認(rèn)連接狀態(tài),如果和某臺(tái)服務(wù)器連接出現(xiàn)了異常值纱,就要進(jìn)行處理
- Java 服務(wù)器從數(shù)據(jù)庫集群中讀寫數(shù)據(jù)
- 數(shù)據(jù)庫集群進(jìn)行了讀寫分離
- 同時(shí)鳞贷,還需要對(duì)數(shù)據(jù)庫進(jìn)行冷熱備份操作,以進(jìn)行容災(zāi)
上面就是使用 Node 作為中間層的一個(gè)比較大型的應(yīng)用的架構(gòu)圖譜虐唠。
完搀愧。