在特定情况下向PHP开发人员解释nodejs开发风格

Cas*_*ynn 5 javascript web-applications node.js

我是一个PHP Web应用程序开发人员,用PHP和CodeIgniter构建了几个大型项目.PHP总是完成工作,但现在我正在开发一个我正在客户端使用javascript extjs4框架构建的新项目.我对经验丰富的nodejs开发人员提出了一些问题.

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

我的问题是,由于nodejs是非锁定的,因此整个App服务器模型,一个齿轮工作排队服务器和后台工作者是否对nodejs开发有意义?我是否只是接受来自客户端的ajax请求登录,从应用服务器调用facebook API并等待它的响应(同时处理其他用户的请求,因为nodejs是非锁定的)然后回复用户?

我也正在考虑进入nodejs开发,以便能够利用令人敬畏的heroku环境.

Dan*_*del 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');
Run Code Online (Sandbox Code Playgroud)

输出

  start
  end
  facebook returned
Run Code Online (Sandbox Code Playgroud)

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

  console.log('start');

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

此外,在需要时将动态子进程(包括其他节点进程)集成到应用程序中也是很重要的。来自官方文档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' });
Run Code Online (Sandbox Code Playgroud)

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

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

 process.send({ foo: 'bar' });
Run Code Online (Sandbox Code Playgroud)

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

  • 使用工作线程仍然可以非常方便地控制工作负载(以抵消服务器过载),而且还可以通过创建多个工作线程来增加工作负载。 (2认同)