带有Socket.IO的我的节点服务器在Nginx后面运行。我用Nginx负载均衡。客户端被定向到以下端口之一:
upstream nodes {
ip_hash;
server localhost:2000;
server localhost:3000;
server localhost:4000;
server localhost:5000;
}
我的节点服务器设置如下:
function server(port){
const http = require(`http`).createServer((req, res) => {
// http stuff ...
}.listen(port)
const io = require(`socket.io`)(http)
// socket stuff ...
}
server(2000)
server(3000)
server(4000)
server(5000)
Node是否在不同的核心上运行这些端口,或者我在这里负载平衡到底是什么?
套接字代码应该在服务器函数内部还是外部?
答案 0 :(得分:5)
您发布的代码将运行一台服务器,在一个CPU内核上提供四个端口。
然而,你可以运行四个独立的服务器,大概是四个核心,只需要很小的改动。将端口作为命令行参数传递:
public class A {
private String myField; //"private" means access to this is restricted
public String getMyField()
{
//include validation, logic, logging or whatever you like here
return this.myField;
}
public void setMyField(String value)
{
//include more logic
this.myField = value;
}
}
然后将它们作为:
启动function server(port){
const http = require(`http`).createServer((req, res) => {
// http stuff ...
}.listen(port)
const io = require(`socket.io`)(http)
// socket stuff ...
}
server(process.argv[2])
注意:Node.js实际上内置了集群功能。如果您想进一步探索群集,请阅读文档:https://nodejs.org/api/cluster.html
答案 1 :(得分:0)
不,它通常不会占用多个核心的显着优势。 node.js主要是单线程的。在同一个node.js进程中启动5个服务器不会再为您提供可以使用额外内核的线程或进程。如果您的port 2000服务器正在运行代码来处理请求,则您的其他服务器都不能同时运行代码。他们将不得不等到端口2000服务器将控制权交还给一个node.js线程。然后,另一台服务器可以获取请求并开始执行,其他所有服务器都必须等待它。
您可能感兴趣的是群集模块,它实际上会启动多个node.js进程(所有这些都做同样的事情),然后请求将被分发到不同的进程。您不需要nginx来使用此类型的群集,因为群集模块使用node.js软件完成所有操作。然后将一个服务器侦听器和传入请求分发到各个集群进程。
您可以在今天早些时候的其他答案中阅读更多相关内容,包括对一篇非常好的博客文章的介绍,该文章介绍了node.js群集的工作原理:
Node: one core, many processes
虽然您自己并不想要一个核心,但很多流程,但这个问题涵盖了很多架构问题。