这会利用多个CPU内核吗?

时间:2016-08-11 02:06:51

标签: node.js sockets http nginx load-balancing

带有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是否在不同的核心上运行这些端口,或者我在这里负载平衡到底是什么?

套接字代码应该在服务器函数内部还是外部?

2 个答案:

答案 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

虽然您自己并不想要一个核心,但很多流程,但这个问题涵盖了很多架构问题。