我是一名PHP Web应用程序开发人员,用PHP和CodeIgniter构建了几个大型项目。 PHP总是完成工作,但现在我正在开发一个我正在客户端使用javascript extjs4框架构建的新项目。我对经验丰富的nodejs开发人员提出了一些问题。
在我最近的PHP项目中,用户登录请求要求我的服务器对Facebook进行API调用。我处理此问题的方法是为了提高可伸缩性,我的客户端会发出初始登录请求,服务器会将请求传递给'gearman'作业排队服务器,后台工作进程会抓取作业并执行API调用。在此期间,服务器将回复客户端,然后客户端的浏览器将开始使用AJAX轮询服务器以查看作业是否已完成。 (哦,我通过memcached将Facebook API调用的结果从工作者传递到应用程序服务器)。我这样做是为了释放我的应用程序服务器以处理来自用户的更多并发请求,因为PHP正在锁定并且Facebook API调用需要几秒钟。
我的问题是,由于nodejs是非锁定的,因此整个模型的App服务器,一个gearman作业排队服务器和后台工作者是否对nodejs开发有意义?我是否只是接受来自客户端的ajax请求登录,从应用服务器调用facebook API并等待它的响应(同时处理其他用户的请求,因为nodejs是非锁定的)然后回复用户?
我也在考虑进入nodejs开发,以便能够利用令人敬畏的heroku环境。
答案 0 :(得分: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
你可以想象,这基本上是节点的所有大惊小怪(加上它真的非常快)。也就是说,它也是学习曲线与节点 - 异步执行的地方。如果'结束'需要在'facebook return'之后出现,那么你必须把它放在回调中
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
的{{3}}:
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()方法,进程每次在其通道上收到消息时都会发出对象。