這節(jié)課我們要討論什么
1寨典、NodeJs異步IO原理淺析及優(yōu)化方案
2氛雪、nodejs內(nèi)存管理機制以及內(nèi)存優(yōu)化
3、大規(guī)模node站點結(jié)構(gòu)原理分析
4耸成、服務(wù)器集群管理和node集群的應(yīng)用
5报亩、UV過千萬的Node站點真身
異步IO原理淺析
NodeJS異步IO原理淺析及優(yōu)化方案
io就是輸入和輸出 input output
io密集型 一堆請求像你襲來 這個時候node全部接受 基于異步的處理機制
cpu要進行緊急運算
io是昂貴的
cup是昂貴的 因為運算特別快
cpu時鐘周期 ?1/cpu 越
cpu分成兩級緩存 一級緩存和二級緩存
內(nèi)存緩存 member cache
緣起: 在數(shù)據(jù)驅(qū)動的web開發(fā)中,經(jīng)常要重復(fù)從數(shù)據(jù)庫中取出相同的數(shù)據(jù)井氢,這種重復(fù)極大的增加了數(shù)據(jù)庫負載弦追。緩存是解決這個問題的好辦法。
Memcached是什么?
Memcached是由Danga Interactive開發(fā)的花竞,高性能的劲件,分布式的內(nèi)存對象緩存系統(tǒng),用于在動態(tài)應(yīng)用中減少數(shù)據(jù)庫負載左胞,提升訪問速度寇仓。
js和java不在一臺服務(wù)器上 分布式服務(wù)器 通過網(wǎng)絡(luò)進行請求 并在硬盤上找到文件 但是對于取到j(luò)s文件時間更加長了 a.xx.com js訪問 b.xx.com java
ws同步處理的任務(wù) wp異步的任務(wù)
異步io創(chuàng)建出文件描述符后,等待系統(tǒng)底層處理后在扔回去
app就是application就是應(yīng)用程序的簡稱 通過js代碼綁定到v8的進程中 瀏覽器和v8引擎不支持es6 ?v8引擎通過nodejs基礎(chǔ)的api 電飯鍋飯好了會叫 被node封裝了一層libuv 也叫asynchronous io node封裝的一種異步通知的機制烤宙,eventloop 事件從event queue(事件隊列)中 交給worker therads(工作線程)執(zhí)行完畢后告訴eventloop 交回eventqueue(看nodejs事件驅(qū)動機制)
AIO ( Asynchronous I/O):異步非阻塞I/O模型遍烦。異步非阻塞與同步非阻塞的區(qū)別在哪里?異步非阻塞無需一個線程去輪詢所有IO操作的狀態(tài)改變躺枕,在相應(yīng)的狀態(tài)改變后服猪,系統(tǒng)會通知對應(yīng)的線程來處理。對應(yīng)到燒開水中就是拐云,為每個水壺上面裝了一個開關(guān)罢猪,水燒開之后,水壺會自動通知我水燒開了叉瘩。
BIO (Blocking I/O):同步阻塞I/O模式膳帕,數(shù)據(jù)的讀取寫入必須阻塞在一個線程內(nèi)等待其完成。這里使用那個經(jīng)典的燒開水例子薇缅,這里假設(shè)一個燒開水的場景危彩,有一排水壺在燒開水,BIO的工作模式就是泳桦, 叫一個線程停留在一個水壺那汤徽,直到這個水壺燒開,才去處理下一個水壺灸撰。但是實際上線程在等待水壺燒開的時間段什么都沒有做谒府。
NIO (New I/O):同時支持阻塞與非阻塞模式拼坎,但這里我們以其同步非阻塞I/O模式來說明,那么什么叫做同步非阻塞完疫?如果還拿燒開水來說泰鸡,NIO的做法是叫一個線程不斷的輪詢每個水壺的狀態(tài),看看是否有水壺的狀態(tài)發(fā)生了改變趋惨,從而進行下一步的操作鸟顺。
從服務(wù)器上看node
Nginx負載均衡代理到lvs
?pm2負載均衡去啟動node 可以幫助零秒熱啟
pm2 是一個帶有負載均衡功能的Node應(yīng)用的進程管理器.
幫助事件輪詢的libuv庫和v8不是一個線程?
libuv封裝了兩個東西在linux下叫custom threradpool 在windows 叫iocp
nodejs代碼單線程 cluster啟動多個服務(wù) fork啟動一個服務(wù)復(fù)制多個 主進程死了其余都崩潰 兩種機制
哨兵變量
v8的垃圾回收策略基于分代式垃圾回收機制:新生代為存活時間較短的對象惦蚊,老生代為存活時間較長的對象器虾,gc是一種回收機制,來區(qū)分出新生代和老生代蹦锋,scavenge算法兆沙,把內(nèi)存一分為二,var a alert(a) var b 莉掂,此時b沒有用到葛圃,把代碼進行反轉(zhuǎn),var a alert(a)憎妙,把a放到老生代空間內(nèi)库正,老生代空間越來越多,也需要清理厘唾,a=null褥符,把空間標記為星,把有用變量挪到一起抚垃,帶星的刪除喷楣。即先把變量放到老生態(tài)空間,在通過標記清除移動的方法鹤树,把老生態(tài)空間沒用的內(nèi)存干掉铣焊,跟磁盤碎片清理相似。
net多層架構(gòu)
website 前端代碼 html css js代碼
webstieTest 單元測試文件夾
webService 外界提供接口
webControllers 路由
SQLServerDAL 數(shù)據(jù)庫的一些具體的操作
Model 數(shù)據(jù)庫對應(yīng)的模型
IDAL 接口 不干活
DLLLlbraly 第三方的庫
DBUtility 數(shù)據(jù)庫封裝的庫
DataCache 一些緩存?
DALFactory 最重要
BLL 真正干活 把IDAL接口層和SQLServerDAl連接起來 真正的路由落到BLL上
JavaWeb多層架構(gòu)
action 路由層
common 公共的類
dao 數(shù)據(jù)庫的實現(xiàn)層
po 數(shù)據(jù)庫的類
service 實現(xiàn)數(shù)據(jù)操作的
依賴注入 控制反轉(zhuǎn)
pm2 0秒停機重啟
服務(wù)器集群
NGINX LVS?
前端項目構(gòu)建
dosc 前端項目
nodeuii node項目
scripts 運行腳本
webapp build腳本build到nodeuii中
nodeuii中包含
app.js 啟動文件
bin 腳本
config 配置文件
controllers 路由
lib 常用的幫助庫
middleware 中間件
models 和后端請求用的
nginx-conf ?nginx配置文件
node_modules node包
package.json 包管理器
pm2.json pm2的配置文件
public 公共的前端資源配置文件
receiver-master ?接收前端傳過來的receiver
test 功能化測試
views 模板