使用 node.js 运行许多并行 http 请求

Posted

技术标签:

【中文标题】使用 node.js 运行许多并行 http 请求【英文标题】:running many parallel http requests using node.js 【发布时间】:2011-08-06 03:43:21 【问题描述】:

我的任务是将一个进程拆分为多个并行运行的较小进程,然后分布到多个从属机器上。请求通过 HTTP 进入,服务器将其拆分为多个子进程发给从机,等待所有从机请求返回响应,然后将聚合结果整理成单个数据对象,作为顶层请求。我认为 node.js 会很有用,但由于它是单线程的,我不能完全确定这是否可能,或者它是否会阻止等待每个请求返回,然后再继续下一个请求。这对 node.js 可行吗?如果是这样,有人可以指出我正确的方向吗?即一个节点模块来使用或概述它是如何完成的?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

你可以生成child processes 手动。

var util  = require('util'),
    spawn = require('child_process').spawn,
    node = spawn('node', ['slave.js']);

node.stdout.on('data', function (data) 
  console.log('stdout: ' + data);
);

node.stderr.on('data', function (data) 
  console.log('stderr: ' + data);
);

node.on('exit', function (code) 
  console.log('child process exited with code ' + code);
);

node.stdin.write("do my work!");

我们预计将实现一个 Web Worker API 来处理更高抽象的子进程

【讨论】:

【参考方案2】:

您想了解 WebWorkers。具体来说,你应该阅读http://developer.yahoo.com/blogs/ydn/posts/2010/07/multicore_http_server_with_nodejs/

【讨论】:

【参考方案3】:

尝试查看 node.js cluster 模块,它是一个多核服务器管理器。

【讨论】:

【参考方案4】:

如果即使是单个较小的进程有一个同步接口,单线程也是一个问题。

幸运的是 node 是围绕异步接口设计的。

如子进程http://nodejs.org/docs/v0.4.6/api/child_processes.html#child_process.exec

或 http 请求 http://nodejs.org/docs/v0.4.6/api/http.html#http.request

【讨论】:

在节点的 Http.request 文档中,它说:“节点为每个服务器维护多个连接以发出 HTTP 请求。”。我对此的理解是,我可以在 for 循环中发出 http 请求,跟踪所有返回的结果,然后在它们全部返回时调用我的回调。但是,这种方法似乎取决于该句子中所述节点保持打开的连接数,这意味着它将并行化该过程,直到我达到池中可用请求的数量为止。有谁知道我怎样才能将这个数字增加到 100?【参考方案5】:

我认为这篇博文在异步如何帮助并行执行以及如何使用 Node 进行并行执行方面可能很有趣。

http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

【讨论】:

以上是关于使用 node.js 运行许多并行 http 请求的主要内容,如果未能解决你的问题,请参考以下文章

node.js request.js 不并行触发请求

Node.js是什么

使用node.js在服务器上运行循环

Node.js——HTTP概念进阶

RethinkDB 和 Node.js/Express - 为并行查询打开多个连接?

实战Node.js之GET/POST请求在Web 应用架构在客户端的使用