2012-05-10 33 views
5

我將構建一個Web應用程序來管理筆記(想想類似Evernote的東西)。我決定使用Backbone.js + JQuery客戶端。服務器端,我還沒有決定:純PHP(我知道的很好)或Node.js + Socket.io(對我來說是全新的)。Node.js和Socket.io - 它們能夠使用實時Web應用程序有多遠?

我正在考慮Node.js + Socket.io,因爲我想讓我的web應用程序實時(即:如果用戶更新了一個便箋,該便箋會立即爲共享該便箋的合作者立即更新,無需重新加載頁面)。

作爲第三種選擇,我還在考慮將Node.js和Socket.io用於REST API的UI和PHP(我覺得使用PHP構建API更加舒適)。 PHP和Javascript代碼將共享MongoDB數據庫。我的問題是這樣的:如果我爲PHP Web應用程序開發REST API,並且通過API創建用戶的新備註(即:Android應用程序發送API請求來創建該備註),將會Node.js,Socket.it和Backbone.js能夠立即更新用戶的UI並在屏幕上顯示新的註釋?我認爲這可以稱爲「推送通知」。

我希望我已經夠清楚了。

另外,是否有任何替代傑出的技術來構建實時Web應用程序?

回答

9

是的Node.js + Socket.IO將做得很好。節點使用事件循環,這意味着一旦請求進入隊列。節點逐個處理這些請求。傳統的Web服務器處理一個'Thread-per-request'方法,其中創建一個線程來處理這些請求。

這裏Node的好處是它不需要經常上下文切換,這意味着它可以很快處理這些請求......最有可能比你的PHP服務器更快。但是,Node在單個CPU內核上作爲單個進程運行。如果你的應用程序是CPU密集型的,它可能會阻塞,這意味着每個請求的時間會變慢。

但是,聽起來像你的應用程序不是CPU密集型的,這意味着Node.js將運行良好。

決定 如果你的時間有限,你不想學習一項新技能(節點),PHP會沒事的。如果您有時間,我建議您學習Node.js,因爲它對於I/O密集型任務(如用於創建Notes的REST API)非常有用。

更新用戶界面 如果您的預期用途是通過移動設備,我推薦使用WebSockets,但有一個回退如長輪詢。可以使用Node或PHP更新客戶端用戶界面。但是根據我的經驗,在Node.js上使用Socket.IO會更容易。

示例使用Node.js/Socket更新客戶端。IO

客戶端

socket.on('new-note', function (data) { 
    placeNewNote(data); 
    }); 

服務器端

socket.emit('new-note', data); 

入門節點: How do I get started with Node.js

也請注意,如果你想建個 使用WebSockets的原生Android移動應用程序...您將需要使用:Java socket.io client

+0

傑克,謝謝你的回答。那麼實時呢?通過使用PHP實現的REST API進行更改會在UI中直接反映出來嗎? – dan

+1

我已經添加了一些關於更新UI的信息。我在大學的最後一年項目與您創建的項目非常相似......我使用了Node.js/Express/Socket.IO並將「Notes」存儲在MongoDB數據庫中。 – Jack

+0

太棒了!你能設法實現一切工作嗎? – dan

2

對於Web服務器和推送服務器使用Node.js當然是最好的方法。特別是如果你打算使用Node.js,那麼你必須學習它,所以學習如何製作Web服務器是很自然的(我建議使用最着名的Express framework)。

現在,您可以將PHP用於Web服務器,將Node.js用於推送服務器。爲了讓他們相互溝通,您可能需要將Redis添加到您的應用程序中。 Redis將允許您將通知推送到任何連接到它的客戶端,例如PHP服務器或Node.js推送服務器(並且它可以很好地擴展)。從這一點起,推送服務器會將數據進一步推送到客戶端的瀏覽器。

替代技術將例如Twisted server。當然,你需要學習Python才能使用它。我不知道它是否正確支持WebSockets。我認爲你應該堅持Node.js + socket.io。

+0

謝謝怪異。所以你在說,如果我將PHP排除在外,建立在Backbone,Node,Socket.io之上,我不需要Redit來實現一個實時Web應用程序。是對的嗎? – dan

+0

IS是否替代Backbone.js? – dan

+1

@dan是的,從技術上說你不需要它。但是你仍然應該使用它,因爲如果沒有它,socket.io無法擴展到許多機器(或者至少我不知道用另一種方式來擴展它)。所以你應該使用Redis,除非你認爲一臺機器足夠你的應用程序。但是你不應該做出這樣的假設。 :) – freakish

相關問題