Node.js长轮询逻辑帮助!

时间:2011-05-23 07:21:28

标签: node.js long-polling

我正在尝试使用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)效率高吗?如果没有,任何建议如何改进它?

谢谢,
安键

1 个答案:

答案 0 :(得分:0)

所有nodejs代码都是非阻塞的,只要你没有在紧密的CPU循环(如while(true))中使用hunk或使用具有阻塞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秒的时间来关闭连接,而不是关闭连接。但同样,这不太可能成为瓶颈,因为每个数组项都有可能更昂贵的真实客户端连接支持。