2016-09-20 91 views
1

我們知道Node.JS以異步單線程的方式工作。 我已經使用MongoDB好幾個月了,老實說,我發現查詢語言不是很強大,很好。聚合框架帶來了重要的功能,但是像內部查詢這樣的SQL功能非常之遠(注意我並不是在談論大量的連接)。 所以我發現自己多次提供這個缺乏可怕的結果集遍歷(foreach),以形成我想要的結果。處理cpu綁定操作

很明顯,它不適用於大型數據集。在Node.JS環境中,這些事情是真正的災難,因爲我阻止整個服務器爲單個請求提供服務。

你如何處理這些類型的CPU綁定任務?

回答

0

理想情況下,您不重建結果。您設計了一個MongoDB可以處理的查詢,以獲得您想要的結果......可能會更好地打開與該特定問題相關的問題,因爲可能會丟失某些內容。但是,假設您確實發現了一個異常(這不太可能),並且您需要構建一大組數據來解決瓶頸問題。有一個很好的機會可以再次優化此操作...您應該打開與此問題相關的問題,以瞭解可以進行哪些改進。


可以說,你確實是一個非常罕見的例外,以上所有都不適用於你。你有幾個(更復雜)選項可以選擇:

  1. ClustersChildProcess - 允許你獨立過程併發性的一種形式。
  2. RabbitMQZeroMQ - 消息隊列是另一種工具,允許併發,注意,可用
  3. MySQLPostgres其他圖書館 - 遷移回來,如果你用它更好地SQL。編寫一個腳本,從MongoDB的讀取和執行插入到新的數據庫,然後編寫查詢你想

請注意選擇1 & 2上面還允許您與其他語言,這將是更適合的接口處理大量數據。

+0

這是一個例子http://stackoverflow.com/questions/39474513/real-virtual-field-inherited-fields。最終目的(在問題中沒有解釋)是獲取與每個標籤相關的所有文檔。基本上是一個SQL GROUP BY,除了docBs從被引用的docA繼承標籤之外。我在最後一步中用3個步驟和3個嵌套的foreach解決了一個瘋狂的異步系列 – alfredopacino

1

實際上,整個Node.js架構基於單線程事件循環,所以任何CPU綁定函數都會阻塞整個服務器,直到函數完成其操作。

在可能的解決方法可能是

  • 將您服務於幾個並行的node.js applicaitons;
  • 使用多核並行工作在不同核上執行。

看看這篇文章:Why you should use Node.js for CPU-bound tasks