1

我有一个用 Node.js + Express 编写的应用程序来处理传入数据并将客户重定向到其他地方。问题是处理可能需要一段时间(主要是统计相关,所以特定于地理环境的数据+数据库查找)所以在概念上捕获必要的标头(用于数据处理)、发送 301/302 标头然后处理捕获的数据在概念上是否正确?目标是尽可能快地重定向客户,并且在处理完成时不要让他们等待,因为处理本身与重定向无关(我们可以假设目标 URL 是固定的)。

例如:

...
app.get('/click', function(req, res, next) {
    // capture some incoming data
    var ua = req.get('User-Agent');
    var ip = (req.headers['x-forwarded-for'] || 
            req.connection.remoteAddress || 
            req.socket.remoteAddress;
    // redirect
    res.redirect(302,"http://www.google.com");
    // heavy processing on incoming
    processData(ua, ip);
});
...
4

2 回答 2

1

是的,这很好,假设 processData 是异步的,几乎可以肯定它已经是异步的,以避免阻塞 Express 服务器。随着您的系统扩展,您应该考虑切换到将 processData 函数分派到一个队列,在那里它们可以由其他机器处理。查看http://learnboost.github.io/kue/https://github.com/resque/resque

于 2013-10-29T12:46:57.900 回答
1

你可以做到,它几乎类似于在操作后使用“setTimeout”。

"Node.js" is single threaded

但是您必须记住“Node.js”单线程。所以这个操作“processData(ua, ip)”可能会阻塞来自相同或不同HTTP客户端的后续请求。如果“processData(ua, ip)”不包含任何文件、网络、数据库或任何端口读/写操作,那么就无法利用Non-Blocking IO。因此,即使您的方法在本地环境中运行良好,它也不适合生产。

Alternate way

因此,要执行繁重的流程,请使用您的输入创建子流程并让它完成。更好的是,您必须尽可能减少主进程(监听端口的进程)的工作量。

于 2013-10-29T12:47:52.420 回答