2017-05-23 79 views
1

在我的node.js應用程序中,我有一個休息API,其中它有非常重的邏輯與循環,這需要超過7秒。未來循環次數可能會增加,並且時間會增加。使用羣集node.js rest api

爲了減少它的時間,我嘗試使用集羣。它根據提到的cpus no創建了一個單獨的工作人員。

但是在app.js頁面中實現了集羣之後,我發現其餘api已經採用了相同的時間。

我app.js頁:

// Include the cluster module 
var cluster = require('cluster'); 

// Code to run if we're in the master process 
if (cluster.isMaster) { 

    // Count the machine's CPUs 
    var cpuCount = require('os').cpus().length; 

    // Create a worker for each CPU 
    for (var i = 0; i < cpuCount; i += 1) { 
     cluster.fork(); 
    } 

    // Listen for dying workers 
    cluster.on('exit', function (worker) { 

     // Replace the dead worker, we're not sentimental 
     console.log('Worker %d died :(', worker.id); 
     cluster.fork(); 

    }); 

// Code to run if we're in a worker process 
} else { 
    var express = require('express'); 
    var app = express(); 

    var sampleApi = require('./controllers/restApi.js'); 
    app.post('/api/getResponse', sampleApi.getResponseMtd); 

    // Bind to a port 
    app.listen(8080); 
    console.log('Worker %d running!', cluster.worker.id); 
} 

我呼籲該服務是一個正常的服務連接蒙戈DB與循環的結果進行計算邏輯

難道集羣被用來處理無的請求是在特定的時間使用否的工作人員進行的,或者它將用於通過一個api服務(一次調用一次服務)來分割工作。

我想循環與服務中被分裂,並最終給出結果,以便所需的時間將減少。

請幫助解決關於羣集的這種混淆,以及如何使用羣集或任何其他方法來加速循環。

在此先感謝..

回答

0

據我所知,用於負載集羣balancing.Suppose 4個用戶在同一時刻訪問你的API,如果沒有集羣,一個單獨的線程將負責他們的服務請求。但是,如果有4名工人,每個線程將負責爲特定用戶的請求提供服務。

但集羣不能減少優化你的代碼

+0

感謝您的答覆..是否有任何其他模塊像羣集來處理循環過程中的API? – user3211705

+0

javascript是單線程的。你不能象在java中一樣創建線程來通過不同的進程執行你的代碼的不同部分 –

+0

你可以做的是,將你的服務與其他技術如python,java結合起來,這樣node.js只處理服務請求部分,但其他技術處理廣泛的計算部分 –

0

有很多的大約節點的入門級讀物你的邏輯帶到產生response.Try的時間。然而,關於節點事件循環的材料要少得多。

節點事件循環負責調度和執行節點中的所有異步操作。它是node.js唯一有效的線程模型,您需要在其限制內工作。

在node.js強加的限制中,您不能有長期存在的同步代碼。例如:序列化,加密,壓縮......任何需要大量輸入的操作都可能被阻塞,除非非常小心地執行。

事件循環中發生了什麼?

與您的代碼共享相同事件循環的一些操作包括:從套接字讀取/寫入,這是您在服務請求時發生的情況(例如:使用express)。

大多數應用程序協議都是基於TCP的,TCP是時間敏感的。如果TCP傳輸沒有及時完成,則會有重試(TCP重傳),並且在重新嘗試足夠的時間後,會出現連接超時。

如果向事件循環添加長期存活的任務,其他任務可能會超時。

如何防止阻塞事件循環?

您肯定可以將工作分配給多位工作人員以平衡負載。沒關係。但是,您還需要通過多個事件循環標記來分配工作,以確保其他任務不會遭受飢餓。

這意味着,在某一時刻你的邏輯將需要被分爲 塊,使用setImmediate執行每個塊允許的Node.js來恢復您的計算之前處理事件循環的其他任務。

如何分配工作?

它很大程度上取決於任務是什麼。您可以創建一個隊列,每個工作人員從中抽取工作。例如:與隊列如zmq,豆莖等

+0

用戶正在「循環」來自數據庫的結果數組以執行其計算。 setImmediate不解決問題以提高計算性能。它所要做的就是防止事件循環阻塞 –

+0

是的,這是一個好的開始。即使他將工作分佈在多個工作人員身上,阻塞問題依然存在。不幸的是,大多數人低估了阻止事件循環的嚴重性。緩慢的應用程序比崩潰的應用程序更好。一旦它不崩潰,讓它更快。 – arboreal84

+0

如何以非阻塞的方式執行操作確實很重要。但他的問題是關於循環的性能,而不是事件阻塞。 –