使用Cluster多进程有没有办法共享内存缓存?
**jsGen**大量使用了内存缓存,开启Cluster多进程后,各进程进程之间是独立的,这个进程更新了数据缓存,那个进程却没有更新。有什么办法让各个进程共享内存缓存?
6 回复
有办法:不用Cluster
仅提供一个思路:在master进程初始化jsGen,worker进程通过message事件向master进程申请jsGen的api访问。写了个简单的例子,实际操作起来还要适当封装api,序列化参数等等
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
var info={counter:1}
for (var i = 0; i < numCPUs; i++) {
var worker=cluster.fork();
worker.on('message',function(msg){
info.counter++;
this.send(info);
}.bind(worker));
}
} else {
http.createServer(function(req, res) {
process.send('getInfo');
process.once('message',function(info){
res.writeHead(200);
res.end(info.counter+":hello world\n");
});
}).listen(8080);
}
个人是倾向于不用cluster的,非cpu密集运算的应用,多进程对nodejs性能提升甚微;退一步讲,就算要执行cpu密集运算,也可以通过child_process手工fork一个进程来单独执行。
主要是觉得message事件通信读写效率可能也不是很高。
看来要不放弃cluster,要不就是用Redis这样的内存数据库来代替内存缓存了,效率也会低很多。
最好还是Node.js原生实现可在各进程间共享的Buffer
单进程占用太多内存会影响性能吧。 缓存还是使用专门的缓存服务器吧
嗯,看来会要动大手术
redis当缓存?