簡體   English   中英

具體是什么使Node.js比Apache更具可擴展性?

[英]What specifically makes Node.js more scalable than Apache?

說實話,我還沒有完全理解它 - 我甚至理解Node.js是如何工作的,作為使用事件模型的單個線程。 我只是不知道它如何比Apache更好,如果它是單線程的,它如何水平擴展。

我發現Tomislav Capan撰寫的這篇博文非常清楚地解釋了這一點:
為什么地獄會使用Node.js? 個案介紹

我對它的要點的解釋,對於Node 0.10,與Apache相比:

好的部分

  • Node.js避免為每個請求啟動線程 ,或者不需要像Apache那樣處理對一組線程的請求池。 因此,處理請求的開銷較小,並且擅長快速響應。
  • Node.js可以將請求的執行委托給單獨的組件,並專注於新請求,直到委托組件返回處理結果。 這是異步代碼,並且可以通過事件模型實現。 Apache在池中串行執行請求,並且當其中一個模塊只是等待任務完成時,不能重用該線程。 然后,Apache將對請求進行排隊,直到池中的線程再次可用。
  • Node.js會說JavaScript ,因此非常快速地傳遞和操作從外部Web API源(如MongoDB)檢索到的JSON,從而減少了每個請求所需的時間。 像PHP這樣的Apache模塊可能需要更多時間,因為它們無法有效地解析和操作JSON,因為它們需要編組來處理數據。

壞的部分

注意:下面列出的大多數不良部分將通過即將推出的版本0.12得到改進,這是值得注意的。

  • Node.js在計算密集型任務中很糟糕 ,因為每當它執行長時間運行時,由於其單線程,它將對所有其他傳入請求進行排隊。 Apache通常會有更多線程可用,並且操作系統將在這些線程之間整齊且公平地調度CPU時間,仍允許處理新線程,盡管速度稍慢。 除非Apache中的所有可用線程都處理請求,否則Apache也將開始排隊請求。
  • Node.js沒有充分利用多核CPU ,除非您創建Node.js集群或啟動子進程。 具有諷刺意味的是,如果你做后兩者,你可能會增加更多編排開銷,這與Apache有相同的問題。 從邏輯上講,您還可以啟動更多的Node.js進程,但這不是由Node.js管理的。 你必須測試你的代碼,看看哪些更好; 1)具有集群和子進程的Node.js內的多線程,或2)多個Node.js進程。

緩解措施

所有服務器平台都有一個上限。 Node.js和Apache都會在某個時刻到達它。

  • 當您有繁重的計算任務時,Node.js將以最快的速度到達它。
  • 當你拋出大量需要長串行執行的小請求時,Apache會以最快的速度到達它。

您可以做三件事來擴展Node.js的吞吐量

  1. 通過設置集群 ,使用子進程或使用Phusion Passenger等多進程協調器來利用多核CPU
  2. 設置工作者角色與消息隊列連接 這將是針對計算密集型長期運行請求的最有效解決方案; 將它們卸載到工作場。 這會將您的服務器分為兩部分; 1)面向公眾的文書服務器接受來自用戶的請求,2)私人工作服務器處理長時間運行的任務。 兩者都與消息隊列連接。 文書服​​務器將消息(傳入的長時間運行的請求)添加到隊列中。 工作者角色偵聽傳入消息,處理這些消息,並可能將結果返回到消息隊列中。 如果需要請求/響應,則文書服務器可以異步等待響應消息到達消息隊列。 消息隊列的示例是RabbitMQZeroMQ
  3. 設置負載均衡器並啟動更多服務器。 現在您可以有效地使用硬件並委派長時間運行的任務,您可以水平擴展。 如果您有負載均衡器,則可以添加更多文書服務器。 使用消息隊列,您可以添加更多工作服務器。 您甚至可以在雲中進行設置,以便按需擴展。

這取決於你如何使用它。 Node.js默認是單線程的,但是使用(相對)新的集群模塊,您可以跨多個線程水平擴展。

此外,您的數據庫需求還將決定節點的縮放效率。 例如,將MySQL與node.js一起使用將不會獲得與使用MongoDB一樣多的好處,因為MongoDB和node.js都具有事件驅動的特性。

以下鏈接有很多不同設置的系統基准測試: http//www.techempower.com/benchmarks/

Node.js排名不是最高,但與使用nginx的其他設置相比(在他們的表上沒有apache,但足夠接近)它確實很好。

但同樣,這在很大程度上取決於您的需求。 我相信如果你只是服務靜態網站,建議你堅持使用更傳統的堆棧。 然而,人們已經使用node.js為其他需求做了一些了不起的事情: http//blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ (c10k?ha!)

編輯:值得一提的是,你真的不是用node.js'替換'apache。 您將替換apache和php(在典型的燈堆中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM