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

我是一个PHP Web应用程序开发人员,他使用PHP / CodeIgniter构build了几个大型项目。 PHP总是完成这项工作,但现在我正在开发一个新的项目,在客户端使用javascript extjs4框架构build。 我对有经验的nodejs开发者有一些疑问。

在我最近的PHP项目中,用户login请求要求我的服务器对Facebook进行API调用。 为了提高可伸缩性,我处理这个事情的方式是我的客户端发出初始login请求,服务器会将请求传递给一个“gearman”job queing服务器,后台工作进程会抓住这个工作并执行API调用。 同时,服务器会回复客户端,然后客户端的浏览器会开始使用AJAX轮询服务器,看是否已完成工作。 (哦,我把工作人员的Facebook API调用结果通过memcached传递给应用程序服务器)。 我这样做是为了释放我的应用程序服务器,以处理来自用户的更多并发请求,因为PHP被locking,Facebook API调用需要几秒钟的时间。

我的问题是,由于nodejs是非locking的,应用服务器的整个模型,一个齿轮工作者队列服务器和后台工作人员是否对nodejs开发有意义? 我只是简单地接受来自客户端的ajax请求login,从应用程序服务器调用Facebook API,并等待它的响应(同时处理其他用户的请求,因为nodejs是非locking的),然后回复给用户?

为了能够利用真棒heroku环境,我也考虑进入nodejs开发。

简单的答案是肯定的,你通常在节点系统中处理这个问题的方式正是你描述它的方式。

因为节点是非阻塞的,所以事件循环一直在监视可操作的请求。 下面是一个使用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 

正如你可以想象的,基本上这就是节点所有的问题(加上它真的很快)。 也就是说,这也是学习曲线与节点asynchronous执行的地方。 如果“结束”需要在“Facebook返回”之后出现,那么您必须将其置于callback中

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

此外,在需要时将dynamicsubprocess集成到应用程序中是很基本的, 包括额外的节点进程 。 来自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' }); 

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