使用群集node.js rest api
在我的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服务(一次调用一次服务)来分割工作。
我想循环与服务中被分裂,并最终给出结果,以便所需的时间将减少。
请帮助解决关于群集的这种混淆,以及如何使用群集或任何其他方法来加速循环。
在此先感谢..
据我所知,用于负载集群balancing.Suppose 4个用户在同一时刻访问你的API,如果没有集群,一个单独的线程将负责他们的服务请求。但是,如果有4名工人,每个线程将负责为特定用户的请求提供服务。
但集群不能减少优化你的代码
有很多的大约节点的入门级读物你的逻辑带到产生response.Try的时间。然而,关于节点事件循环的材料要少得多。
节点事件循环负责调度和执行节点中的所有异步操作。它是node.js唯一有效的线程模型,您需要在其限制内工作。
在node.js强加的限制中,您不能有长期存在的同步代码。例如:序列化,加密,压缩......任何需要大量输入的操作都可能被阻塞,除非非常小心地执行。
事件循环中发生了什么?
与您的代码共享相同事件循环的一些操作包括:从套接字读取/写入,这是您在服务请求时发生的情况(例如:使用express)。
大多数应用程序协议都是基于TCP的,TCP是时间敏感的。如果TCP传输没有及时完成,则会有重试(TCP重传),并且在重新尝试足够的时间后,会出现连接超时。
如果向事件循环添加长期存活的任务,其他任务可能会超时。
如何防止阻塞事件循环?
您肯定可以将工作分配给多位工作人员以平衡负载。没关系。但是,您还需要通过多个事件循环标记来分配工作,以确保其他任务不会遭受饥饿。
这意味着,在某一时刻你的逻辑将需要被分为 块,使用setImmediate
执行每个块允许的Node.js来恢复您的计算之前处理事件循环的其他任务。
如何分配工作?
它很大程度上取决于任务是什么。您可以创建一个队列,每个工作人员从中抽取工作。例如:与队列如zmq,豆茎等
用户正在“循环”来自数据库的结果数组以执行其计算。 setImmediate不解决问题以提高计算性能。它所要做的就是防止事件循环阻塞 –
是的,这是一个好的开始。即使他将工作分布在多个工作人员身上,阻塞问题依然存在。不幸的是,大多数人低估了阻止事件循环的严重性。缓慢的应用程序比崩溃的应用程序更好。一旦它不崩溃,让它更快。 – arboreal84
如何以非阻塞的方式执行操作确实很重要。但他的问题是关于循环的性能,而不是事件阻塞。 –
感谢您的答复..是否有任何其他模块像群集来处理循环过程中的API? – user3211705
javascript是单线程的。你不能象在java中一样创建线程来通过不同的进程执行你的代码的不同部分 –
你可以做的是,将你的服务与其他技术如python,java结合起来,这样node.js只处理服务请求部分,但其他技术处理广泛的计算部分 –