首頁  >  文章  >  web前端  >  node.js是什麼?適用場景有哪些

node.js是什麼?適用場景有哪些

藏色散人
藏色散人原創
2021-12-20 10:13:303879瀏覽

node.js是一個基於Chrome JavaScript運行時建立的平台,其適用場景包括本地化的線上音樂應用、本地化的線上搜尋應用程式、本地化的線上APP等。

node.js是什麼?適用場景有哪些

本文操作環境:windows7系統、nodejs10.16.2版本、Dell G3電腦。

node.js是什麼?

簡單的說 Node.js 就是運行在服務端的 JavaScript。

Node.js 是一個基於Chrome JavaScript 執行階段建立的平台。

Node.js是一個事件驅動I/O服務端JavaScript環境,基於Google的V8引擎,V8引擎執行Javascript的速度非常快,效能非常好。

從原理上理解NodeJS的適用場景 

NodeJS是近年來比較火的服務端JS平台,這一方面得益於其在後端處理高並發的卓越效能,另一方面在nodeJS平台上的npm、grunt、express等強大的程式碼與專案管理應用程式崛起,幾乎重新定義了前端的工作方式與流程。

NodeJS的成功標誌著它的強大,但是不是所有情況都適合應用NodeJS作為伺服器端平台呢?

答案當然是否定的,而網路上也是眾說紛紜。那我們從原理出發了解NodeJS的適用情況。

在講NodeJS之前我們不彷先看一下傳統(以Apache為代表)伺服器端處理平台處理並發的方式。

1. Apache的多執行緒高並發模式

#Apache是​​目前世界排名第一的Web服務端軟體,它由於支援多執行緒並發而受到廣大伺服器技術選型者的歡迎。但發展到後來,Apache在一些WEB的大型應用中也漸漸暴露出它的缺點:阻塞。

那有的同學會奇怪,Apache不是多執行緒處理並發嗎,為什麼還會出現阻塞呢?

要明白這一點我們首先需要了解執行緒這個概念

1.1 什麼是執行緒?

我們引用官方的解釋:線程可以獨立運行的最小的CPU單位,可以在同一個進程裡並發運行,共享該進程下的記憶體位址空間(注意這個特點)

我們可以看到同一個進程下的線程是會共享相同的檔案和記憶體的(記憶體位址空間),所以大家可以想像,當不同的執行緒需要佔用同一個變數時,根據先到先得的原則,先到的線程在運作時,後來的線程只能在旁邊等待,也就是加入到了阻塞排隊序列。所以這就是造成線程阻塞的原因。

因此,雖說進程可以支援多個線程,它們看似同時執行,但互相之間並不同步。一個進程中的多個執行緒共享相同的記憶體位址空間,這意味著它們可以存取相同的變數和對象,而且它們從同一堆中分配對象。儘管這讓執行緒之間共享資訊變得更容易,因為程式設計者必須小心,確保它們不會妨礙同一進程中的其它執行緒。

了解了多執行緒並行的缺陷後,我們就可以更能理解NodeJS的強大所在了。因為NodeJS是異步單線程的!

2. NodeJS的非同步I/O原理

我們先來看一段Apache請求資料庫的程式碼:

程式碼執行到第一行的時候執行緒會阻塞,等待query回傳結果,然後繼續處理。由於資料庫查詢、磁碟讀寫、網路通訊等原因(所謂的I/O)阻塞時間會非常大(相對於CPU始終頻率)。對於高並發的訪問,一方面線程長期阻塞等待,另一方面為了應付新情求而不斷添加新線程,會浪費大量系統資源,同時線程的增加也會佔用大量的CPU時間來處理內存上下文切換。看看node.js怎麼處理。

看到沒,就四個字:非同步回呼。 query的第二個參數是一個回呼函數,進程執行到db.query的時候不會等待結果返回,而是直接繼續執行下面的語句,直到進入事件循環。當資料庫執行結果回傳的時候會將事件傳送到事件佇列,等到執行緒進入事件循環後才會呼叫先前的回呼函數。更專業的說法是異步I/O。只要單線程就可以。

那為什麼NodeJS做到單線程,卻可以實作非同步呢?這裡我們先上一幅圖,直戳圖中的Event queue

看到沒,NodeJS的工作原理其實就是事件循環。可以說每一條NodeJS的邏輯都是寫在回呼函數裡面的,而回呼函數都是有返回之後才非同步執行的!

看到這裡,你不禁會驚嘆,NodeJS如果所有處理都異步,豈不是曉得飛了?錯錯錯!當然不是,不要忘記,NodeJS實作這些的基礎是單執行緒。沒錯,單線程!一條線程扛起所有操作!

你可以想像一下,NodeJS在寒風中面對著10萬並發大軍,OK,沒問題,上來敵人一個扔到城裡,上來一個又扔到城裡。城裡全民皆兵,可以好好消化這些敵人。但如果上來一個類似張飛趙雲這樣的人物,老Node心裡一慘,和張飛大戰300回合,把他打殘了,再扔到城裡。那後面的10萬大軍就得等這300回合。 。 。

所以這說明什麼?說明NodeJS不是沒有阻塞,而是阻塞不發生在後續回呼的流程,而會發生在NodeJS本身對邏輯的計算和處理。我們已經知道,NodeJS的分發能力無比強大,可以循環事件進行非同步回調。但如果在循環事件時遇到複雜的邏輯運算,那麼單薄的單線程怎麼支撐得起上百萬的邏輯 #並發呢? NodeJS它的所有I/O、網路通訊等比較耗時的操作,都可以交給worker threads執行再回調,所以很快。但CPU的正常操作,它就只能自己抗了。 

說到這裡,各位對NodeJS的特性估計也大概有個譜了。所以說適用的場景基本上就是呼之欲出了~!

3. NodeJS的應用場景

既然NodeJS處理並發的能力強,但處理計算和邏輯的能力反而很弱,因此,如果我們把複雜的邏輯運算都搬到前端(客戶端)完成,而NodeJS只需要提供非同步I/O,這樣就可以實現高並發的高效能處理。情況就很多啦,例如:RESTFUL API、即時聊天、客戶端邏輯強大的單頁APP,具體的例子比如說:本地化的線上音樂應用,本地化的線上搜尋應用程式,本地化的線上APP等。

順便提一下Apache,打壓了這麼多,給顆甜棗。 Apache由於其多線程高並發共享記憶體位址空間的特性,那就意味著如果伺服器足夠強大,處理器足夠高核,Apache的運作將會非常良好,所以適用於(並發)非同步處理相對較少,後台計算量大,後台業務邏輯複雜的應用程式。

推薦學習:《node.js影片教學

以上是node.js是什麼?適用場景有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn