天天看點

Node單線程高并發原理一、node是如何處理web請求的二、其它語言是如何處理web請求的三、node的優勢和劣勢四、node如何實作多個worker參考資料

一、node是如何處理web請求的

浏覽器中的js是單線程的,node也是單線程的。這個單線程相當于一個大管家,一切大小事務都要經過他的手才能辦成,它總是把IO任務放入到任務池中。

雖然說是單線程,但是node也有一個線程池專門負責執行任務池中的任務,它們把任務完成之後會告知主線程以接下來利用CPU完成處理。

關鍵在于理清哪些任務是主線程做的,哪些任務是線程池做的。

對于IO操作(例如檔案讀取、資料庫讀取、網絡請求等),基本全部是線程池完成的(IO操作也有阻塞式的寫法);對于計算任務,都是主線程完成的。

不要小看IO操作占用的時間,node的重要優勢就是把IO操作放到了主線程之外,進而讓主線程騰出手來去處理更多的請求。

node的線程池基于libuv這個庫。

node技術的底層依賴:

  • V8:Google 推出的 Javascript VM,也是 Node.js 為什麼使用的是 Javascript的關鍵,它為 Javascript提供了在非浏覽器端運作的環境,它的高效是 Node.js 之是以高效的原因之一。
  • Libuv:它為 Node.js 提供了跨平台,線程池,事件池,異步 I/O 等能力,是 Node.js 如此強大的關鍵。
  • C-ares:提供了異步處理 DNS 相關的能力。
  • http_parser、OpenSSL、zlib 等:提供包括 http 解析、SSL、資料壓縮等其他的能力。

二、其它語言是如何處理web請求的

以python為例,gunicorn伺服器可以指定worker數,表示可以同時處理的任務數。即便這些任務都是CPU密集型操作,gunicorn也能夠最多支援和worker數相等的請求。而node最多隻能支援一個CPU密集型任務。

簡言之,node相當于一個worker,但是這個worker效率比較高(因為把IO和計算分離開了)。

實際上,node可以通過開很多個程序,通過nginx負載均衡來實作多個worker,這樣完全可以達到和其它語言相同的效果。

簡言之,開多個worker誰都會。node的優勢在于這個優秀的單線程。

開多個worker應該是優化的最後一步,是實在想不出更好辦法之後的辦法。node的創新之處就在于IO和計算分離,進而将并發量提高了許多。

IO和計算分離是一種思想,并非隻能用js實作,其它語言也可以借鑒。

三、node的優勢和劣勢

  • node擅長執行IO密集型任務,不善于執行CPU密集型任務。
  • node的效率比傳統阻塞式web服務高,為啥以前沒有想到使用事件驅動模型把IO和計算進行分離?因為分離是有代價的,node異步模式帶來了大量的回調,回調一旦太深,代碼可讀性極差。
  • node的主線程不能崩,主線程一崩整個服務全挂掉。是以一定要接住異常,這個問題不算劣勢,因為很容易解決。

四、node如何實作多個worker

cluster子產品已經成為node的标準子產品了,這個子產品賦予了node多worker的能力。使用nginx+多個執行個體的方法需要占用多個端口,cluster則能夠讓多個worker共用同一端口。

原來的單線程模型處理計算密集型任務的線程隻有一個,即主線程;處理IO的線程有多個。現在cluster通過開辟多個處理計算密集型任務的線程實作了多worker。

參考資料

一篇cluster的詳細講解

https://blog.csdn.net/leohzj/article/details/50462231

轉載于:https://www.cnblogs.com/weiyinfu/p/10171782.html