2012-04-12 13 views
5

我是一个PHP web应用程序开发人员,他在PHP w/CodeIgniter中构建了多个大型项目。 PHP总是完成这项工作,但现在我正在开发一个新的项目,我在客户端使用javascript extjs4框架构建。我对经验丰富的nodejs开发人员有一些疑问。在特定情况下向PHP开发人员解释nodejs开发风格

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

我的问题是,不应用程序服务器的Gearman的工作queing服务器后台这整个模式,以及工人有意义的发展的NodeJS因为是的NodeJS无锁定?我是否会接受客户端的ajax请求来登录,从应用程序服务器调用Facebook API并等待它的响应(在处理其他用户的请求,因为nodejs是非锁定的),然后回复用户?

,我也在考虑进入发展的NodeJS为能够采取真棒Heroku的环境优势的缘故。

+1

我希望有人回答这个问题,我处于类似的情况 – Dhiraj 2012-04-12 08:13:42

回答

2

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

因为节点是非阻塞的,所以事件循环不断监视可执行的请求。下面是使用一个例子node-facebook-client

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 

你可以想像,这基本上是(内置与Facebook的API来使用的许多npm模块之一)有什么大惊小怪约与节点(加上它真的很快)。也就是说,这也是学习曲线与节点异步执行的地方。如果“结束”需要拿出后的Facebook的回报“,那么你就必须把它的回调

console.log('start'); 

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

此外,它的基本动态子流程集成到应用程序在需要的时候,包括附加节点进程。从official docschild_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' }); 

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

+0

哇,这是令人难以置信的,是否有任何理由使用工作进程,如果节点js web进程可以处理长时间运行的操作,如API调用,同时仍然接受额外请求,而不是锁定? – 2012-04-13 00:21:23

+2

使用工作线程仍然可以非常方便,例如节流工作负载(以抵消服务器过载),还可以通过创建多个工作负载来增加工作负载。 – Alfred 2012-04-13 05:12:46

+1

在多个进程中复制节点应用程序非常普遍,然后使用另一个称为“cluster”的本地模块在它们之间进行负载平衡,这只是“child_process.fork”的一个花哨的包装,允许工作人员共享TCP服务器。即使它是非阻塞的,单个节点进程仍然只能一次完成1件事情,因此复制到多个进程会提高并发性。 – 2012-04-13 14:37:33