為什么node.js不適合大型項(xiàng)目
前言
首先要明確什么是大型應(yīng)用,其實(shí)這是仁者見仁、智者見智的問題,并且它是一個哲學(xué)問題,不是一個技術(shù)問題。假如有人問你,一個可以進(jìn)行線上銷售的網(wǎng)站,比如優(yōu)衣庫,大不大?你可能會說大,因?yàn)檫@與你平常所見的博客、企業(yè)官網(wǎng)等邏輯相比較確實(shí)復(fù)雜很多?;蛘哒f小,那么說明你開發(fā)過比它還復(fù)雜的系統(tǒng)。那么相比較淘寶而言呢?大和小的對比是要有參照物的。
1. 應(yīng)用的組成
一個完備的 Web 應(yīng)用可能只由一門語言或者一種技術(shù)構(gòu)成嗎?不可能。因?yàn)橐粋€完備的 Web 應(yīng)用其實(shí)是多門技術(shù)的綜合體,解決某個問題有非常多的解決方案,比如后端的邏輯解決方案就非常多,Java、php、Python、Ruby 等都可以。
簡單地概述,應(yīng)用的組成內(nèi)容可能包括:
Web 界面顯示邏輯;后端業(yè)務(wù)邏輯;緩存;數(shù)據(jù)庫;消息隊(duì)列。
其實(shí)還可以加入日志分析、數(shù)據(jù)分析等,只是上面幾個最廣為人知而已。
2. 應(yīng)用的種類
I/O 密集型;CPU 密集型。
就常見的互聯(lián)網(wǎng)產(chǎn)品而言,它的瓶頸并非在后端業(yè)務(wù)的邏輯上,而是在 I/O 上,即返回給用戶看的數(shù)據(jù)的讀入與輸出。相對于應(yīng)用程序而言,讀入指的是從數(shù)據(jù)庫里獲取數(shù)據(jù),而輸出指的是將這些數(shù)據(jù)經(jīng)過一定的處理輸出到用戶的瀏覽器,那么這就是 I/O 密集型。
而CPU密集型是指做頻繁計(jì)算任務(wù)的應(yīng)用,Node.js在這方面確實(shí)是短板。
3. 應(yīng)用服務(wù)的過程
如圖所示,用戶通過瀏覽器發(fā)送請求,由網(wǎng)卡接收TCP 連接,通知內(nèi)核,內(nèi)核再去調(diào)用相對應(yīng)的服務(wù)端程序。
Request 請求過程

Response 返回過程
如下圖,Web 應(yīng)用要返回數(shù)據(jù),首先要獲取數(shù)據(jù),通過內(nèi)核調(diào)用磁盤的驅(qū)動程序,把數(shù)據(jù)讀入緩存,這樣就可以在 Web 應(yīng)用程序中獲取數(shù)據(jù)并進(jìn)行數(shù)據(jù)處理,最終調(diào)用內(nèi)核,將數(shù)據(jù)通過網(wǎng)卡發(fā)送給客戶端。

4. 應(yīng)用的瓶頸
通常 I/O 密集型的瓶頸會在磁盤的讀寫上,所以在購買云服務(wù)器的時候可以購買 SSD 的磁盤來提升性能,一般數(shù)據(jù)庫軟件的數(shù)據(jù)都是存儲在文件上面的。首先考慮添加內(nèi)存型緩存來解決這個瓶頸,緩存經(jīng)常訪問的數(shù)據(jù),看能否解決當(dāng)前場景的問題,比如使用 Redis。其次才考慮搭建或擴(kuò)充數(shù)據(jù)庫集群來提高并發(fā)。
而 CPU 密集型的應(yīng)用瓶頸則在 CPU 上,只能增加 CPU 處理核心來解決瓶頸。
5. 分布式應(yīng)用
大型的普通應(yīng)用與分布式應(yīng)用其實(shí)是不同的概念。讀者可以把分布式應(yīng)用簡單地理解為一個團(tuán)隊(duì),每一個成員都是一個節(jié)點(diǎn),一個大的項(xiàng)目要讓成員合作完成,那么成員與成員之間就存在一些溝通成本,甚至有的成員與成員之間勾心斗角,說話陽奉陰違、推脫責(zé)任,也有可能成員生病在家休養(yǎng),無法工作,等等。在面對這些問題的時候,Node.js的優(yōu)勢并不能很好地顯現(xiàn)出來(并非不可以做,只是沒有完善的基礎(chǔ)設(shè)施)。
分布式的真正定義是,在多臺不同的服務(wù)器中部署不同的服務(wù)模塊,以進(jìn)程為基本單位,派發(fā)到服務(wù)器上,通過遠(yuǎn)程調(diào)用(RPC)通信并協(xié)同工作,最終對外提供服務(wù)。
相比較Node.js目前的分布式基礎(chǔ)設(shè)施,Go 語言的基礎(chǔ)設(shè)施則完善多了,特別是在 Docker 這個項(xiàng)目上,充分證明了 Go 語言的優(yōu)勢,這也是為什么 Node.js 社區(qū)“大?!盩J Holowaychuk 轉(zhuǎn)向 Go 語言,因?yàn)樗_發(fā)分布式應(yīng)用。
其實(shí)沒必要過分地關(guān)心分布式的問題,畢竟JavaScript最初只是一個運(yùn)行在瀏覽器端的腳本語言而已,JavaScript不是萬能的,為什么一定要把它用在操作系統(tǒng)級別的開發(fā)上呢?尋找一個更合適的語言不是更好嗎?就像此刻我們選擇 JavaScript 構(gòu)建 Web 應(yīng)用一樣。
6. 多進(jìn)程的 Node.js
了解了以上的一些知識點(diǎn),現(xiàn)在讀者應(yīng)該知道,Node.js 跟大型應(yīng)用關(guān)系不大。大多數(shù)學(xué)習(xí) Node.js 的開發(fā)者是前端開發(fā)者,所以對后端的基礎(chǔ)知識并不了解,在網(wǎng)絡(luò)上搜尋一些資料的時候發(fā)現(xiàn) Node.js 只能利用單核,而又聽說 TJ Holowaychuk 轉(zhuǎn)向 Go 的陣營,所以有的開發(fā)者就產(chǎn)生了Node.js不適合開發(fā)大型應(yīng)用的疑問。
Node.js 只能利用單核的問題已經(jīng)被解決了,后面使用的 Egg.js框架中的 Egg-Cluster 模塊就利用多進(jìn)程非常好地解決了這個問題。
以上就是為什么node.js不適合大型項(xiàng)目的詳細(xì)內(nèi)容,更多關(guān)于node.js的資料請關(guān)注腳本之家其它相關(guān)文章!
- node.js利用express自動搭建項(xiàng)目的全過程
- node koa2 ssr項(xiàng)目搭建的方法步驟
- nodeJs項(xiàng)目在阿里云的簡單部署
- 云服務(wù)器部署Node.js項(xiàng)目的方法步驟(小白系列)
- node創(chuàng)建Vue項(xiàng)目步驟詳解
- node命令行工具之實(shí)現(xiàn)項(xiàng)目工程自動初始化的標(biāo)準(zhǔn)流程
- nodejs對項(xiàng)目下所有空文件夾創(chuàng)建gitkeep的方法
- 從0到1構(gòu)建vueSSR項(xiàng)目之node以及vue-cli3的配置
- PHPStorm中如何對nodejs項(xiàng)目進(jìn)行單元測試詳解
- 使用pm2自動化部署node項(xiàng)目的方法步驟
相關(guān)文章
詳解如何在NodeJS應(yīng)用程序中處理多個API請求
NodeJS默認(rèn)是異步的,這意味著它已經(jīng)能夠同時處理多個請求,但它只適用于I/O操作,如HTTP請求、文件系統(tǒng)操作、數(shù)據(jù)庫查詢、實(shí)時聊天應(yīng)用等,在處理CPU密集型任務(wù)時,可能需要很長時間,這就是為什么NodeJS提供了一些我們將在下面介紹的特定包2023-12-12
Node.js實(shí)現(xiàn)mysql連接池使用事務(wù)自動回收連接的方法示例
這篇文章主要介紹了Node.js實(shí)現(xiàn)mysql連接池使用事務(wù)自動回收連接的方法,結(jié)合實(shí)例形式分析了node.js操作mysql連接池實(shí)現(xiàn)基于事務(wù)的連接回收操作相關(guān)技巧,需要的朋友可以參考下2018-02-02
對node通過fs模塊判斷文件是否是文件夾的實(shí)例講解
今天小編就為大家分享一篇對node通過fs模塊判斷文件是否是文件夾的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
詳解基于node的前端項(xiàng)目編譯時內(nèi)存溢出問題
本篇文章主要介紹了基于node的前端項(xiàng)目編譯時內(nèi)存溢出問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
electron demo項(xiàng)目npm install安裝失敗的解決方法
下面小編就為大家分享一篇electron demo項(xiàng)目npm install安裝失敗的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
Node.js腳本提取OPML文件信息實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了Node.js腳本提取OPML文件信息,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
node.js?express和koa中間件機(jī)制和錯誤處理機(jī)制
這篇文章主要介紹了node.js?express和koa中間件機(jī)制和錯誤處理機(jī)制,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07
node.js使用http模塊創(chuàng)建服務(wù)器和客戶端完整示例
這篇文章主要介紹了node.js使用http模塊創(chuàng)建服務(wù)器和客戶端,結(jié)合完整示例形式分析了node.js基于http模塊實(shí)現(xiàn)客戶端與服務(wù)器端交互的相關(guān)操作技巧,需要的朋友可以參考下2020-02-02

