2011-03-24 140 views
7

我實際上正在嘗試創建一個將利用Server-Sent Events draft的web應用程序。據我所知,SSE每個連接使用一個線程,並且由於服務器將持續向客戶端泵送數據,即使一秒鐘也不會閒置,因此我無法將線程恢復到池中。Node.JS服務器發送的事件

因此,我試圖使用Node.JS(我沒有使用,直到日期)來處理連接到服務器。我已經通過了HTML5 Rocks introduction to SSE,並且有一個將SSE與Node.JS集成的代碼示例。

但是,我很困惑Node.JS是否會同時處理數千個客戶端連接,並且比Apache服務器更有效地利用服務器?任何人都可以幫我理解Node究竟會在這裏扮演什麼角色?

對不起,如果我聽起來有點太模糊。我準備儘可能多地做出澄清!謝謝!

+0

如果你還沒有,看這個介紹視頻(是的,它的長,但它的好)http://www.yuiblog.com/blog/2010/05/20 /視頻達爾/ – generalhenry 2011-03-24 20:03:22

+0

你知道,IE和FF是一個不走這個方法對嗎? – 2011-03-25 00:28:32

+0

@generalhenry - 感謝您的鏈接。將檢查出來。 – 0xff0000 2011-03-25 03:54:04

回答

4

PHP:

do { 
    sendMsg($startedAt , time()); 
    sleep(5); 
} while(true); 

VS

Node.js的

setInterval(function() { 
    constructSSE(res, id, (new Date()).toLocaleTimeString()); 
}, 5000); 

的差異它睡眠塊PHP的螺紋5秒。在這5秒鐘內,服務器需要有一個專門的線程,完全沒有任何問題。每個用戶一個線程。

使用node.js版本setInterval不會阻塞該線程。一個node.js線程可以處理所有的用戶。

+0

謝謝你把最後一句話清理乾淨。這就是我一直在尋找的。所以如果我要進一步優化這個處理並且說讓Node.JS處理20k +併發連接,我需要做什麼?也許我應該要求,作爲一個單獨的部分 – 0xff0000 2011-03-25 03:58:51

+0

關鍵是確保節點沒有被計算粘在一起,一個糟糕的while循環會使作品損壞。 – generalhenry 2011-03-25 08:05:04

2

不過,我很困惑, 的Node.js是否會同時處理成千上萬的 客戶端連接和 更有效地利用服務器 比Apache服務器?任何人都可以幫助 我明白Node將 在這裏的行爲?

我想你應該讀Understanding event loops and writing great code for Node.js以更好地掌握事件循環。在node.js中,沒有任何東西可以阻止,這將爲你節省大量的CPU週期。

另外TJ's ebook可以幫助你掌握事件。當事件發生時,與該事件相關的回調將被調用。

+0

非常感謝鏈接。但是,當我使用Node.JS傳遞服務器發送的事件時,是否需要在Node.JS中編寫一些顯式管道代碼,或者它是否會自動執行此操作? – 0xff0000 2011-03-25 03:56:36

+0

您應該使用數據存儲(redis)來存儲消息。來自redis的pubsub semnantics也非常強大。我也建議你看看socket.io,它也很強大。 – Alfred 2011-03-25 22:04:12

3

嘗試一下Understanding the node.js event loop文章關於併發連接。我建議創建一個Web應用程序,它利用的WebSockets而不是服務器發送的事件,因爲小規模企業較少受到瀏覽器比WebSockets的支持。還有很多基於WebSockets的node.js模塊在GitHub上有源代碼可以「激發」你。

+0

這和socket.io很容易不關心瀏覽器支持什麼傳輸,因爲它甚至可以在ie6中模擬套接字 – generalhenry 2011-03-25 08:04:29

+0

感謝您的指針。我在考慮更多關於Server-Sent Events的內容,節省了寶貴的帶寬,因爲它只接受一個請求,並在此之後不斷推送數據。 – 0xff0000 2011-03-25 09:04:38

1

嘗試使用express + connect-sse

var sse, express, app; 

sse = require('connect-sse')(); 
express = require('express') 

app = express() 
app.get('/events', sse, function (req, res) { 
    res.json("this is an event"); 
    res.json({here: "is", another: "event"}); 
}); 
相關問題