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

谢谢,
安然

最佳答案

只要您不会在紧密的CPU循环中结块(例如while(true))或使用具有阻塞I / O的库,所有nodejs代码都是非阻塞的。将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秒一次关闭所有处理程序,而不是关闭30秒,可以使效率更高。但是同样,这不太可能成为瓶颈,因为这些数组项中的每一个都由可能更昂贵的真实客户端连接支持。

关于node.js - Node.js长轮询逻辑帮助!,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6094071/

10-13 09:33