5

我是一名 PHP Web 应用程序开发人员,使用 CodeIgniter 使用 PHP 构建了多个大型项目。PHP 一直都能完成这项工作,但现在我正在开发一个新项目,我正在使用客户端的 javascript extjs4 框架构建该项目。我对有经验的 nodejs 开发人员有一些问题。

在我最近的 PHP 项目中,用户登录请求需要我的服务器对 Facebook 进行 API 调用。为了提高可扩展性,我处理这个问题的方式是,我的客户端会发出初始登录请求,服务器会将请求传递给“gearman”作业排队服务器,后台工作进程将获取作业并执行 API 调用。同时,服务器会回复客户端,然后客户端的浏览器将开始使用 AJAX 轮询服务器以查看作业是否已完成。(哦,我通过 memcached 将 Facebook API 调用的结果从 worker 传递到应用程序服务器)。我这样做是为了释放我的应用程序服务器来处理来自用户的更多并发请求,因为 PHP 处于锁定状态并且 Facebook API 调用需要几秒钟。

我的问题是,由于 nodejs 是非锁定的,因此整个应用程序服务器模型、gearman 作业队列服务器和后台工作人员对 nodejs 开发是否有意义?我是否会简单地接受来自客户端的 ajax 请求以登录,从应用程序服务器调用 facebook API 并等待它的响应(同时处理其他用户的请求,因为 nodejs 是非锁定的)然后回复用户?

为了能够利用令人敬畏的heroku环境,我也在考虑进入nodejs开发。

4

1 回答 1

2

简短的回答是肯定的,您通常在节点系统中处理此问题的方式正是您描述它的方式。

因为节点是非阻塞的,所以事件循环一直在寻找可操作的请求。这是一个使用node-facebook-client的示例(为与 facebook API 一起使用而构建的许多npm模块之一)

  console.log('start');

  client.graphCall(path, params, method)(function(result) {
    // fires whenever request is completed
    console.log('facebook returned');
  });

  console.log('end');

输出

  start
  end
  facebook returned

正如你可以想象的那样,这基本上就是节点的所有大惊小怪(而且它真的非常快)。也就是说,这也是节点的学习曲线——异步执行。如果 'end' 需要在 'facebook 返回' 之后出现,那么你必须把它放在回调中

  console.log('start');

  client.graphCall(path, params, method)(function(result) {
    // fires whenever request is completed
    console.log('facebook returned');
    console.log('end');
  });

此外,在需要时将动态子进程集成到您的应用程序中是基本的,包括额外的节点进程。来自官方文档child_process.fork

var cp = require('child_process');

var n = cp.fork(__dirname + '/sub.js');

n.on('message', function(m) {
  console.log('PARENT got message:', m);
});

n.send({ hello: 'world' });

然后子脚本“sub.js”可能如下所示:

 process.on('message', function(m) {
   console.log('CHILD got message:', m);
 });

 process.send({ foo: 'bar' });

在子进程中,进程对象将有一个 send() 方法,并且进程每次在其通道上接收到消息时都会发出对象。

于 2012-04-12T17:05:11.023 回答