2016-12-11 55 views
1

我正在使用Node js來創建REST API。API由於使用節點JS進行迭代而變得緩慢

在我的情況下,我有兩個API。

API 1 - >有得到10000條記錄,並進行反覆修改一些數據

API 2:簡單get方法。

當我打開帖子人,並擊中第一個API和第二個API並行 由於節點JS是單線程的這導致第二API獲得響應較慢。

我的期望: 即使第一個API獲得時間,它也不應該在很長一段時間內創建第二個API。

從節點JS文檔我已經找到了聚類的概念。 https://nodejs.org/dist/latest-v6.x/docs/api/cluster.html 所以我實現了集羣,它創建了4個服務器實例。 現在我在一個選項卡中打開API 1,在第二個選項卡中打開API 2,它工作正常。 但是,當我在4個選項卡中打開API 1並再次在第5個選項卡中再次導致緩慢時,API 2。

什麼是解決此問題的最佳解決方案?

+0

請舉一個例子,您需要遍歷10,000條記錄並修改數據。我無法想到任何示例場景。你在用mongodb嗎? postgre? – borislemke

+0

沒有任何使用數據庫。取決於兩個外部服務。從外部服務獲取數據後需要修改數據。 – Rocket55

+0

但是,如何才能在單個操作中更新10,000多個數據呢?我仍然不太清楚什麼時候可以做到這一點。給我們一個真實的例子請。 – borislemke

回答

0

Node.js實際上不是多線程的,所以所有這些請求都只是在單個線程的事件循環中處理。

每個Node.js進程都在單個線程中運行,默認情況下,它在32位系統上具有512MB的內存限制,在64位系統上具有1GB的內存限制。

但是,您可以將單個進程拆分爲多個進程或工作程序。這可以通過集羣模塊來實現。集羣模塊允許您創建子進程(worker),它們共享(或不)與主節點進程共享(或不)所有服務器端口。

你可以在你的應用程序直接調用羣集API,或者您可以使用許多抽象的一個比API

https://nodejs.org/api/cluster.html

1

因爲node.js中的單線程性質,只有這樣才能中確保您的服務器始終對快速請求做出響應,例如您爲API2描述的是確保您的服務器永遠不會有任何長時間運行的操作。

當你遇到你的代碼,需要一段時間來運行,並且會影響您的服務器的響應某些操作,您的選項如下:

  1. 將長時間運行的工作提高到一個新的進程。啓動一個新進程並在另一個進程中運行長度操作。這可以讓您的服務器進程保持活動並響應其他請求,即使長時間運行的其他進程仍在處理其數據。

  2. 啓動足夠的羣集。使用您調查過的羣集,啓動比您期望的同時調用您的長時間運行過程更多的羣集。這樣可以始終存在至少一個可用於響應的集羣進程。有時,你無法預測這將會有多少,或者它會超過你實際創造的數量。

  3. 重新設計你的長期運行的進程來執行它的塊工作,控制返回塊之間的系統,這樣的node.js可以交錯其他工作也正在嘗試與長時間運行的工作要做。這裏是an example of processing a large array in chunks。這篇文章是爲瀏覽器編寫的,但是不會阻塞事件循環太久的概念在node.js中是一樣的。

  4. 加快長時間運行的任務。找到一種方法來加速長時間運行的作業,所以它不需要很長時間(使用緩存,不會一次返回如此多的結果,更快的方式來做,等等)。

  5. 創建N個工作進程(可能比您擁有的CPU數少一個工作進程)併爲長時間運行的任務創建一個工作隊列。然後,當長時間運行的請求進來時,將其插入工作隊列中。然後,每個工作進程可以自由處理隊列中的項目。當要求超過N個長期任務時,第一個將立即開始工作,後一個將在隊列中等待,直到有一個工作進程可用於處理它們。但是,最重要的是,您的主要node.js進程將保持自由並響應常規請求。

這最後一個選項是最簡單的,因爲它對任何長期運行的請求都有效,儘管所有的方案都可以幫助你。