簡體   English   中英

NodeJs App-重復工作-單個或多個子進程?

[英]NodeJs App - Repeated job - Single or multiple child processes?

我目前正在使用帶有REST API的node js應用程序開發,該API公開mongo數據庫中的數據。

應用程序需要通過調用外部服務每5分鍾更新一些數據(可能需要一分鍾以上的時間才能獲取新數據)。

我決定將此任務隔離到一個child_process中,但是我不確定該子進程中應該放置什么:

  • 僅要執行的功能。 時間表由主流程管理。
  • 具有一個獨立的進程,該進程每5分鍾自動刷新一次數據,並在每次刷新完成后向主進程發送一條消息。

我真的不知道每5分鍾啟動一個新的子進程是否花費很大,或者我應該只使用一個長時間運行的子進程,還是我對問題的想法過多了?

編輯-更新任務

更新任務可能需要一分鍾以上的時間,但它包含許多比異步運行更小的任務(從許多外部提供程序收集信息),我什至不需要子進程嗎?

謝謝 !

Node.js具有事件驅動的架構,能夠處理異步調用,因此它與典型的C ++程序不同,在C ++程序中,您將使用多線程/進程架構。

對於您的用例,我在想,也許您可​​以利用setInterval重復執行一個操作,您可以通過使用諸如bluebirdJS類的promises框架來定義更小的異步調用。

有關更多信息,請參見:

setIntervalhttps : //developer.mozilla.org/zh-CN/docs/Web/API/WindowTimers/setInterval

setInterval()

重復調用函數或執行代碼段,每次調用之間有固定的時間延遲。 返回一個intervalID。

樣例代碼:

setInterval(function() {
    console.log("I was executed"); 
}, MILLISECONDS_IN_FIVE_MINUTE);

承諾http : //bluebirdjs.com/docs/features.html

樣例代碼:

new Promise(function(resolve, reject) {
  updateExternalService(data)
    .then(function(response) {
        return this.parseExtResp(response);  
    })
    .then(function(parsedResp) {
        return this.refreshData(parsedResp);
    })
    .then(function(returnCode) {
        console.log("yay updated external data source and refreshed");
        return resolve();
    })
    .catch(function(error) {
        // Handle error
        console.log("oops something went wrong ->" + error.message);
        return reject();
    });
  }

這取決於您的應用程序與自動刷新任務之間的凝聚力。

如果自動刷新任務可以獨立運行,而無需與您的應用程序交互,那么最好將任務作為一個新進程啟動。 直接使用child_process不是一個好主意,spawn / monitor / respawn子進程很棘手,可以使用crontab或pm2對其進行管理。

如果自動刷新任務取決於您的應用程序,則可以直接使用child_process,向其發送消息以安排日程。 但是,首先嘗試打破這種依賴性,這將簡化您的應用程序,易於部署和單獨維護。 子進程運行很長時間,或者一槍不成問題,直到在一台計算機上運行數百個這樣的任務。

只要您使用異步請求,從外部服務獲取數據的總時鍾時間都沒有關系。 重要的是您要使用多少CPU。 如果大多數時間都在等待外部服務響應或發送數據,則您的node.js服務器大部分時間只是處於空閑狀態,因此您可能不需要子進程。

由於node.js是異步的,因此它可以很高興地擁有許多正在等待響應的“正在運行”的打開請求,而這些請求只占用很少的系統資源。

由於node.js是單線程的,因此通常是CPU使用率推動了對子進程的需求。 如果從外部服務獲得響應需要5分鍾,但是處理該請求並對其進行處理僅花費了50ms的實際CPU時間,那么您可能不需要子進程。

如果是我,我會將與外部服務進行通信的代碼分離到其自己的模塊中,但是直到您確實有一些需要進行此更改的數據時,我才添加子進程的復雜性。


我真的不知道每5分鍾啟動一個新的子進程是否花費很大,或者我是否應該僅使用一個長時間運行的子進程,或者我是否對此問題進行了過多思考?

啟動新的子進程肯定要花一些錢。 它不是很大,但是如果您每5分鍾要做一次,並且不需要占用大量內存,那么最好只啟動一次子進程,讓它管理與完全依靠外部服務,然后可以根據需要將結果傳遞回您的其他node.js進程。 這使第二節點進程更加獨立,並且兩個進程之間的唯一交互點是傳達更新信息。 職能和責任的這種分離通常被認為是一件好事。 在多開發人員項目中,您可以更輕松地讓不同的開發人員在每個應用程序上工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM