
NodeJs 進(jìn)階學(xué)習(xí)
Node特性(解決web服務(wù)器高性能瓶頸問題)
- 1.單線程
相對其他服務(wù)器開發(fā)語言來說,像java、php,用戶每一次請求都會為用戶創(chuàng)建單獨的線程,會增大服務(wù)器的開銷,可能會造成內(nèi)存嚴(yán)重不足,需要使用多臺
服務(wù)器。 而node則是單線程,不會獨立創(chuàng)建單獨的線程,從而減少服務(wù)器硬件上的開銷。node通過內(nèi)部事件,當(dāng)用戶連接時就會觸發(fā),通過非阻塞I/O、事件驅(qū)動機制,讓node宏觀上來看也是"并發(fā)執(zhí)行"的,一個8G的內(nèi)存服務(wù)器可處理同時4萬的連接,同時它也能解決服務(wù)器線程開銷的時間。
缺點: 因為是單線程,當(dāng)某個用戶線程崩潰,那么導(dǎo)致了其他用戶也會崩潰
解決: pm2(出現(xiàn)崩潰服務(wù)會照常運行不會造成整個服務(wù)停止) pm2 start app.js pm2 list pm2 log app
2.非阻塞I/O
傳統(tǒng)服務(wù)器開發(fā),進(jìn)行I/O操作,比如數(shù)據(jù)庫讀寫,往往會等到查詢的結(jié)果,代碼才會繼續(xù)往下執(zhí)行,這就造成了堵塞,而node則是放到回調(diào)函數(shù)中,等待返回結(jié)果
在執(zhí)行回調(diào)函數(shù),不會造成堵塞,它會對CPU的利用率更高。--------有了非阻塞并不能解決問題,還需借助事件循環(huán)機制
- 事件驅(qū)動
在比如客戶端建立連接、發(fā)送請求、提交數(shù)據(jù)時,都會觸發(fā)相對應(yīng)的事件,而在某一個時刻,只能處理一個事件的回調(diào)函數(shù),而在處理某一個事件的回調(diào)函數(shù)時,又可以轉(zhuǎn)化為其他事件,然后返回執(zhí)行原有事件的回調(diào)函數(shù),從而產(chǎn)生了事件循環(huán)。Node底層是用c++寫的,V8也是基于c++,c++,在底層代碼中,多數(shù)都是用事件隊列、回調(diào)函數(shù)隊列的構(gòu)建。用事件隊列來完成服務(wù)器的任務(wù)調(diào)度。隊列也有優(yōu)先級。
Node適合干什么
因為基于node的特性,善于I/O,不善于計算,如果業(yè)務(wù)中有大批量的計算服務(wù),實際上也相當(dāng)于阻塞了這個線程,node不適合做這樣的開發(fā)。
當(dāng)應(yīng)用程序處理大批量并發(fā)的I/O時,而在響應(yīng)之前不需要大批量的計算,內(nèi)部處理時,nodejs非常適合。nodejs也非常適合長連接的項目開發(fā),非常適合
與websocket結(jié)合,開發(fā)實時交互的應(yīng)用程序。比如:用戶表單收集、考試系統(tǒng)、聊天室、圖文直播、提供JSON API服務(wù)
- Node 可以挑戰(zhàn)PHP、Java、?等傳統(tǒng)服務(wù)器開發(fā)語言嗎
答案是無法比擬的,因為很多企業(yè)追求的是可靠的服務(wù),node是一種工具,它在處理某一塊時是非常有用的。然而很多企業(yè)也都在用node處理某一塊業(yè)務(wù)功能
Node安裝
推薦使用nvm(包括線上的生產(chǎn)環(huán)境搭建)
nvm install v8.10.0 安裝 node
nvm use v8.10.0 nvm 指定使用的 node 的版本
nvm alias default v8.10.0 設(shè)置 node 默認(rèn)使用版本
npm config set registry https://registry.npm.taobao.org 設(shè)置淘寶鏡像
增加系統(tǒng)文件監(jiān)控數(shù)目 echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
Node模塊進(jìn)階API學(xué)習(xí)
get相對來說簡單些,通過url來獲取
//未完待續(xù) ^