nodejs是非阻塞異步操作。
特點
1后雷、Chrome V8引擎
2、事件驅(qū)動
3吠各、非阻塞 I/O
4臀突、單線程
如何處理“高并發(fā)”請求?
針對每個并發(fā)請求贾漏,服務(wù)端給請求注冊一個激發(fā)事件(I/O)候学,并給一個回調(diào)函數(shù)(這個過程沒有阻塞新的連接請求)。
按順序執(zhí)行事件處理(I/O)纵散,處理完成后執(zhí)行回調(diào)函數(shù)梳码,接著執(zhí)行下一個事件處理(I/O)。
事件處理(I/O)原理伍掀?
事件處理(即異步I/O處理)是由node工作線程去執(zhí)行的(nodejs底層的libuv是由多線程的線程池并行I/O操作)掰茶,且主線程是不需要等待返回的,只要發(fā)出指令后就可以執(zhí)行其他事件蜜笤,所有操作完成后執(zhí)行回調(diào)濒蒋。
NodeJS的優(yōu)缺點
優(yōu)點:
1咐蚯、高并發(fā);
2抢肛、適合I/O密集型應(yīng)用疟羹。
缺點:
1、不適合CPU密集型應(yīng)用围橡,只支持單核CPU暖混,不能充分利用CPU;
2翁授、單進程儒恋,單線程,一旦代碼某處出現(xiàn)bug黔漂,整個系統(tǒng)都崩潰诫尽;
如何解決CPU密集型?
原因炬守,由于JavaScript單線程的原因牧嫉,如果有長時間運行的計算(比如大循環(huán)),將會導(dǎo)致CPU時間片不能釋放减途,使得后續(xù)I/O無法發(fā)起酣藻。
解決方案:分解大型運算任務(wù)為多個小任務(wù),使得運算能夠適時釋放鳍置,不阻塞I/O調(diào)用的發(fā)起辽剧。
單進程、單線程解決方案
Nnigx反向代理税产,負載均衡怕轿,開多個進程,綁定多個端口辟拷;
開多個進程監(jiān)聽同一個端口撞羽,使用cluster模塊。