nodejs是非阻塞異步操作。
特點
1、Chrome V8引擎
2、事件驅動
3、非阻塞 I/O
4、單線程
如何處理“高并發”請求?
針對每個并發請求,服務端給請求注冊一個激發事件(I/O),并給一個回調函數(這個過程沒有阻塞新的連接請求)。
按順序執行事件處理(I/O),處理完成后執行回調函數,接著執行下一個事件處理(I/O)。
事件處理(I/O)原理?
事件處理(即異步I/O處理)是由node工作線程去執行的(nodejs底層的libuv是由多線程的線程池并行I/O操作),且主線程是不需要等待返回的,只要發出指令后就可以執行其他事件,所有操作完成后執行回調。
NodeJS的優缺點
優點:
1、高并發;
2、適合I/O密集型應用。
缺點:
1、不適合CPU密集型應用,只支持單核CPU,不能充分利用CPU;
2、單進程,單線程,一旦代碼某處出現bug,整個系統都崩潰;
如何解決CPU密集型?
原因,由于JavaScript單線程的原因,如果有長時間運行的計算(比如大循環),將會導致CPU時間片不能釋放,使得后續I/O無法發起。
解決方案:分解大型運算任務為多個小任務,使得運算能夠適時釋放,不阻塞I/O調用的發起。
單進程、單線程解決方案
Nnigx反向代理,負載均衡,開多個進程,綁定多個端口;
開多個進程監聽同一個端口,使用cluster模塊。