Длинная логика опроса Node.js поможет - PullRequest
1 голос
/ 23 мая 2011

Я пытаюсь реализовать длинную стратегию опроса с помощью 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) Это эффективно?если нет, какие-либо предложения, как я могу улучшить это?

Спасибо,
Anjan

1 Ответ

0 голосов
/ 04 июня 2011

Весь код nodejs является неблокирующим, если вы не получаете блоки в узком цикле ЦП (например, while (true)) или используете библиотеку, которая имеет блокирующий ввод / вывод.Помещение setTimeout в конец функции не делает ее более параллельной, оно просто откладывает работу процессора до более позднего события.

Вот простой сервер демо-чата, который случайным образом выдает «Hello World» каждый разОт 0 до 60 секунд для всех клиентов подключения и.

// 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 секунд после последнего события.Но опять же, это вряд ли является узким местом, поскольку каждый из этих элементов массива поддерживается реальным клиентским подключением, которое, вероятно, дороже.

...