2012-10-02 41 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