是否可以将2个并发的node.js POST请求发送到同一个服务器上?

时间:2016-07-15 12:09:24

标签: node.js concurrency

我在Node.js中编写了一些测试代码,这些代码只是重复地将HTTP请求发送到Web服务器。以简化形式:

function doPost(opts, data) {
    var post_req = http.request(opts, function(res) {
        res.setEncoding('utf8')
        res.on('data', function (chunk) { })
    })
    post_req.write(JSON.stringify(data))
    post_req.end()
}
setInterval(doPost, interval, opts, msg)

我更喜欢这些请求是按顺序发出的,即在第一次POST收到响应之前没有发送后续POST。

我的问题是:由于运行时使用的non-blocking architecture of the underlying libuv library,此代码是否可能通过与Web服务器的连接发送一个POST,但即使是来自服务器的响应还没有到来?

如果我想象一下select()循环,我可以自由地为第二个POST调用write()并获得EWOULDBLOCK。或者,如果网络中断,它是否会构建排队到IO线程池的POST请求积压?我不清楚在这种情况下我应该期待什么样的行为。在下一个POST开始之前,我必须做些什么来强制完成POST?

2 个答案:

答案 0 :(得分:0)

继承Node.js在单个线程上运行,要运行多个进程,您必须运行集群,它们有点类似于Java中的多线程。 (见Node.js documentation on clusters)。例如,您的代码将如下所示:

var cluster = require('cluster');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
  });
}
else {

  //call the code in doPost
  doPost(opts, data);
}

答案 1 :(得分:0)

我想我找到了答案。我在数据包捕获下运行了一些测试,发现当网络丢失时,重要的是限制你的POST请求,否则请求被排队到IO池,并且取决于连接状态,有些可能发送,其他可能没有,以及消息顺序被破坏了。