2012-04-12 16 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