溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

node.js中有哪些適用場景

發(fā)布時間:2021-12-20 10:35:01 來源:億速云 閱讀:184 作者:小新 欄目:web開發(fā)

這篇文章主要介紹了node.js中有哪些適用場景,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

node.js是一個基于Chrome JavaScript運行時建立的一個平臺,其適用場景包括本地化的在線音樂應用、本地化的在線搜索應用、本地化的在線APP等。

本文操作環(huán)境:windows7系統(tǒng)、nodejs10.16.2版本、Dell G3電腦。

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

Node.js 是一個基于Chrome JavaScript 運行時建立的一個平臺。

Node.js是一個事件驅(qū)動I/O服務端JavaScript環(huán)境,基于Google的V8引擎,V8引擎執(zhí)行Javascript的速度非??欤阅芊浅:?。

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

NodeJS是近年來比較火的服務端JS平臺,這一方面得益于其在后端處理高并發(fā)的卓越性能,另一方面在nodeJS平臺上的npm、grunt、express等強大的代碼與項目管理應用崛起,幾乎重新定義了前端的工作方式和流程。

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

答案當然是否定的,而網(wǎng)上也是眾說紛紜。那我們從原理出發(fā)了解一下NodeJS的適用情況。

在講NodeJS之前我們不仿先看一下傳統(tǒng)(以Apache為代表)的服務器端處理平臺處理并發(fā)的方式。

1. Apache的多線程高并發(fā)模式

Apache是當前世界排名第一的Web服務端軟件,它由于支持多線程并發(fā)而受到廣大服務器技術(shù)選型者的歡迎。但發(fā)展到后來,Apache在一些WEB的大型應用中也漸漸暴露出它的缺點:阻塞。

那有的同學會奇怪,Apache不是多線程處理并發(fā)嗎,為什么還會出現(xiàn)阻塞呢?

要明白這一點我們首先需要了解線程這個概念

1.1 什么是線程?

我們引用官方的解釋:線程可以獨立運行的最小的CPU單位,可以在同一個進程里并發(fā)運行,共享該進程下的內(nèi)存地址空間(注意這個特點)。

我們可以看到同一個進程下的線程是會共享相同的文件和內(nèi)存的(內(nèi)存地址空間),所以大家可以想象,當不同的線程需要占用同一個變量時,根據(jù)先到先得的原則,先到的線程在運作時,后來的線程只能在旁邊等待,也就是加入到了阻塞排隊序列。所以這就是造成線程阻塞的原因。

因此,雖說進程可以支持多個線程,它們看似同時執(zhí)行,但互相之間并不同步。一個進程中的多個線程共享相同的內(nèi)存地址空間,這就意味著它們可以訪問相同的變量和對象,而且它們從同一堆中分配對象。盡管這讓線程之間共享信息變得更容易,因為程序設計者必須小心,確保它們不會妨礙同一進程里的其它線程。

了解了多線程并行的缺陷后,我們就可以更好地理解NodeJS的強大所在了。因為NodeJS是異步單線程的!

2. NodeJS的異步I/O原理

我們先來看一段Apache請求數(shù)據(jù)庫的代碼:

node.js中有哪些適用場景

代碼執(zhí)行到第一行的時候線程會阻塞,等待query返回結(jié)果,然后繼續(xù)處理。由于數(shù)據(jù)庫查詢、磁盤讀寫、網(wǎng)絡通信等原因(所謂的I/O)阻塞時間會非常大(相對于CPU始終頻率)。對于高并發(fā)的訪問,一方面線程長期阻塞等待,另一方面為了應付新情求而不斷添加新線程,會浪費大量系統(tǒng)資源,同時線程的增加也會也會占用大量的CPU時間來處理內(nèi)存上下文切換。看看node.js怎么處理。

node.js中有哪些適用場景

看到?jīng)],就四個字:異步回調(diào)。query的第二個參數(shù)是一個回調(diào)函數(shù),進程執(zhí)行到db.query的時候不會等待結(jié)果返回,而是直接繼續(xù)執(zhí)行下面的語句,直到進入事件循環(huán)。當數(shù)據(jù)庫執(zhí)行結(jié)果返回的時候會將事件發(fā)送到事件隊列,等到線程進入事件循環(huán)后才會調(diào)用之前的回調(diào)函數(shù)。更專業(yè)的說法是異步I/O。只要單線程就可以。

那為什么NodeJS做到單線程,卻可以實現(xiàn)異步呢?在這里我們先上一幅圖,直戳圖中的Event queue

node.js中有哪些適用場景

看到?jīng)],NodeJS的工作原理其實就是事件循環(huán)??梢哉f每一條NodeJS的邏輯都是寫在回調(diào)函數(shù)里面的,而回調(diào)函數(shù)都是有返回之后才異步執(zhí)行的!

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

你可以想象一下,NodeJS在寒風中面對著10萬并發(fā)大軍,OK,沒問題,上來敵人一個扔到城里,上來一個又扔到城里。城里全民皆兵,可以很好地消化這些敵人。但如果上來一個類似于張飛趙云這樣的人物,老Node心里一慘,和張飛大戰(zhàn)300回合,把他打殘了,再扔到城里。那后面的10萬大軍就得等這300回合。。。

所以這說明什么?說明NodeJS不是沒有阻塞,而是阻塞不發(fā)生在后續(xù)回調(diào)的流程,而會發(fā)生在NodeJS本身對邏輯的計算和處理。我們已經(jīng)知道,NodeJS的分發(fā)能力無比強大,可以循環(huán)事件進行異步回調(diào)。但如果在循環(huán)事件時遇到復雜的邏輯運算,那么單薄的單線程怎么支撐得起上百萬的邏輯+并發(fā)呢?NodeJS它的所有I/O、網(wǎng)絡通信等比較耗時的操作,都可以交給worker threads執(zhí)行再回調(diào),所以很快。但CPU的正常操作,它就只能自己抗了。

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

3. NodeJS的應用場景

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

順便提一下Apache,打壓了這么多,給顆甜棗。Apache由于其多線程高并發(fā)共享內(nèi)存地址空間的特性,那就意味著如果服務器足夠強大,處理器足夠高核,Apache的運作將會非常良好,所以適用于(并發(fā))異步處理相對較少,后臺計算量大,后臺業(yè)務邏輯復雜的應用程序。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“node.js中有哪些適用場景”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI