2012-02-04 284 views
1

我想就移動處理的實際影響提出一些意見,這些處理傳統上將在服務器上完成,而不是由客戶端在node.js Web應用程序中處理。將node.js服務器javascript處理移動到客戶端

案例研究案例: 用戶上傳一份包含多年銀行對帳單條目的CSV文件。我們希望解析文件,對每個條目進行分類並計算每個類別的累計值,以便我們可以將新分類的語句存儲在數據庫中,並向用戶顯示支出分析。

條目按照說明中的匹配字符串進行分類。有許多類別和許多條目,並且需要相當長的時間來處理。

在我們的node.js服務器中,我們可以愉快地釋放事件循環,同時等待網絡響應等,但是如果有任何數據處理或類似處理,服務器將被阻止響應請求,並且這似乎是不可避免的。

傳統上,CSV文件將傳遞給服務器,服務器將處理,保存在數據庫中,併發回處理輸出。

在我們的單線程node.js服務器中,這個處理由瀏覽器處理,輸出顯示併發送到服務器進行存儲似乎是有意義的。當然,客戶端必須等待完成,但他們的處理不會阻止服務器響應來自其他客戶端的請求。

我很想看看有沒有人有過使用此模型構建應用程序的經驗。

所以,問題是..是否有任何問題獲取瀏覽器,而不是服務器來處理,只要有可能,將阻止事件循環的任何處理?這對於node.js應用程序開發來說是一個很好/合理/可行的方法嗎?

+0

一年的銀行對賬單信息實際上不應超過幾毫秒來處理客戶端或服務器。 – Pointy 2012-02-04 15:05:22

+0

你總是可以使用['process.nextTick()'](http://nodejs.org/docs/latest/api/process.html#process.nextTick)分解服務器端處理,以便它保持響應其他在處理時請求 - 處理幾行內容,然後將剩下的工作委託給下一個打勾。 – 2012-02-04 15:10:14

+0

如果有很多類別,每個類別都有數百個可能的匹配,並且每個條目都必須針對每個條目進行測試,但可能需要一段時間。無論如何,不​​是重點......不好的例子,問題更多的是圍繞着給客戶處理繁重的處理操作的一般方法。 @JoeWhite感謝您的建議..將看看nextTick() – hacklikecrack 2012-02-04 17:05:32

回答

1

雖然完全可能,但將處理簡單地轉移到客戶機並不能解決基本問題。

現在,客戶端的事件循環被阻止,從而阻止用戶與瀏覽器交互。瀏覽器往往會檢測到這個問題,並完全停止執行頁面的腳本。你的用戶肯定會討厭的東西。

委託或拆分工作負荷是沒有辦法的。 使用第二個進程(例如第二個節點實例)來執行數字運算服務器端還有一個額外的好處,即允許操作系統使用第二個CPU內核。理想情況下,您可以運行儘可能多的Node實例,因爲您在服務器中具有CPU內核,並在它們之間平衡您的工作負載。查看diode module,瞭解如何在節點中實現多進程通信。

2

我不認爲信任客戶端處理的數據是一個好主意。

相反,您應該考慮創建一個獨立進程偵聽的工作隊列,將CPU密集型任務與處理HTTP請求的node.js進程分開。


我提出的數據流量將是:

  1. HTTP上傳請求
  2. 應用服務器
  3. 通知(原始文件的某處工作進程可以訪問保存)以 'CSV' 工作隊列
  4. 工作進程上傳的csv文件。
相關問題