【问题标题】:How to run Node Cluster on windows?如何在 Windows 上运行节点集群?
【发布时间】:2017-01-08 06:45:57
【问题描述】:

有人知道如何在 Windows 上运行 Node Cluster 吗?我在网上找不到任何文章,似乎无法解决这个问题:

events.js:160
      throw er; // Unhandled 'error' event
      ^

Error: write ENOTSUP
    at exports._errnoException (util.js:1007:11)
    at ChildProcess.target._send (internal/child_process.js:634:20)
    at ChildProcess.target.send (internal/child_process.js:521:19)
    at sendHelper (cluster.js:751:15)
    at send (cluster.js:534:12)
    at cluster.js:509:7
    at SharedHandle.add (cluster.js:99:3)
    at queryServer (cluster.js:501:12)
    at Worker.onmessage (cluster.js:449:7)
    at ChildProcess.<anonymous> (cluster.js:765:8)

还有代码……

if (cluster.isMaster) {
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
    cluster.on('online', (worker) => {
        console.log('Worker ' + worker.process.pid + ' is online');
    });
    cluster.on('exit', (worker, code, signal) => {
        console.log(`Worker ${worker.process.pid} died with code ${code} and signal ${signal}`);
    });
} else {
    console.log('else part ');
    openPort();
}

function openPort() {
    let server = dgram.createSocket('udp4');
    server.bind(port, host);
    server.on('message', processMessage);
}

【问题讨论】:

  • 这段代码对我有用 - 你的其余代码在哪里,你的 Node.js 版本是什么。
  • 你运行的是什么版本的 node.js。 This bug report 建议去年修复了该区域中 Windows 上的错误。我不确定该修复程序放入了哪些版本。
  • 另外,openPort() 是做什么的?
  • 在 Windows 上使用集群时,此类错误的根本原因似乎是在集群中使用了 UDP 套接字。您知道您是这样做还是使用使用 UDP 的库?如果是这样,似乎可以通过以适当的方式绑定 UDP 套接字来解决一些问题。如果你阅读this discussion,你会得到更多的细节。
  • 抱歉延迟回复。我编辑了代码以包含 openPort 函数。是的,它是UDP。节点版本也是 6.2.2。更重要的是它可以在 Linux 上用于生产,想知道是否有办法兼容两者? @jfriend00 那个链接好像是fixed the problem?谢谢。

标签: javascript node.js multithreading worker node-cluster


【解决方案1】:

在 v0.11.14(适用于 Linux 和 OSX)中添加了对 UDP 集群的支持。 检查 node.js master 上的file,上面写着“dgram clustering is current not supported on windows”

【讨论】:

  • 使用版本 6.2.2
  • Node 还不支持在 windows 上集群 dgram,更新我的答案详细信息。
  • 您知道除了 dgram 之外是否还有其他模块可以完成此任务?
  • 您只需要 UDP 吗?确切的用例是什么?
  • 仅传入 UDP,大约 100-1000 条消息/秒。
【解决方案2】:

在当前 node js 版本中,我使用下面的代码在 windows 上创建集群。

var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }


  cluster.on('exit', function(worker, code, signal) {
    console.log("worker ${worker.process.pid} died");
    cluster.fork();
  });
} else {
  var express = require('express');
  var http = require('http');

  // init app
  var app = express();

  function createServer(app) {
    return http.createServer(app);
  }

  app.locals.server = createServer(app);

  app.locals.server.listen(port, function() {
    console.info("server online");
  });
}

这将在同一端口上创建集群。

【讨论】:

  • 需要是udp端口
【解决方案3】:

所以,为了在 Windows 上使用 UDP 和 Node 集群,你必须像这样调用 server.bind:

server.bind({port: 1900, exclusive: true}, function () {
        console.log('PORT BIND SUCCESS');
        server.setBroadcast(true);
        server.setMulticastTTL(128);
        server.addMembership(multicastAddress, myIp);
    });

关键部分是将对象 {port: PORT, exclusive: true} 传递给绑定函数。我在这里找到了答案:https://github.com/misterdjules/node/commit/1a87a95d3d7ccc67fd74145c6f6714186e56f571

【讨论】:

  • 补充:只要您不绑定到 UDP 端口,Windows 上的集群就可以正常工作。如果这样做,您必须确保将“独占”属性指定为 true,就像 @Blighty 建议的那样。也因为每个集群都会尝试 bind() 到同一个端口,只有第一个会成功连接。其他人可能会抛出一个错误,指出该地址已在使用中(绑定 EADDRINUSE 0.0.0.0:5007)。处理错误,它应该可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2014-05-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2016-02-01
  • 2014-12-03
相关资源
最近更新 更多