2011-05-23 63 views
1

我試圖用node.js實現一個長的輪詢策略Node.js長輪詢邏輯幫助!

我想要的是當對node.js發出一個請求時,它會等待最多30秒讓一些數據變爲可用。如果有數據,它會輸出並退出,如果沒有數據,它將等待最多30秒,然後退出。

這裏是我想出了一個基本的代碼邏輯 -

var http = require('http'); 

var poll_function = function(req,res,counter) 
{ 

    if(counter > 30) 
    { 
    res.writeHeader(200,{'Content-Type':'text/html;charset=utf8'}); 
    res.end('Output after 5 seconds!'); 
    } 
    else 
    { 
    var rand = Math.random(); 

    if(rand > 0.85) 
    { 
     res.writeHeader(200,{'Content-Type':'text/html;charset=utf8'}); 
     res.end('Output done because rand: ' + rand + '! in counter: ' + counter); 
    } 
    } 

    setTimeout 
    (
    function() 
    { 
     poll_function.apply(this,[req,res,counter+1]); 
    }, 
    1000 
); 
}; 

http.createServer 
(
    function(req,res) 
    { 
    poll_function(req,res,1); 
    } 
).listen(8088); 

我的數字是什麼,當一個請求作出poll_function被稱爲其1秒後自稱,通過內本身的setTimeout。所以,它應該保持異步的方式,它不會阻止其他請求,並在完成時提供輸出。

我在這裏使用了一個Math.random()邏輯來模擬不同間隔的數據可用性場景。

現在,我關心的是 -

1)會有什麼問題嗎? - 我根本不希望部署它,但不確定它不會反擊!

2)效率高嗎?如果沒有,任何建議,我該如何改進?

感謝,
安鍵

+0

我[寫了一個長輪詢的例子](http://stackoverflow.com/questions/6052181/node-js-how-to-create-a-http-chat-server/6052332#6052332)服務器爲題。它可能有幫助。 – Raynos 2011-05-23 07:24:52

回答

0

所有代碼的NodeJS是隻要非阻塞你不緊張的CPU循環得到大塊(如,而(真)),或者使用已經阻塞I/O庫。在函數的結尾放置一個setTimeout並不會讓它更平行,它只是延遲一些cpu工作,直到後來的事件。

這是一個簡單的演示聊天服務器,它會每隔0到60秒向和和所有連接客戶端隨機發出「Hello World」。

// A simple chat server using long-poll and timeout 

var Http = require('http'); 

// Array of open callbacks listening for a result 
var listeners = []; 

Http.createServer(function (req, res) { 

    function onData(data) { 
     res.end(data); 
    } 
    listeners.push(onData); 

    // Set a timeout of 30 seconds 
    var timeout = setTimeout(function() { 
     // Remove our callback from the listeners array 
     listeners.splice(listeners.indexOf(onData), 1); 
     res.end("Timeout!"); 
    }, 30000); 

}).listen(8080); 
console.log("Server listening on 8080"); 

function emitEvent(data) { 
    for (var i = 0; l = listeners.length; i < l; i++) { 
     listeners[i](data); 
    } 
    listeners.length = 0; 
} 

// Simulate random events 
function randomEvents() { 
    emitData("Hello World"); 
    setTimeout(RandomEvents, Math.random() * 60000); 
} 
setTimeout(RandomEvents, Math.random() * 60000); 

這將是相當快的。唯一危險的部分是拼接。如果數組變得非常大,拼接可能會變慢。這可以通過在每30秒或最後一次事件之後30秒關閉所有處理程序的30秒內關閉連接而變得更有效。但是,再次,這不可能是瓶頸,因爲這些陣列項目中的每一個都由可能更昂貴的實際客戶端連接支持。