2012-10-02 38 views
4

我是node.js的新手,仍然试图理解它背后的哲学。据我所知,node.js只在一个进程中运行,而不是php,它为每个请求打开一个进程\线程。尽管你可以说节点对于I/O来说是“非阻塞”的,但它阻塞了请求(由于每个新请求都没有新的线程,所以请求堆积起来),理论上如果你写了一个node.js应用程序对于遇到麻烦的每个请求都不能很快处理。Node.js非阻塞性质

我的问题是这样的 - 我如何判断某个请求的处理时间是否过长,以至于它会阻止所有其他请求太长而妨碍我的应用的性能?

我知道服务器上的所有“重”操作(db查询,文件系统搜索)都是通过回调完成的,因此无法阻止节点。但是,如果由服务器同步完成的处理请求的所有其他操作只需要很长时间?

例如,服务器需要写很多html到响应中。然后会发生什么?

节点程序员如何知道他是否对某个请求做了太多的事情(以阻塞的方式),它是经验,直觉还是有明确的指导方法?

+0

我对Node.js也很新,但我认为你应该对所有操作使用异步回调。您不应该在Node.js服务器上进行任何同步操作。 – Bardo

+0

假设你的node.js写了一个html文件 - long.html,它有很多很多的行,你这样做的方式(尽我所知)是通过将请求路由到一些处理器,最终必须执行一些处理比如:response.write(“ ......所以就我所见,你在某些时候不能这样做,至少据我所知 –

+0

你的处理程序要做的是返回将HTML传递给一个回调函数,这些回调函数将把这个HTML文件发布到客户端,但是不会从你的服务器代码中提取出来。 – Bardo

回答

5

关于同步代码和异步代码之间的限制在哪里没有明确的指导原则,它更多的是与应用程序流程有关的问题。异步操作应该是首选,因为它们允许Node.js主进程在此期间开始处理其他请求。

也就是说,简单地使用为每个函数回调不是因为一段代码作为这样一个解决方案:

function sum(a, b, callback){ 
    var sum = a + b; 
    callback(sum); 
} 

sum(2,3, function(sum){ 
    console.log(sum); 
} 

依然是同步的。为了使异步process.nextTick可以作为这样的:

function sum(a, b, callback){ 
    var sum = a + b; 
    process.nextTick(function(){ 
    callback(sum); 
    }); 
} 

sum(2,3, function(sum){ 
    console.log(sum); 
} 

一般的经验法则是避免同步递归计算,沉重的循环和IO操作。

查明请求是否耗时过长,从而妨碍性能,因此无法定义,因为限制是特定于应用程序的。这些请求通过在应用程序上运行性能测试来定位。

+0

对于“那些请求通过对应用程序执行性能测试来定位” - 这是绝对关键的。使用DTrace获得大量的性能洞察;查看Dave Pacheco的名为“Dtrace,Node.js和Flame Graphs”的演讲,以及博客文章[Node节点在哪里花费时间?](http:// dtrace。组织/博客/ DAP/2012/01/05 /在那里,不 - 您的节点程序,花,其时间/)。 –

+0

我接受这个答案。更多地了解它:http://howtonode.org/understanding-process-next-tick – kakacii