2012-05-12 37 views
5

我知道Node.js擅長保持大量的併發持久連接,例如,許多聊天室的聊天室。nodejs - 爲什麼Node.js可以處理大量的simulteneous持久連接?

我想知道它是如何實現這一點。我的意思是無論如何它使用TCP/IP封裝的底層操作系統,爲什麼它可以處理持久的連接,以至於其他人無法做到?

它有什麼神奇的東西?

+5

@MartinJames:我認爲我們已經離開了JS成爲腳本小子的領域。不需要諷刺語言學家的評論。 – Amadan

+0

@Amadan OP問題正處於商業推廣的邊緣。它聽起來並不像「根據實際問題面對的實際的,可回答的問題」,(faq)。一位語言學家的評論似乎很合適我沒有倒下它或者投票結束,因爲這有可能是一個真正的問題。 –

+0

@MartinJames:不,如果你覺得一個問題不屬於SO,那麼指向FAQ的指針是適當的,而不是。如果問題是關於[node.cs](https://github.com/Rduerden/Node.cs),所有其他事情是否相同,你會以同樣的方式回答嗎? – Amadan

回答

6

Node.js使所有I/O異步。它只能在單個線程中運行,但在等待I/O時會執行其他請求或操作。

相比之下,傳統Web服務器將不利於另一個請求,直到前一個完全完成。出於這個原因,Apache同時運行多個進程;假設有10 httpd進程,通常意味着可以在任何時候(*)提供10個請求。如果進程需要更多時間才能完成,那麼即使進程無所事事 - 比如等待數據庫咀嚼和返回數據,您的服務請求也會減少 - 或者必須產生更多進程。

使Node.js的過程中,正面臨着一個訪問數據庫的請求,使數據庫,同時它去滿足另一個請求工作。

*)MPM使得這並不完全正確,但對於所有意圖和目的真的不夠。

+1

我很好奇,如果Node.js只是使用非阻塞IO,爲什麼其他巨人如Apache不能產生這樣的非阻塞的東西?爲什麼httpd不會被修改爲這種框架?他們可以嗎? –

+1

安全。 Apache做的很好;隔離請求是其中的一部分。然而,只要你不想要求孤立的請求,Apache不會很好地處理它;儘管Phusion Passenger和FastCGI有所幫助。請記住:Apache主要提供靜態頁面;其他一切都通過CGI,或通過插件(Apache模塊)。因此,優化Apache I/O就像優化鵝拉車一樣。 (另一方面,當談到Ruby或Python時,兩者都可以通過它們各自的異步庫(EventMachine或Twisted)完成同樣的事情。) – Amadan

0

那麼,事情是,大多數Web服務器(如Apache等)的作品使用線程產卵,在那裏他們spwan爲每個傳入的HTTP請求一個新的線程。這些線程在本質上是同步的和阻塞的=>這意味着它們將按照寫入的順序執行代碼,並且任何進一步的計算都將被當前的I/O或計算任務阻塞。就像如果你想傾聽聊天提交的事件一樣,你需要爲每個用戶提供一個專用線程(每個用戶對於維護持久連接都是必要的,但是有幾種可能的優化技術,但你仍然可以假設線程是按用戶)收聽這個事件,這個線程將被阻塞,等待這個事件發生。因此,對於任何線程產卵和,另一方面阻止Web服務器

JavaScript是非阻塞(導電異步代碼)自然=>在這裏您註冊一個回調的事件,每當它出現了一些回調函數將被執行。它不會在任何時候阻止這個事件。

通過閱讀有關非阻塞或異步服務器的信息,您可以找到更多關於此的信息。

+0

JavaScript不是異步的,node.js是。由於功能的一流公民身份,JavaScript對於異步編碼風格(或者說,延續傳球風格)具有相當的傳導性;但JavaScript本身並沒有什麼特別的異步。 – Amadan