2011-05-23 138 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秒内关闭连接而变得更有效。但是,再次,这不可能是瓶颈,因为这些阵列项目中的每一个都由可能更昂贵的实际客户端连接支持。