node.js應用高並發高性能的核心關鍵本質是什麼?

假如你公司開發一個應用,給用戶在你公司的海量數據中搜索一些數據出來,這些海量數據可能存儲在10台,100台或者1000台伺服器中,並且要求在1萬並發請求的情況下也要30毫秒內返回結果。

於是乎你公司的C/C++或java,或者.net團隊耗時1個月開發出了一套完整的系統,果然在1萬並發請求的情況下,30毫秒內也返回結果。不過這套系統需要30台伺服器作為支撐。

前端團隊新來的一個node.js大神了解這件事情之後,向老闆彙報,說他只要一天時間,用node.js就可以開發同樣功能的程序,並且也可以在1萬並發請求的情況下30毫秒內返回結果,而且!而且,而且部署的時候只要1台5000元的PC機!
然後node.js大神用一天的時間噼里啪啦地寫出了程序並部署,第二天給老闆驗收,老闆驚嘆不已!

然後老闆的新聞團隊將這事情發布出去,讓整個node.js社區一片澎湃!

上午把這個發在某個node.js中文社區,竟然沒人看懂!

這裡有人看懂了么?求批評!


首先題主說的這個情況我完全不相信,雖然我們也是NodeJS團隊,但是我們從來不會跟ruby或者java去吹我們NodeJS性能多好。有意義么?Web開發的瓶頸根本不是你應用本身的性能啊,而且Nodejs的性能哪裡好了。。。一個成熟的web應用,大部分性能瓶頸是在IO操作上,這個io包括 資料庫操作(連接數,機器性能等)、緩存服務、網路IO、文件讀寫等操作。如果IO生產方的性能瓶頸了,你再分散式,再堆機器,再牛逼的語言都沒啥卵用。

NodeJS的天然非同步IO的確可以快速寫出非同步高效讀取io的代碼,不過就跟你去食堂吃飯一樣,其實有時候100個人一擁而上打飯和100個人排著隊打飯,並不是一定是一擁而上效率高。對於Nodejs線上服務,很常見的性能瓶頸就是因為他太屌了,能夠一下子承接1W個非同步請求,然後。。。。它掛了,他的非同步機制導致應用被掛起,內存狂飆,IO堵塞,而且不可恢復,這個時候你只能重啟了。而ruby,java他們正在有序的處理請求,他們處理不了的請求都在排隊等著呢,雖然慢點,但是不會掛額。

而且,誰說其他語言沒有非同步機制呢?ruby,java,都有解決非同步問題的框架方案。

對於我們團隊,其實使用NodeJS的理由,反而提現在其他方面:

1. 生態活躍,解決方案眾多,我們的Node服務化,架構,協作方式都很先進,因為社區活躍,有很多思路可以借鑒,架構變得越來越優,開發方式也變得越來越趨向社區規範。反觀java,一直在玩老掉牙的架構,每天就是在搞環境問題,大部分開發完全不知道內部原理,而且沒有什麼大的技術追求。

2. 輕量,部署輕量,開發輕量。我們可以用最小的阿里雲配置就部署出一個小應用來,用來做微服務化架構非常完美。想想把一個java系統拆分成十幾個微服務(java)的場景,每個進程啟動起來都要1G內存吧至少,high起來吧阿里雲。

3. 我們公司技術棧採用多語言,多一個語言就多一種可能性,例如一些用node實現特別適合的服務,Phantomjs類的服務(圖片,模擬操作等),WebSocket啊之類的。


架構、數據量拿出來晒晒?


首先需要了解幾個基本常識

  1. CPU 運算遠遠快於 I/O 操作
  2. Web 是典型的 I/O 密集場景
  3. JavaScript 是單線程、但 JavaScript 的 runtime NodeJS 並不是,畢竟人家很多代碼是 C++

很多語言是依賴的多進程、線程解決高並發,一個線程處理一條用戶請求,處理完成了釋放線程,在阻塞 I/O 模型下, I/O 期間該用戶線程所佔用的 CPU 資源(雖然十分微量,大部分交給了 DMA)什麼都不做,等待 I/O,然後響應用戶,而且開啟多個進程/線程 CPU 切換 Context 的時間也十分可觀。

就像飯店的服務員只負責點菜,如果給每個廚師都配一個服務員,服務員把客人菜單給大廚後就玩手機等著一樣,你是老闆你也生氣,況且不同於飯店大廚工資高於服務員,在計算機世界,CPU 資源比 I/O 寶貴的多。

說 NodeJS 在高並發、I/O 密集場景性能高,也就是 Web 場景性能高主要也是解決這個問題,沒必要一個廚師配一個服務員,整個飯店說不定一個服務員就夠了,剩下的錢可以隨便做其它事情。

用戶請求來了, CPU 的部分做完不用等待 I/O,交給底層完成,然後可以接著處理下一個請求了,快就快在

  1. 非阻塞 I/O
  2. Web 場景 I/O 密集
  3. 沒那麼多線程 Context 切換,多出來的開銷是檢查一個 EventLoop

其它場景 NodeJS 性能確實不高,甚至非常底下,其實看看 Apache 都江山穩固了,為什麼 Nginx 還能異軍突起就很容易理解 NodeJS優勢,原理實在太像了

NGINX如何實現高性能和可擴展性

另外如果大家遇到自己不認同的觀點,姑且不論對錯、是否是自己不擅長的領域,極盡嘲諷之能事對提問者不會有什麼幫助


高並發的請求處理能力,解決的是請求的問題。

海量數據的分布、組織和處理形式,又事關能否快速響應的問題。

如果涉及海量數據,八成還牽扯到容災,那事情就不簡單了,什麼單點故障RAID複製備份各種各樣的因素都穿插其中。

此間採取什麼分散式、集群都是太常見了。

這不只是事關Node。只談Node是一葉障目。


有些人在成品手機上貼了個logo就說自己創造了新手機,反過來還嘲笑自行研發晶元的手機公司效率低。

人家C/C++、Java程序員先要寫一個類似Node.JS的程序,然後才能在上面實現業務邏輯。

而且在後端服務單點是最忌諱的,如果你這台機器硬體壞了怎麼辦?資料庫和應用程序都不分離嗎?有沒有做集群,壓力高了如何增加節點,存儲有沒有熱備、冷備。

年輕人,後端不是你想像的這麼簡單!


我不懂的是為什麼在知乎,好好的技術討論,只要一扯到前端這些JS,就立馬有一種小學生談三國的感覺:

是呂布厲害!

不!是張飛厲害啦!


題主好,說到node並發高大家都拿飯堂打飯舉例子,node相當於每人發一個號碼牌,然後到一邊坐著等飯做好,窗口大媽繼續發牌給後面的人,這裡發牌相當於是接收了請求,但是做飯(處理請求並響應)總是要時間的啊,也就是說,只是接收請求快,一萬個請求總的響應的時間其實還是一樣的是嗎?那高並發體現在哪裡啊。


"假如"你公司開發一個應用...

這些海量數據"可能"存儲在10台,100台"或者"1000台伺服器中...

"於是乎"你公司的C/C++""java,"或者".net團隊...

"不過"這套系統需要30台伺服器作為支撐...

node.js大神"只要"一天時間,"而且!而且,而且"部署的時候只要1台5000元的PC機!

"第二天給老闆驗收,老闆驚嘆不已!"

題主說相聲的? 還是來知乎練習小學作文呢? 這麼黑姿勢水平堪憂啊。。。


IO 模型很重要,Nodejs 的 IO 模型是用 epoll kqueue 實現的,所以比多線程要快得多。C C++ Java ... 任何其他語言都可以做到,前提是寫出一套封裝的很好的 epoll kqueue 庫。請關注 Nim 語言的 asyncnet,一個靜態編譯為 C 封裝完備的 epoll kqueue 庫。


因為那位大神用node做了個中間層 只負責轉發給底層的c++ 或者 java服務 然後再回傳給客戶端 上次提問者 回答我的 大概是這麼個意思


說 node.js 的性能好,要麼是只會寫 node,要麼是道聽途說。

性能指標從來都不是單獨利用並發或者吞吐量來決定的,而是CPU, 內存以及並發等多方面因素去確定的。node.js 為非同步而生,這一點毫無疑問,但是在 CPU 和內存發麵,要遠遠落後於 C/C++ 和 Java。特別是對於海量請求的場景,CPU 飆高,內存 GC 緩慢居高不下,這對那些使用 nodejs 搭建大型服務的場景,是不得不面對而且束手無策的痛點。


我想你的文字是應該好好整理一下

想想為什麼社區不回

我到現在都不知道你想表達什麼


日,把C++ , java, c#黑了黑便。


高並發不是一個語言就能解決的


因為node的長處就是高並發的請求處理,只能說node更符合你們的業務處理。而且node大神寫邏輯再快也不可能一天寫完java一個月的量。等你們業務邏輯複雜了,java就比node快了。


沒見過這麼厲害的語言,開發周期短,易維護,生態好!


對於非同步這種方式,很多語言都是支持的.java也支持,而且像netflix的hystrix就是一個很好的結合。我很贊成下面大搜車的這個工程師的說的, 高並發的本質還是在於你的io響應速度.就如同為什麼redis一個單進程的可以支持那麼大的tps的處理量.無非就是它的「業務」處理就是一個簡單的內存操作,而不一個"慢io"操作.


當然是單線程io模型了。


正如芋頭君說的。。不解決io問題。性能依然不是太好。。


從管理角度看很正常的現象

nodeJS腳本語言 封裝的函數是能力1000的人編的

一般公司就是招大神級Java不過是能力100左右

所以 你所謂node大神能力只要不低於50很容易搞定

同理最簡單的JDBC調用估計沒人能寫到spring template源代碼 那麼標準吧


看不懂。。。我不明白 nodejs怎麼解決讀寫的性能?


只能說node相對適合該場景而已。其他方面,node未必比別的語言強


好吧!我把內容的意思說出來:

C/C++或java,或者.net團隊耗時1個月開發出了一套完整的系統。

說明系統確實比較複雜。

node.js大神只用1天,說明了node.js開發效率確實高,但是:node.js大神肯定沒重寫整個系統,估計也沒這個能力,他只是將請求轉個後台系統而已,然後返回結果。

總之,看清楚node.js優勢和劣勢,才能更好地利用node.js,和C/C++,java,.net一樣,眾多工具中的一種而已,無法取代誰,也不會被誰取代,只會不斷進化

其實我這裡沒有黑node.js的意思,只是說出她的優勢劣勢。求批評!


推薦閱讀:

《魔獸爭霸III》是如何實現野怪同步的?
伺服器被 DDos 攻擊就沒有有效的處理方法嗎?
如何在linux伺服器上用 PHP 執行 python 腳本?
linux下配的ftp伺服器埠僅僅開21,20埠還不夠?
在Windows中,選擇TCP/IPv4協議設置中的」自動獲取DNS伺服器地址「,計算機究竟做了什麼?

TAG:伺服器 | 伺服器端腳本 | Nodejs | 高並發 |