使用群集将自己的节点服务器扩展到多线程服务器

使用群集将自己的节点服务器扩展到多线程服务器
Nodejs的朋友知道节点是单线程的,也就是说,在8核CPU上运行,只能使用核动力。

单线程一直是对节点的批评,但是随着版本0.6中集群的引入,这种情况已经改变了。开发人员可以依靠集群将其节点服务扩展多线程服务器。

克拉斯特是什么

集群是由节点提供的多线程库。用户可以使用它来创建多个线程,在线程之间共享侦听端口。当对这个端口有外部请求时,集群会将请求转发给随机线程,因为每个节点线程占用几十兆字节的内存,所以它不能像PHP那样为每个请求创建线程。一般来说,创建的线程数不会超过CPU的核心数量。

复制代码代码如下所示:

VaR集群=需要('cluster);

var http =需要('http');

无功numcpus =需要('os)。CPU(长度);

如果(集群。是大师){

叉子/工人。

对于(var i = 0;i < numcpus;i++){

Cluster.fork();

}

Cluster.on('exit功能(工人、编码、信号){

console.log('worker + worker.process.pid +‘死');

});

{人}

可以共享任何TCP连接

在这种情况下,它是一个HTTP服务器

http.createserver(功能(REQ,RES){

(200)res.writehead;

res.end(你好世界;

}听(8000);

}
如上面的代码所示,cluster.ismaster将设置为true,当程序运行时。在调用cluster.fork(),程序将创建一个线程并再次运行它,当cluster.ismaster是假。我们使用这个变量来确定当前线程是否是一个子线程。

还可以注意到,每个子线程都是为了监听8000端口而不引起冲突的,这是集群共享端口的函数

线程间的通信

当线程被创建,他们不相互之间共享内存或数据。所有数据交流只能通过worker.send和worker.on主线程处理消息、处理),和广播系统的一个例子如下。

复制代码代码如下所示:

VaR集群=需要('cluster);

var http =需要('http');

无功numcpus =需要('os)。CPU(长度);

如果(集群。是大师){

var工作者= { };

新工

功能newworker(){

VaR的工人= cluster.fork();

如果类型监视器信息,广播,确定为广播

worker.on(消息功能(MSG){

如果(味精。型= = 'broadcast){

事件= msg.event VaR;

把这个发送给所有的工作者/广播

workers.foreach(功能(工人){)

worker.send(事件);

})

}

});

返回的工人;

}

对于(var i = 0;i < numcpus;i++){

Workers.push(newworker());

}

Cluster.on(online,功能(工人){

console.log('worker %d是在线的,工人身份);

})

{人}

VaR的工人= cluster.worker;

广播是将类型发送到广播,事件是广播内容。

广播=函数(事件){

worker.send({

类型:'broadcast,

事件:事件

});

}

/ /在worker.on似乎没有听返回的信息

process.on(消息功能(事件){

console.log('worker:+工人。ID + 'recived事件+事件。workerid);

})

发送广播

worker.broadcast({

网上的消息,

workerid:worker.id

})

}
应注意的问题

上面提到的线程不能共享数据,也就是,所有的数据交换只能通过线程之间的通信和数据交换。交换是可序列化的,所以功能,文件描述符,和HttpResponse无法通过。

如果使用集群,则需要考虑在编程时进行数据交换的问题。我自己的方式来存储所有这些数据的类似会议在redis,每个线程在访问和做好所有的数据没有放在节点存储器。

最后,集群现在被正式标记为节点作为实验状态,API可能在未来发生变化。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部