【问题标题】:Will this take advantage of multiple CPU cores?这会利用多个 CPU 内核吗?
【发布时间】:2016-12-17 14:13:07
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您发布的代码将运行单个服务器,为单个 CPU 内核上的四个端口提供服务。

    但是,您可以在大概四个内核上运行四个独立的服务器,只需稍作改动。将端口作为命令行参数传递:

    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 index.js 2000 &
    node index.js 3000 &
    node index.js 4000 &
    node index.js 5000 &
    

    注意:Node.js 实际上内置了集群功能。如果您想进一步探索集群,请阅读文档:https://nodejs.org/api/cluster.html

    【讨论】:

      【解决方案2】:

      不,它通常不会充分利用多核。 node.js 主要是单线程的。在同一个 node.js 进程中启动 5 个服务器不会为您提供更多可以使用额外内核的线程或进程。如果您的 2000 端口服务器正在为请求服务运行代码,则您的其他服务器都不能同时运行代码。他们将不得不等到端口 2000 服务器将控制权交还给一个 node.js 线程。然后,另一台服务器可以收到请求并开始执行,所有其他服务器都必须等待它。

      您可能感兴趣的是集群模块,它实际上会启动多个 node.js 进程(都做同样的事情),然后请求将被分发到不同的进程。您不需要 nginx 来使用这种类型的集群,因为集群模块使用 node.js 软件完成所有工作。有一个服务器侦听器,然后将传入请求分发到各种集群进程。

      您可以在今天早些时候的另一个答案中阅读更多关于它的信息,包括对一篇非常好的博客文章的引用,该文章解释了 node.js 集群的工作原理:

      Node: one core, many processes

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

      【讨论】:

        猜你喜欢
        • 2014-04-13
        • 2019-05-12
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多